0
点赞
收藏
分享

微信扫一扫

kivy 画布 canvas 的 其他操作


Kivy是一个开源的Python库,用于创建基于触摸屏的应用程序。其中最常用的是Canvas。Canvas是Kivy中的一个内置类,用于创建可交互的绘图。

平移:

要平移Canvas,您可以使用translate()函数。该函数接受两个参数:x,y轴的位移。这将在x轴上移动画布的所有点,然后在y轴上移动它们。下面是一个示例:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Rectangle

class CanvasWidget(Widget):
    
    def __init__(self, **kwargs):
        super(CanvasWidget, self).__init__(**kwargs)

        with self.canvas:
            Color(0, 1, 0, 1) #绿色
            self.rect = Rectangle(pos=self.pos, size=(50, 50))

    def on_touch_down(self, touch):
        self.translate_canvas(touch)

    def translate_canvas(self, touch):
        self.canvas.translate(touch.dx, touch.dy)python

在这个例子中,我们创建了一个CanvasWidget类,使用它的canvas属性画了一个矩形。然后我们准备捕获用户的触摸事件。当用户按下屏幕时,我们调用translate_canvas() 函数来移动Canvas的位置。

缩放:

要缩放Canvas,您可以使用scale()函数。该函数接受一个参数:缩放比例。下面是一个示例:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Rectangle

class CanvasWidget(Widget):
    
    def __init__(self, **kwargs):
        super(CanvasWidget, self).__init__(**kwargs)

        with self.canvas:
            Color(0, 1, 0, 1) #绿色
            self.rect = Rectangle(pos=self.pos, size=(50, 50))

    def on_touch_down(self, touch):
        self.scale_canvas(touch)

    def scale_canvas(self, touch):
        scale_factor = 1.1
        if touch.scale > 1:
            # 放大canvas
            self.canvas.scale(scale_factor, scale_factor)
        else:
            # 缩小canvas
            self.canvas.scale(1/scale_factor, 1/scale_factor)python

在这个例子中,我们还是使用 CanvasWidget 类中的 canvas 属性画了一个矩形。我们使用了on_touch_down()函数来捕获用户的触摸事件,并将其传递给scale_canvas()函数。如果用户将两个手指挤在一起(缩小),那么我们按照scale_factor来缩小canvas。如果用户将两个手指分开(放大),那么我们按照scale_factor来放大canvas。

<MyImage@Image>
    source:"1002.png"
    pos:self.parent.pos
    size_hint:.5,.4
    canvas:
        PushMatrix
        Rotate:
            axis:0,0,1
            angle:-60
            origin:self.center
        Color:
            rgba:1,0,0,0.5
        Line:
            rectangle:self.x,self.y,self.width,self.height
        PopMatrix

<GridLayoutW>:
    cols:2
    canvas:
        Color:
            rgba:1,1,1,1
        Rectangle:
            pos:self.pos
            size:self.size
    Button:
        text:"col:1,row:1"
    FloatLayout:
        MyImage:
    Button:
        text:"col:1,row:2"

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.core.text import  LabelBase
LabelBase.register("Roboto","HelloKitty.TTF")


class GridLayoutW(GridLayout):
    def __init__(self):
        super(GridLayoutW, self).__init__()
        # self.join = Button(text="hello world")
        # self.add_widget(self.join)


class CanvasApp(App):
    def __init__(self):
        super(CanvasApp, self).__init__()

    def build(self):
        return GridLayoutW()

if __name__ == '__main__':
    CanvasApp().run()

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.core.text import  LabelBase
LabelBase.register("Roboto","HelloKitty.TTF")


class BoxLayoutW(BoxLayout):
    def __init__(self):
        super(BoxLayoutW, self).__init__()
        # self.join = Button(text="hello world")
        # self.add_widget(self.join)


class CanvasApp(App):
    def __init__(self):
        super(CanvasApp, self).__init__()

    def build(self):
        return BoxLayoutW()

if __name__ == '__main__':
    CanvasApp().run()

<MyImage@Image>
    source:"1002.png"
    pos:self.parent.pos
    size_hint:.5,.4
    canvas:
        PushMatrix
        Translate:
            x:-100
            y:200
            z:0
        Color:
            rgba:1,0,0,0.5
        Line:
            rectangle:self.x,self.y,self.width,self.height
        PopMatrix

<BoxLayoutW>:
    cols:2
    canvas:
        Color:
            rgba:1,1,1,1
        Rectangle:
            pos:self.pos
            size:self.size
    Button:
        text:"col:1,row:1"
    FloatLayout:
        MyImage:
    Button:
        text:"col:1,row:2"

举报

相关推荐

0 条评论