【问题标题】:Kivy class in .py and .kv interaction.py 和 .kv 交互中的 Kivy 类
【发布时间】:2015-07-10 05:10:48
【问题描述】:

我没有完全理解 python 文件中的类和 kivy 语言是如何交互的。我目前正在修改 Kivy 的 Showcase 示例以增加我的理解。

文件结构

  • main.py
  • showcase.kv
  • data/screens/test.kv

main.py

class Testy(BoxLayout):
    ttext = 'Bla'
    #other code

class ShowcaseScreen(Screen):
    fullscreen = BooleanProperty(False)

    def add_widget(self, *args):
        if 'content' in self.ids:
            return self.ids.content.add_widget(*args)
        return super(ShowcaseScreen, self).add_widget(*args)


class ShowcaseApp(App):
    #code

test.kv

<Testy>:
    orientation: 'vertical'

    Label:
        text: root.ttext

ShowcaseScreen:
    name: 'LearnKanji'
    fullscreen: True
    #Some ref to <Testy>

问题

我想将我的代码放在 Testy() 中,因为我打算编写大量代码来针对单个屏幕中发生的情况,并且我不想让 ShowcaseScreen() 变得混乱,因为 ShowcaseScreen 也意味着用于其他屏幕。

为了澄清,在 test.kv 中我指的是变量 ttext。如果我没有创建类 Testy() 我会这样说:

ShowcaseScreen:
    name: 'LearnKanji'
    fullscreen: True
    BoxLayout:
        text: root.ttext

然后在 main.py 我需要放

class ShowcaseScreen(Screen):
    ttext = 'Bla'

但是,由于除了 Testy 之外的许多屏幕都使用 ShowcaseScreen() 类,因此将所有屏幕的所有代码都放在这里会变得一团糟。因此,我希望每个屏幕的代码在一个单独的类中。我认为这对于更大的代码项目来说是一种更好的方式。

那么在test.kv文件中调用ShowcaseScreen:后怎么引用呢?这样我就可以将用于 Testy 的代码放在 Testy() 中,并使我的文件和类更有条理。

跟进问题:Kivy class in .py and .kv interaction 2

【问题讨论】:

  • 能否请您重新表述您的实际问题?我觉得这里有一个很好的问题,但就目前而言,我很难理解它。
  • 我并不太清楚自己到底想要什么,所以很难正确表述,但我希望现在通过这个编辑更清楚。
  • 猜想,您想通过代码控制元素,但让kv 尽可能简单明了?您可能想改用ScreenManager,只需定义容器屏幕,并使用代码管理元素。

标签: python class kivy


【解决方案1】:

您可以使用ScreenManager。看看这里,我更改了您的一些代码以提供使用 ScreenManager 将每个屏幕的代码分离到它们自己的类中的示例。如果这有问题,请告诉我。

ma​​in.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.properties import ObjectProperty


class Testy(Screen):

    ttext = 'Screen 2'
    #other code

class ScreenTwo(Screen):
    pass

class Manager(ScreenManager):

    testy = ObjectProperty(None)
    screen_2 = ObjectProperty(None)


class ShowcaseApp(App):

    def build(self):
        return Manager(transition=FadeTransition())

if __name__ == "__main__":
    ShowcaseApp().run()

kv 文件:

<Testy>:
    BoxLayout:
        Button:
            text: root.ttext
            on_press: root.manager.current = "screen_two"

<ScreenTwo>:
    BoxLayout:
        Button:
            text: "Screen 1"
            on_press: root.manager.current = "testy_screen"


<Manager>:
    id: screen_manager

    testy: testy
    screen_2: screen_2

    Testy:
        id: testy
        name: 'testy_screen'
        manager: screen_manager

    ScreenTwo:
        id: screen_2
        name: 'screen_two'
        manager: screen_manager

【讨论】:

  • @NumesSanguis 你提供的那个链接让我直接回到这个页面。还有其他问题吗?
  • 这是一个很好的例子,说明我提供了多少信息,这就是我选择它作为正确答案的原因。 Showcase 代码虽然有点复杂,但我并不完全理解它是如何工作的。这就是为什么我提出了一个新问题,给出了我所拥有的完整代码:stackoverflow.com/questions/29978507/…,请看看你是否可以帮助我:) 更新链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2015-08-16
相关资源
最近更新 更多