在我的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,即不透明。在下面的示例中,为了显示绘制的线条,我在opacity = 0.5下添加了TabbedPanel

层次/路径

Kv language » Rule context


  以下是针对Kv语言的三个关键字:
  
  app:始终引用您的应用程序的实例。
  
  root:指当前规则中的基本小部件/模板
  
  self:始终引用当前小部件


Value Expressions, on_property Expressions, ids, and Reserved Keywords


  自
  
  关键字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



Binding Python code to object created in kv file

方法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


方法2


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"


输出量

python - Kivy-如何找出.kv文件中Widget的路径-LMLPHP

关于python - Kivy-如何找出.kv文件中Widget的路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55136666/

10-12 18:02