我正在使用kivy用于UI。有一个Time_consuming函数,当它运行时,kivy ui会变成黑色,所以我使用了线程。 我想在Time_consuming功能完成之前禁用按钮,然后再次启用按钮。我用过类似下面的东西:
from threading import Thread
from kivy.clock import Clock
from functools import partial
def run():
self.run_button.disabled=True
self.back_button.disabled=True
t=Thread(target=Time_consuming(), args=())
t.start()
Clock.schedule_interval(partial(disable, t.isAlive()), 8)
def disable(t, what):
print(t)
if not t:
self.run_button.disabled=False
self.back_button.disabled=False
但是这个剂量不起作用,即使在Time_consuming()完成时,disable()中的t.isAlive()也是True。问题出在哪里?
问题2:另一个问题是,Clock.schedule_interval将继续运行。功能完成后怎么能阻止它?
答案 0 :(得分:1)
我看到你已经回答了你的问题。我还在构建一个示例应用程序来帮助您,同时您正在回答。我认为它仍然对你有价值,因此我发布它。一个按钮显示线程,另一个按钮显示一次。快乐的编码:)。
from kivy.app import App
from kivy.base import Builder
from kivy.properties import ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock
import time
import threading
Builder.load_string("""
<rootwi>:
label_to_be_changed1: label_to_be_changed1
label_to_be_changed2: label_to_be_changed2
button1: button1
button2: button2
orientation: 'vertical'
Button:
id: button1
text:'Button1 - Threading'
on_press: root.change_Label_text1()
Button:
id: button2
text: 'Button2 - schedule'
on_press: root.change_Label_text2()
Label:
id: label_to_be_changed1
Label:
id: label_to_be_changed2
""")
class rootwi(BoxLayout):
label_to_be_changed1 = ObjectProperty()
label_to_be_changed2 = ObjectProperty()
button1 = ObjectProperty()
button2 = ObjectProperty()
def change_Label_text1(self):
self.button1.disabled = True
threading.Thread(target=self.timeconsuming).start()
def timeconsuming(self):
#do your stuff
time.sleep(5)
self.label_to_be_changed1.text = 'thread has ended'
self.button1.disabled = False
def change_Label_text2(self):
self.button2.disabled = True
Clock.schedule_once(self.change_Label_text2_callback, 4)
def change_Label_text2_callback(self, *largs):
self.label_to_be_changed2.text = 'schedule has ended'
self.button2.disabled = False
class MyApp(App):
def build(self):
return rootwi()
if __name__ == '__main__':
MyApp().run()
答案 1 :(得分:0)
我发现:
问题1:传递t而不是t.isAlive()。这个:
Clock.schedule_interval(partial(disable, t.isAlive()), 8)
更改为:
Clock.schedule_interval(partial(disable, t), 8)
问题2:如果disable()返回False,则计划将被取消,不会重复。
def run_model():
self.run_button.disabled=True
self.back_button.disabled=True
t=Thread(target=run, args=())
t.start()
Clock.schedule_interval(partial(disable, t), 8)
def disable(t, what):
if not t.isAlive():
self.run_button.disabled=False
self.back_button.disabled=False
return False