【问题标题】: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,但我发现当某些东西不起作用时没有出现错误非常令人沮丧。

【问题讨论】:

    标签: python kivy screen


    【解决方案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 上设置的。

    【讨论】:

    • 这行得通,但您能解释一下添加名称如何解决问题吗?我什至在代码中的任何地方都没有看到这些名称。
    • 我只能回显documentationWhen you are creating a screen, you absolutely need to give a name to it(以粗体显示)。
    猜你喜欢
    • 2021-12-21
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多