[英]How to reference a Kivy Canvas in python
如果用戶界面是在kv中構建的,那么如何引用Kivy Canvas從python文件進行繪制,例如,這是我的.py:
# canvasCallApp.py...
from kivy.app import App
class canvasCallApp(App):
pass
if __name__ == '__main__':
canvasCallApp().run()
而我的.kv:
# canvasCallApp.kv...
BoxLayout:
id: left_box
canvas:
Color:
rgb: 0.6, 0.6, 0.6
Rectangle:
pos: self.pos
size: self.size
Widget:
size_hint_x: None
width: left_box.width - right_box.width
BoxLayout:
width: 200
id: right_box
Button:
text: 'I ma a button'
產生:
如何從python到left_box
的畫布以進行繪圖? 無法從文檔中弄清楚。
如果您願意動態更改畫布的顏色或尺寸,
我建議使用Kivy Properties。
這是代碼。
from kivy.properties import ListProperty
from kivy.lang import Builder
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class RootLayout(BoxLayout):
canvas_color = ListProperty([0, 1, 1])
class canvasCallApp(App):
def build(self):
return kv
kv = Builder.load_string('''
RootLayout:
id: left_box
canvas:
Color:
rgb: root.canvas_color
Rectangle:
pos: self.pos
size: self.size
Widget:
size_hint_x: None
width: left_box.width - right_box.width
BoxLayout:
width: 200
id: right_box
Button:
text: 'I ma a button'
''')
if __name__ == '__main__':
canvasCallApp().run()
我還建議使用RootLayout
,它可以更容易地通過root.variable_name
從python代碼引用變量。
如果要更改畫布的背景,還可以將kivy代碼更改為
canvas:
Color:
rgb: root.canvas_color
Rectangle:
pos: self.pos
size: self.size
source: root.image_path
這樣,您可以從kivy.properties
導入StringProperty
並應用相同的內容。 隨着image_path
的值更改,背景會自動更改。
如果要直接訪問畫布以重繪畫布,則可以with canvas
使用
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Rectangle, Color
class SomeBoxLayout(BoxLayout)
def __init__(self, **kwargs):
super(SomeBoxLayout, self).__init__(**kwargs)
with self.canvas:
Color(1, 0, 0, 1) # set the color to red
self.rect = Rectangle(pos=self.center,
size=(self.width/2.,
self.height/2.))
def redraw(self):
self.canvas.clear()
with self.canvas:
Color(0, 0, 1, 1) # set the color to blue
self.rect = Rectangle(pos=self.center,
size=(self.width/2.,
self.height/2.))
請注意,在再次繪制內容之前,應先做canvas.clear()
。
另外,您可以with self.canvas.before
或之后with self.canvas.after
。 with self.canvas.after
使用。
我選擇放棄單獨的kivy語言,並全部在python中完成,這需要嵌套一些小部件以實現正確的布局,更重要的是創建,綁定和初始化一個小部件/畫布對象,我們以后可以參考:
# canvasTest.py...
from kivy.app import App
from kivy.graphics import Rectangle
from kivy.graphics import Color
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from random import random as r
class rootCanvas(Widget):
def __init__(self, **kwargs):
super(rootCanvas, self).__init__(**kwargs)
with self.canvas:
Color(r(), 1, 1, mode='hsv')
self.rect = Rectangle(pos=self.pos, size=self.size)
self.bind(pos=self.update_rect)
self.bind(size=self.update_rect)
def update_rect(self, *args):
self.rect.pos = self.pos
self.rect.size = (self.size[0], self.size[1])
def change_color(self, *args):
with self.canvas:
Color(r(), 1, 1, mode='hsv')
self.rect = Rectangle(pos=self.pos, size=self.size)
class canvasTest(App):
def build(self):
root = BoxLayout()
sideBar = BoxLayout(size=(200, 100), size_hint=(None, 1))
widget = rootCanvas()
root.add_widget(widget)
btn_1 = Button(
text='Change Canvas Color',
width=200,
on_press=widget.change_color)
sideBar.add_widget(btn_1)
root.add_widget(sideBar)
return root
if __name__ == '__main__':
canvasTest().run()
結果是:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.