Я бы хотел отложить переход менеджера экрана Kivy, что я могу сделать, например, так:
#!/usr/bin/env python
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import StringProperty
from kivy.uix.button import Button
from kivy.clock import Clock
Builder.load_string('''
#: kivy 1.9.2
#: import sm kivy.uix.screenmanager
#: set base_font_size 25
<MainWidget>:
manager: screen_manager
ScreenManager:
id: screen_manager
transition: sm.NoTransition()
Screen:
name: 'screen_one'
Button:
text: 'Screen 1, press to switch to Screen 2'
font_size: base_font_size
on_press:
root.manager.current = 'screen_two'
root.statusmsg = 'Screen 2, press to launch Armageddon'
Screen:
name: 'screen_two'
Button:
text: root.statusmsg
font_size: base_font_size
disabled: True if root.statusmsg == 'Busy launching Armageddon' else False # prevent multiple activation
on_press:
root.deliver_payload()
''')
class MainWidget(FloatLayout):
statusmsg = StringProperty()
def __init__(self, **kwargs):
super(MainWidget, self).__init__(**kwargs)
def deliver_payload(self, dt=0):
if not dt: # called via on_press
self.statusmsg = 'Busy launching Armageddon'
# launch Armageddon here
Clock.schedule_once(self.deliver_payload, 2)
else: # scheduled via Clock
self.manager.current = 'screen_one'
class MyApp(App):
def build(self):
mw=MainWidget()
return mw
if __name__ == '__main__':
MyApp().run()
Однако manager.current - это Kivy StringProperty, и я должен иметь возможность назначить ему новое значение с помощью метода set () и, возможно, запланировать это с помощью Clock, например. Clock.schedule_once (lambda dt: self.manager.property ('current'). Set (??, 'screen_one'), 2).
Я не смог найти документацию для метода set () Kivy StringProperty. Кажется, что метод принимает два аргумента, и первый аргумент должен иметь тип kivy._event.EventDispatcher - в соответствии с информацией о трассировке, которую я получаю, когда пытаюсь сделать несколько случайных предположений. Кто-нибудь может указать на некоторую документацию или примеры использования метода set ()?
РЕДАКТИРОВАТЬ: я понимаю, что я не дал понять, что я хочу сделать в конечном итоге - я спрашиваю, можно ли запланировать метод set () свойства Kivy с помощью Kivy Clock. Например, я могу переключать Kivy BooleanProperty следующим образом:
if self.property('myboolean').get(self):
self.property('myboolean').set(self, False)
else:
self.property('myboolean').set(self, True)
Но я не смог запланировать метод, используя Часы. Следующая строка не вызвала ошибок, но также не оказала никакого влияния:
Clock.schedule_once(lambda dt: self.property('myboolean').set(self, False),0)
В случае метода set () Kivy StringProperty я даже не смог выяснить, каким должен быть 1-й аргумент, поэтому не стал даже пытаться планировать его с помощью Clock.
ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:
Хотя менеджер экрана 'current' является StringProperty в соответствии с документацией, он, похоже, ведет себя несколько иначе. С помощью StringProperty я могу сделать следующее:
self.property('statusmsg').set(self, 'Armageddon now')
Однако попытка чего-то подобного с помощью manager.current не удалась:
self.manager.property('current').set(self.manager, 'aux_screen')
Сообщение об ошибке:
self.manager.property('current').set(self.manager, 'screen_one')
TypeError: Argument 'obj' has incorrect type (expected kivy._event.EventDispatcher, got kivy.weakproxy.WeakProxy)
Смешение.