2016-08-23 23 views
0

ラベルを更新して現在の残り時間を表示するタイマーを作成しようとしています。私はあなたが2分タイマーを開始する必要がありますボタンを持っています。何らかの理由でラベルが更新されません。私がこれをやっているやり方に何か問題がありますか?ここでwhileループでkivyのラベルが更新されない

は私のコードです:

import time 

from kivy.app import App 
from kivy.lang import Builder 
from kivy.uix.screenmanager import ScreenManager, Screen 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.button import Button 
from kivy.uix.label import Label 


Builder.load_string(""" 
#:import sla kivy.adapters.simplelistadapter 
#:import label kivy.uix.label 
<ListItemButton>: 
    selected_color: 0, 0, 1, 1 
    deselected_color: 0, 0, 0, 1 

<MenuScreen>: 
    FloatLayout: 
     #cols: 2 
     #rows: 2 
     size: 800,480 
     Label: 
      id: output 
      text: "0 min 0 s" 
      font_size: 60 
      size_hint: None, None 
      size: 400, 100 
      pos: 200,425 
     Button: 
      id: statheader 
      text: "2 min" 
      font_size: 40 
      size_hint: None, None 
      size: 600,100 
      pos: 150,800 
      background_color: 0,0,1,1 
      on_press: root.startTimer(int(2)) 

""") 

class MenuScreen(Screen): 
    tww = 0 
    def startTimer(self, what): 
     self.tww = what*60 
     while self.tww > 0: 
      minute = self.tww/60 
      print(minute) 
      second = self.tww - minute*60 
      print(second) 
      self.ids.output.text = str(minute) + " min " + str(second) + " s" 
      self.tww -= 1 
      time.sleep(1) 

sm = ScreenManager() 
menu_screen = MenuScreen(name='menu') 
sm.add_widget(menu_screen) 

class TestApp(App): 

    def build(self): 
     return sm 

if __name__ == '__main__': 
    TestApp().run() 

は何か他のものはself.ids.output.textがなければならないことはありますか?

答えて

1

ループが終了するまで、Kivyのグラフィックスは更新できません。ループ中は、ループの内容のみが繰り返し実行され、Kivyの通常の機能はブロックされます。

代わりにClock.schedule_intervalを使用して、他の機能をブロックすることなくすべてのフレームを計算したり、スレッドでwhileループを実行したりする必要があります。

+0

バマー。答えをありがとう – fastmhc

関連する問題