【问题标题】:Python/Kivy Screen TransitionPython/Kivy 屏幕过渡
【发布时间】:2018-08-12 14:16:29
【问题描述】:

在 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 函数在不按下按钮的情况下自动切换来动态切换。

【问题讨论】:

  • 显示你的 .kv!!!!
  • Opening_Screen 继承了什么类?
  • 你的 .kv 名称是什么?
  • 我的 .kv 名称是 patient_care.kv

标签: python class kivy


【解决方案1】:

由于您没有显示重现错误所需的代码,例如应用程序必须以 App 结尾,并且 .kv 的名称必须是小写的类的其余部分。另一个可能的错误是 Opening_Screen 不继承任何类型,因此它可能永远不会被调用,等等。

所以我只提供一个例子:

patientcare.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'

ma​​in.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:

如果您不想在 Screen 中实现,可以在 App 中实现。

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()

【讨论】:

  • 感谢您的回答。我更新了我的问题以包含 .kv 文件。我有必要在类创建中通过屏幕吗?我试图避免让我的类继承自 Screen 类,并且我假设如果我专门为此创建一个函数,打开的屏幕仍然能够进行自动转换。
  • @SimeonIkudabo 如果你意识到你正在尝试使用时钟的Opening_Screen,但是.py 中的Opening_Screen 与.kv 不同。您认为它们之间的联系如何?
  • 是否有办法在我创建的 .kv 屏幕中安排自动过渡。那将是一个更好的问题。我的错误是我认为如果我在 .py 文件中创建一个与 .kv 文件中的名称匹配的类,它们会自动绑定。你是对的,那是行不通的。那么有没有办法从 .kv 文件中进行屏幕转换?
  • @SimeonIkudabo 您不能在 .kv 中创建时钟,但我认为可以在 PatientCareApp 中完成
  • @SimeonIkudabo 检查我的最新更新,也许这就是你要找的东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多