0

我正在努力了解如何让 Spinner 在运行漫长的过程之前激活然后停用它。

下面是一个例子。我尝试在 KV 文件中运行该方法来切换微调器,然后运行线程进程,然后停用它,但这不起作用。然后我将主线程装饰器添加到切换微调器方法中,并在线程进程之前运行它,但这也不起作用。

from kivy.clock import mainthread
from kivy.lang import Builder
import threading

from kivymd.app import MDApp

KV = '''
#: import threading threading
Screen:
    BoxLayout:
        MDSpinner:
            id: spinner
            size_hint: None, None
            size: dp(46), dp(46)
            pos_hint: {'center_x': .5, 'center_y': .5}
            active: True if check.active else False
    
        MDCheckbox:
            id: check
            size_hint: None, None
            size: dp(48), dp(48)
            pos_hint: {'center_x': .5, 'center_y': .4}
            active: True
        
        Button:
            text: 'Spinner On/Off'
            size_hint: None, None
            size: dp(150), dp(150)
            on_release: app.spinner_toggle()
        
        Button:
            text: 'Run Long Process'
            size_hint: None, None
            size: dp(150), dp(150)
            on_release: 
                app.spinner_toggle()
                app.long_process_thread()
                app.spinner_toggle()
'''


class Test(MDApp):
    def build(self):
        return Builder.load_string(KV)

    @mainthread
    def spinner_toggle(self):
        print('Spinner Toggle')
        app = self.get_running_app()
        if app.root.ids.spinner.active == False:
            app.root.ids.spinner.active = True
        else:
            app.root.ids.spinner.active = False


    def long_process(self):
        for x in range(1000000):
            print(x)

    def long_process_thread(self):
        self.spinner_toggle()
        threading.Thread(target=(self.long_process())).start()
        self.spinner_toggle()



Test().run()
4

1 回答 1

1

几个问题。第一个是你的行:

threading.Thread(target=(self.long_process())).start()

在该调用中,代码self.long_process()实际上是long_process()在启动线程之前运行的。你实际上想做:

threading.Thread(target=(self.long_process)).start()

注意缺少().

第二个问题是您self.spinner_toggle()在启动线程后立即调用,因此Spinner在线程完成之前很久就会再次切换。要解决这个问题,您可以self.spinner_toggle()在线程结束时调用。因此,这是您的代码的一部分,其中包含这些修改:

def long_process(self):
    for x in range(1000000):
        print(x)
    self.spinner_toggle()

def long_process_thread(self):
    self.spinner_toggle()
    threading.Thread(target=(self.long_process)).start()

顺便说一句,在你的kv你可以替换:

active: True if check.active else False

用更简单的:

active: check.active
于 2020-08-27T13:14:43.773 回答