为啥 kivy 应用程序中不显示下一个屏幕?

Posted

技术标签:

【中文标题】为啥 kivy 应用程序中不显示下一个屏幕?【英文标题】:Why doesn't the next screen show up in kivy app?为什么 kivy 应用程序中不显示下一个屏幕? 【发布时间】:2020-02-21 01:29:19 【问题描述】:

我期待以下 kivy 应用程序在我按下然后释放按钮时切换屏幕,但没有任何反应,终端上也没有错误。当我运行应用程序时,会显示 GirisEkrani 屏幕,然后当我按下并释放 GirisEkrani 中的按钮时,应该会显示下一个屏幕 (GirisEkrani2)。你如何做到这一点?

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

Builder.load_string("""
<ekranApp>
    GirisEkrani:
        id: ge
        Button:
            text: "İleri"
            on_release: ge.manager.current = ge.manager.next()

    GirisEkrani2:
        Button:
            id: ge2
            text: "Ileri 2"
            on_release: ge2.manager.current = ge2.manager.next()

    KontrolEkrani:
        id: ke
        Button:
            text: "Geri"
            on_release: ke.manager.current = ke.manager.previous()
""")
class GirisEkrani(Screen):
    pass

class GirisEkrani2(Screen):
    pass

class KontrolEkrani(Screen):
    pass

class ekranApp(App, ScreenManager):
    def build(self):
        #root = ScreenManager()
        #root.add_widget(GirisEkrani(name = "giris_ekrani"))        
        #root.add_widget(GirisEkrani2(name = "giris_ekrani2"))
        #root.add_widget(KontrolEkrani(name = "kontrol_ekrani"))
        return self

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

虽然人们似乎提倡使用 .kv 文件而不是使用纯 Python,但我发现当某些东西不起作用时没有出现错误非常令人沮丧。

【问题讨论】:

【参考方案1】:

Appbuild() 方法预计会返回 Widget,这将是您的 AppWidget 树的根,但您的返回 App 本身。我怀疑这会导致问题。但是,您的代码不起作用,因为您没有设置 Screens 的名称。这是您的kv 的更正版本:

Builder.load_string("""
<ekranApp>:
    GirisEkrani:
        id: ge
        name: "giris_ekrani"
        Button:
            text: "İleri"
            on_release: ge.manager.current = ge.manager.next()

    GirisEkrani2:
        id: ge2
        name: "giris_ekrani2"
        Button:
            text: "Ileri 2"
            on_release: ge2.manager.current = ge2.manager.next()

    KontrolEkrani:
        id: ke
        name: "kontrol_ekrani"
        Button:
            text: "Geri"
            on_release: ke.manager.current = ke.manager.previous()
""")

另外,GirisEkrani2id 实际上是在 Button 上设置的。

【讨论】:

这行得通,但您能解释一下添加名称如何解决问题吗?我什至在代码中的任何地方都没有看到这些名称。 我只能回显documentation:When you are creating a screen, you absolutely need to give a name to it(以粗体显示)。

以上是关于为啥 kivy 应用程序中不显示下一个屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像

如何在其他屏幕kivy中显示情节

Python Kivy - 在另一个屏幕上显示动态结果

无法用kivy显示图像

我的 sm.current(sm 是 WindowManager 的对象)似乎在 Kivy 中不起作用

为啥在android中的应用程序后不显示?