質問をさせてください。
ボタンを押してから〇秒後に△処理を実行するというコードを書きたいと思っています。
sleep(〇)を使えば確かに実現できるのですがUIもフリーズしてしまうので避けたいです。
(例えばsleep(10)にした場合、10秒間は他のボタン処理等もできなくなると思うので。)
試したことは、kivy.Clock.CyClockbaseのschedule_onceです。
ですがやり方が間違っているのかエラーが出てしまい諦めました。
何か方法はありますか?お願いします。
ボタン「start_delay」を押してから3秒後に
self.ids["info"].text = "Done"
を実行する例としてお願いいたします。
3秒後
Python
1# -*- coding: utf-8 -* 2from time import sleep 3from kivy.app import App 4from kivy.uix.boxlayout import BoxLayout 5 6class MainFrame(BoxLayout): 7 8 def __init__(self, **kwargs): 9 super(MainFrame, self).__init__(**kwargs) 10 11 def start_delay(self): 12 sleep(3) 13 self.ids["info"].text = "Done" 14 15 16class delay_test(App): 17 def build(self): 18 return MainFrame() 19 20 21if __name__ == "__main__": 22 delay_test().run()
KV
1#:kivy 1.10.0 2<MainFrame>: 3 orientation: "vertical" 4 Label: 5 id: info 6 text: "not yet" 7 Button: 8 text: "Start delay" 9 on_press: root.start_delay()
追記 2018/2/1
期待した結果が得られたコード
Python
1# -*- coding: utf-8 -* 2from kivy.app import App 3from kivy.lang import Builder 4from kivy.uix.boxlayout import BoxLayout 5from kivy.clock import Clock 6Builder.load_string(""" 7<MainFrame>: 8 orientation: "vertical" 9 Label: 10 id: info 11 text: "not yet" 12 Button: 13 text: "Start delay" 14 on_press: root.start_delay() 15""") 16 17class MainFrame(BoxLayout): 18 19 def __init__(self, **kwargs): 20 super(MainFrame, self).__init__(**kwargs) 21 22 def start_delay(self): 23 def callback(dt): 24 self.ids["info"].text = "Done" 25 Clock.schedule_once(callback, 3) 26 27 28class delay_test(App): 29 def build(self): 30 return MainFrame() 31 32 33if __name__ == "__main__": 34 delay_test().run()
上のコードを別のやり方でやろうとしたコード
結果、エラーで強制終了。
Python
1# -*- coding: utf-8 -* 2from kivy.app import App 3from kivy.lang import Builder 4from kivy.uix.boxlayout import BoxLayout 5from kivy.clock import Clock 6Builder.load_string(""" 7<MainFrame>: 8 orientation: "vertical" 9 Label: 10 id: info 11 text: "not yet" 12 Button: 13 text: "Start delay" 14 on_press: root.start_delay() 15""") 16 17class MainFrame(BoxLayout): 18 19 def __init__(self, **kwargs): 20 super(MainFrame, self).__init__(**kwargs) 21 22 def start_delay(self): 23 Clock.schedule_once(self.change_text, 3) 24 25 def change_text(self): 26 self.ids["info"].text = "Done" 27 28class delay_test(App): 29 def build(self): 30 return MainFrame() 31 32 33if __name__ == "__main__": 34 delay_test().run()
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/31 16:22
2018/02/01 09:02
2018/02/01 09:52
2018/02/01 10:42
2018/02/02 08:36