更新Kivy标签时依序有多个线程?已解决

时间:2019-06-04 21:30:44

标签: multithreading label kivy python-3.7

启动Kivy应用程序中的线程后,按顺序更新标签时出现问题。标签可以很好地更新,但是显然,它们将在不同的时间更新,具体取决于它们各自线程的完成时间。我想让它们从上到下(从头到尾)更新,而下一个线程等待当前线程完成运行。在此过程中,用户应能够单击我的应用程序中的其他小部件。预先谢谢你!

我尝试使用Clock类,其间隔为1,但这会冻结我的应用程序。我现在正在尝试创建线程,并为每个等于1的线程设置每个守护程序,以便在此过程中单击其他按钮。不幸的是,我现在所拥有的,不包括等待当前完成的下一个线程。

这是当按下“开始”按钮时创建线程的功能

def startDeployment(self, event):
    # disable button
    self.StartButton.disabled = True
    # change button text to 'Running'
    self.StartButton.text = 'Running'
    # disable pause button
    self.PauseButton.disabled = False
    # enable the stop button
    self.StopButton.disabled = False
    # start deployment
    threads = []
    for task in self.tasks:
        statusLabel = self.statusLabels[self.tasks.index(task)]
        task = task.rstrip()
        task = task.split(";")
        taskOp = task[1]
        taskArg = task[2]
        thread = threading.Thread(target=self.executeTask, args=(taskOp, taskArg, statusLabel))
        threads.append(thread)

    threading.Thread(target=self.threadControl, args=(threads,)).start()

这是实际执行任务的功能

def executeTask(self, taskOperation, taskArgument, statusLabel):
    proc = subprocess.Popen(
        [taskOperation,taskArgument],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True)

    stdout, stderr = proc.communicate()

    global output
    global error

    output = stdout.decode()
    error = stderr.decode()

    for child in self.statusLayout.children:
        if child == statusLabel:
            Clock.schedule_once(partial(self.updateStatusLabel,child), 0.25)

    return(None)

我的threadControl方法

def threadControl(self, threads):
    for thread in threads:
        thread.daemon = True
        thread.start()
        thread.join()

    return(None)

和我的状态标签更新

def updateStatusLabel(self, statusLabel, dt):
    statusLabel.text = 'Done'
    return(None)

我希望我的滚动视图中的标签能够依次/按时间顺序从上到下依次更新。而是根据线程完成情况进行更新。当然,这种情况我只是不知道如何强制每个线程等待先前执行的线程完成。

0 个答案:

没有答案