在 Kivy for Python 中,我想知道如何安排屏幕在指定的秒数后自动转换到新屏幕。我使用 Kivy Clock 工具安排了一个事件,但当我运行应用程序时,它对我的代码没有响应。这是我的 main.py 代码:
class Opening_Screen():
def __init__(self, **kwargs):
super(Opening_Screen, self).__init__(**kwargs)
Clock.schedule_once(self.change_screen, 5)
def change_screen(self, *kwargs):
root.current = 'Options_Screen'
class Patient_Care(App):
pass
if __name__ == '__main__':
Patient_Care().run()
这是我相应的.kv文件代码:
#:import C kivy.utils.get_color_from_hex
#:import RiseInTransition kivy.uix.screenmanager.RiseInTransition
ScreenManager:
transition: RiseInTransition()
Screen:
name: 'Opening_Screen'
Label:
text:'Welcome'
font_size: 40
color: 0, 0, 1, 1
pos:(self.x / 2, 250)
Button:
size_hint: (1, None)
height: 90
font_size: 30
background_normal: 'button_normal.png'
background_down: 'button_down.png'
border: (2, 2, 2, 2)
text: 'Continue'
on_press: root.current = 'Options_Screen'
Screen:
name: 'Options_Screen'
GridLayout:
padding: 15
rows: 5
spacing: 10
Button:
text:'Option 1'
Button:
text:'Option 2'
Button:
text: 'Option 3'
Button:
text: 'Option 4'
Button:
text: 'Option 5'
在我的 .kv 文件中,我有另一个屏幕,称为“Options_Screen”。我想在 5 秒后从“Opening_Screen”切换到选项屏幕。当我为 Opening_Screen 创建一个按钮并将其设计为切换到 Options_Screen (on_press: root.current = 'Options_Screen') 时,该转换起作用。但是,我的目标是使用 Clock.schedule_once 函数动态切换,无需按下按钮即可自动切换。
最佳答案
由于您没有显示重现错误所需的代码,例如应用程序必须以 App 结尾,并且 .kv 的名称必须是小写的类的其余部分。另一个可能的错误是 Opening_Screen 不继承任何类型,因此它可能永远不会被调用,等等。
所以我只提供一个例子:
病人护理.kv
ScreenManager
Opening_Screen:
name: 'Opening_Screen'
Options_Screen:
name: 'Options_Screen'
<Opening_Screen>:
BoxLayout:
orientation: 'vertical'
Label:
text: 'Opening_Screen'
<Options_Screen>:
BoxLayout:
orientation: 'vertical'
Label:
text: 'Options_Screen'
main.py
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock
class Opening_Screen(Screen):
def __init__(self, **kwargs):
super(Opening_Screen, self).__init__(**kwargs)
Clock.schedule_once(self.change_screen, 5)
def change_screen(self, *kwargs):
self.manager.current = 'Options_Screen'
class Options_Screen(Screen):
pass
class PatientCareApp(App):
pass
if __name__ == '__main__':
PatientCareApp().run()
更新1:
当您添加更多代码时,您只需映射新类:
*.py
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.clock import Clock
class Opening_Screen(Screen):
def __init__(self, **kwargs):
super(Opening_Screen, self).__init__(**kwargs)
Clock.schedule_once(self.change_screen, 5)
def change_screen(self, *kwargs):
self.manager.current = 'Options_Screen'
class Patient_Care(App):
pass
if __name__ == '__main__':
Patient_Care().run()
*.kv
#:import C kivy.utils.get_color_from_hex
#:import RiseInTransition kivy.uix.screenmanager.RiseInTransition
<Opening_Screen>:
ScreenManager:
transition: RiseInTransition()
Opening_Screen:
name: 'Opening_Screen'
[...]
更新2:
如果您不想在屏幕中实现它,您可以在应用程序中实现。
from kivy.app import App
from kivy.clock import Clock
class Patient_Care(App):
def on_start(self):
Clock.schedule_once(self.change_screen, 5)
def change_screen(self, *kwargs):
self.root.current = 'Options_Screen'
if __name__ == '__main__':
Patient_Care().run()
关于Python/Kivy 屏幕转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49101761/