[英]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語言的三個關鍵字:
app :始終引用您的應用程序的實例。
root :指當前規則中的基本小部件/模板
self :始終引用當前小部件
自
關鍵字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
id
。 這是最佳做法。 from kivy.properties import ObjectProperty
class SampBoxLayout(BoxLayout):
tp = ObjectProperty(None)
<SampBoxLayout>:
tp: tp
orientation: "vertical"
padding: 0
spacing: 0
TabbedPanel:
id: tp
opacity: 0.5
id
添加到在kv文件中創建的對象,並使用self.ids.id-name
或self.ids['id-name']
注意
盡管self.ids方法非常簡潔,但是使用ObjectProperty通常被視為“最佳實踐”。 這將創建直接引用,提供更快的訪問權限,並且更加明確。
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'))
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.