【问题标题】:Kivy class in .py and .kv interaction 2.py 和 .kv 交互中的 Kivy 类 2
【发布时间】:2015-04-30 21:54:58
【问题描述】:

从Kivy class in .py and .kv interaction 跟进,但更复杂。

Here 是我正在写的完整代码:

data/screens/learnkanji_want.kv 有我想要的代码,但我不完全理解 KanjiOriginScreen() 类如何发挥它的作用在屏幕管理中。

data/screens/learnkanji.kv 可以按我的意愿工作,但要使其工作,我必须将 keyb_height 放入课堂 KanjiOriginScreen()(ma​​in.py)。但是,我希望该代码在 LayoutFunction() 类中(learnkanji.py)。

问题

如何将keyb_height 放入函数LayoutFunction() 并在<LayoutFunction> 的.kv 文件中访问它?

您能否解释一下为什么在没有< > 的情况下可以将KanjiOriginScreen: 放入learnkanji.kv 并且程序仍然认为它应该使用它?

如果有什么不清楚的,请询问:)

编辑

我发现我没有在learnkanji.kv文件中导入learnkanji.py,导致它找不到'LayoutFunction'类。

#:import learnkanji data.screens.learnkanji

【问题讨论】:

  • 能把相关代码贴在这里吗?对于读者来说,这比浏览 github 页面更容易。
  • @inclement 我把相关代码放在第一句提到的问题中,但似乎代码不够,这就是为什么这个后续问题。

标签: python class kivy


【解决方案1】:

回答您的问题:

  1. 您的工作方式应该可行。您应该能够从 kv 访问对象属性。但是,如果您的属性要更改,并且您希望 UI 在更改时进行更新,则应使用 Kivy 属性。如果它是常量,则普通属性可以正常工作。

  2. 从Kivy Docs 开始,<Widget>: 是一个类规则,将应用于该类的每个实例。 Widget: 将创建该类的实际 instance(在这种情况下,它是您的根小部件)。

至于 ScreenManager 和 Screens,你可以这样想。每个屏幕都是它自己的独立 UI(它自己的根小部件)。屏幕管理器是一个容器,可以容纳您的屏幕,并且可以在不同的屏幕之间进行交换。这使您可以创建可以在它们之间切换的单独 UI。每个 UI 都是一个单独的小部件树,其根部有一个 Screen。 docs 其实很擅长描述 ScreenManager。

【讨论】:

    【解决方案2】:

    如何将 keyb_height 放入函数 LayoutFunction() 并在 .kv 文件中访问它?

    你不能用函数来做到这一点。您需要将 LayoutFunction 设置为 class 才能执行此操作。像这样:

    ma​​in.py

    class LayoutClass(BoxLayout): # I made it a boxlayout, you could make it anything you want
    
        keyb_height = NumericProperty(260) # from kivy.properties import NumericProperty
    

    kv 文件:

    <LayoutClass>: # can only access it this way if it's a class in main.py
    
        something: root.keyb_height
    

    您能否解释一下为什么 KanjiOriginScreen: 可以在没有 的情况下放入 learnkanji.kv 并且程序仍然认为它应该使用它?

    听起来您在问如何实现这一目标.. 但我想不出为什么? 除非您希望它由ScreenManager 管理?但是,在没有 &lt;&gt; 的情况下,在 kv 文件中拥有 KanjiOriginScreen 的唯一方法是它位于另一个根小部件中。例如,请参阅Testy 和ScreenTwo,因为它们位于我对您的其他问题的回答中&lt;Manager&gt; 下的kv 文件中(here)。它们没有&lt;&gt;,因为它们是类实例,在另一个类(Manager 类)中。在 kv 文件中,只有根小部件在它们周围有 &lt;&gt;。如果这些对你来说都没有意义,你需要做一个关于 kivy 的教程。

    查看 this tutorial 我前一阵子,它解释了一些关于 kv 中的根小部件(在 4.30 左右)。

    【讨论】:

    • 我已经在 learnkanji.py (LayoutFunction) 中创建了该类,但不知何故我必须在 KanjiOriginScreen() 中的屏幕管理器中获取它b>main.py。我知道没有 必须在一个类中,但这就是为什么在 learnkanji.kv 中 KanjiOriginScreen 在没有 并且没有缩进并且仍然有效的情况下被调用的原因。 (Github中的代码和之前的问题代码有点不一样,请看一下)。
    【解决方案3】:

    抱歉,我的问题不清楚,但在 IRC 上 #Kivy 的帮助下,我得到了以下结果:

    learnkanji.py

    class LayoutFunctioning(BoxLayout):
        keyb_height = NumericProperty(260)
    

    learnkanji.kv

    KanjiOriginScreen:
        name: 'LearnKanji'
        fullscreen: True
    
        LayoutFunction:
            id: lfunc
            #...code...
            height: lfunc.keyb_height #Instead of root.keyb_height
    

    现在我了解了如何使用 id,我可以使用 lfunc 在 LayoutFunction() 中调用我的代码 :)

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 1970-01-01
      • 2021-02-06
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2015-08-16
      相关资源
      最近更新 更多