Можно ли запланировать метод set () Kivy StringProperty с помощью Clock? - PullRequest
0 голосов
/ 09 января 2019

Я бы хотел отложить переход менеджера экрана 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)

Смешение.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я случайно наткнулся на это Киви: Смена экранов в диспетчере экранов с событием on_press (спасибо, Tshirtman), и теперь у меня есть один ответ. Следующее изменение дает мне то, что я хочу - возможность планировать изменение экрана напрямую (т.е. без вызова промежуточного метода):

def deliver_payload(self):
    self.statusmsg = 'Busy launching Armageddon'
    Clock.schedule_once(lambda dt: self.manager.setter('current')(self.manager,'screen_one'), 2)

Таким образом, представляется, что для присвоения нового значения свойству «текущий» диспетчера экрана правильный метод - это метод «setter» (а не метод «set», который я пытался использовать).

0 голосов
/ 09 января 2019

Вы можете установить новое значение для StringProperty, просто выполнив self.manager.current = 'some string', как вы делаете в своем коде.

...