un_active按钮,直到功能在kivy完成

时间:2017-06-17 10:24:28

标签: python kivy

我正在使用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将继续运行。功能完成后怎么能阻止它?

2 个答案:

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