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"