kivy中的标签不会在while循环中更新

时间:2016-08-23 15:01:35

标签: python kivy

我试图制作一个更新标签的计时器,以查看当前剩余的时间。我有一个按钮,按下时应启动2分钟计时器。由于某种原因,标签没有更新。我这样做的方式有问题吗?

这是我的代码:

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 个答案:

答案 0 :(得分:1)

Kivy的图形无法更新,直到你的while循环结束 - 在循环过程中,只有循环内容被重复运行,并且Kivy的正常功能被阻止。

您应该使用Clock.schedule_interval每帧运行计算而不阻塞其他函数,或者在线程中运行while循环。