簡體   English   中英

Kivy-如何確定.kv文件中Widget的路徑

[英]Kivy - how do I figure out the path to Widget in .kv file

在我的python代碼中,我能夠通過使用self.canvas.before在.kv文件中定義的Widget中畫一條線。

然后,在.kv中,我將Widget移至TabbedPanelItem內,但現在無法正常工作。

self.canvas.before不是正確的路徑,我應該改用什么? 正確的路徑是什么?

通常,我如何確定層次結構? .kv文件中的那些對象是由構建器創建的(如果我的理解是正確的),我如何確定如何將python代碼綁定到由構建器創建的對象。 感謝您的任何幫助。

main.py:

class SampBoxLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(SampBoxLayout, self).__init__(**kwargs)
        with self.canvas.before:
            self.myline=Line(points=(100,100,400,500), close=False, width=2)

主.kv

SampBoxLayout:
<SampBoxLayout>:
    orientation: "vertical"
    padding: 0
    spacing: 0
    TabbedPanel:
        do_default_tab: False
        TabbedPanelItem:
            text: "noc_clk"
            BoxLayout:
                orientation: "vertical"
                Widget:
                    height: "440dp"
                    size_hint_y: None
                    canvas:
                        Color:
                            rgba: 0, 0, 0, 0.5
                TabbedPanel:
                    do_default_tab: False
                    TabbedPanelItem:
                        text: "Node0"
                        BoxLayout:
                            orientation: "horizontal"

實際上,即使添加了kv文件,您的應用仍然可以正常運行。 這條線是在SampBoxLayout的畫布上繪制的,但是它不可見,因為每個小部件的不透明度為1.0,即不透明。 在下面的示例中,為了顯示繪制的線條,我在TabbedPanel下添加了opacity = 0.5

層次/路徑

Kv語言»規則上下文

以下是針對Kv語言的三個關鍵字:

app :始終引用您的應用程序的實例。

root :指當前規則中的基本小部件/模板

self :始終引用當前小部件

值表達式,on_property表達式,id和保留關鍵字

關鍵字self引用“當前小部件實例”:

 Button: text: 'My state is %s' % self.state 

此關鍵字僅在規則定義中可用,並且表示規則的根窗口小部件(規則的第一個實例):

 <MyWidget>: custom: 'Hello world' Button: text: root.custom 

應用程式

此關鍵字始終引用您的應用實例。 這等效於在Python中調用kivy.app.App.get_running_app()

 Label: text: app.name 

將Python代碼綁定到kv文件中創建的對象

方法1

  • 在類級別聲明一個ObjectProperty並將其連接到在kv文件中創建的對象的id 這是最佳做法。

main.py

from kivy.properties import ObjectProperty


class SampBoxLayout(BoxLayout):
    tp = ObjectProperty(None)

主.kv

<SampBoxLayout>:
    tp: tp
    orientation: "vertical"
    padding: 0
    spacing: 0

    TabbedPanel:
        id: tp
        opacity: 0.5

方法二

  • id添加到在kv文件中創建的對象,並使用self.ids.id-nameself.ids['id-name']

最佳實踐和速度

注意

盡管self.ids方法非常簡潔,但是使用ObjectProperty通常被視為“最佳實踐”。 這將創建直接引用,提供更快的訪問權限,並且更加明確。

main.py

from kivy.base import runTouchApp
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import Line
from kivy.lang import Builder


class SampBoxLayout(BoxLayout):
    def __init__(self, **kwargs):
        super(SampBoxLayout, self).__init__(**kwargs)
        with self.canvas.before:
            self.myline=Line(points=(100, 100, 400, 500), close=False, width=2)


if __name__ == "__main__":
    runTouchApp(Builder.load_file('main.kv'))

主.kv

SampBoxLayout:
<SampBoxLayout>:
    orientation: "vertical"
    padding: 0
    spacing: 0

    TabbedPanel:
        opacity: 0.5
        do_default_tab: False

        TabbedPanelItem:
            text: "noc_clk"
            BoxLayout:
                orientation: "vertical"
                Widget:
                    height: "440dp"
                    size_hint_y: None
                    canvas:
                        Color:
                            rgba: 0, 0, 0, 0.5
                TabbedPanel:
                    do_default_tab: False
                    TabbedPanelItem:
                        text: "Node0"
                        BoxLayout:
                            orientation: "horizontal"

輸出量

畫線

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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