質問編集履歴

1 追記

mathing

mathing score 19

2018/02/01 01:17  投稿

Pythonでsleepを使わずディレイを作りたい。
質問をさせてください。
ボタンを押してから〇秒後に△処理を実行するというコードを書きたいと思っています。
sleep(〇)を使えば確かに実現できるのですがUIもフリーズしてしまうので避けたいです。
(例えばsleep(10)にした場合、10秒間は他のボタン処理等もできなくなると思うので。)
試したことは、kivy.Clock.CyClockbaseのschedule_onceです。
ですがやり方が間違っているのかエラーが出てしまい諦めました。
何か方法はありますか?お願いします。
ボタン「start_delay」を押してから3秒後に
self.ids["info"].text = "Done"
を実行する例としてお願いいたします。
![イメージ説明](979cadf06069158a311789edc4b163a7.png)
3秒後
![イメージ説明](94cfa864257a6b99640139c6d646503f.png)
```Python
# -*- coding: utf-8 -*
from time import sleep
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class MainFrame(BoxLayout):
   def __init__(self, **kwargs):
       super(MainFrame, self).__init__(**kwargs)
   def start_delay(self):
       sleep(3)
       self.ids["info"].text = "Done"
class delay_test(App):
   def build(self):
       return MainFrame()
if __name__ == "__main__":
   delay_test().run()
```
```KV lang
#:kivy 1.10.0
<MainFrame>:
   orientation: "vertical"
   Label:
       id: info
       text: "not yet"
   Button:
       text: "Start delay"
       on_press: root.start_delay()
```  
追記 2018/2/1  
期待した結果が得られたコード  
```Python  
# -*- coding: utf-8 -*  
from kivy.app import App  
from kivy.lang import Builder  
from kivy.uix.boxlayout import BoxLayout  
from kivy.clock import Clock  
Builder.load_string("""  
<MainFrame>:  
   orientation: "vertical"  
   Label:  
       id: info  
       text: "not yet"  
   Button:  
       text: "Start delay"  
       on_press: root.start_delay()  
""")  
 
class MainFrame(BoxLayout):  
 
   def __init__(self, **kwargs):  
       super(MainFrame, self).__init__(**kwargs)  
 
   def start_delay(self):  
       def callback(dt):  
            self.ids["info"].text = "Done"  
       Clock.schedule_once(callback, 3)  
 
 
class delay_test(App):  
   def build(self):  
       return MainFrame()  
 
 
if __name__ == "__main__":  
   delay_test().run()  
```  
上のコードを別のやり方でやろうとしたコード  
結果、エラーで強制終了。  
```Python  
# -*- coding: utf-8 -*  
from kivy.app import App  
from kivy.lang import Builder  
from kivy.uix.boxlayout import BoxLayout  
from kivy.clock import Clock  
Builder.load_string("""  
<MainFrame>:  
   orientation: "vertical"  
   Label:  
       id: info  
       text: "not yet"  
   Button:  
       text: "Start delay"  
       on_press: root.start_delay()  
""")  
 
class MainFrame(BoxLayout):  
 
   def __init__(self, **kwargs):  
       super(MainFrame, self).__init__(**kwargs)  
 
   def start_delay(self):  
       Clock.schedule_once(self.change_text, 3)  
 
   def change_text(self):  
       self.ids["info"].text = "Done"   
 
class delay_test(App):  
   def build(self):  
       return MainFrame()  
 
 
if __name__ == "__main__":  
   delay_test().run()  
```
  • Python 3.x

    19257 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る