为啥 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】:App
的 build()
方法预计会返回 Widget
,这将是您的 App
的 Widget
树的根,但您的返回 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()
""")
另外,GirisEkrani2
的 id
实际上是在 Button
上设置的。
【讨论】:
这行得通,但您能解释一下添加名称如何解决问题吗?我什至在代码中的任何地方都没有看到这些名称。 我只能回显documentation:When you are creating a screen, you absolutely need to give a name to it
(以粗体显示)。以上是关于为啥 kivy 应用程序中不显示下一个屏幕?的主要内容,如果未能解决你的问题,请参考以下文章
创建一个 kivy 应用程序以在一个屏幕上接收用户的输入并在另一个屏幕上显示这些图像