簡體   English   中英

如何在python中引用Kivy Canvas

[英]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.afterwith 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM