Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python+;Tkinter,如何在tk前端的后台独立运行?_Python_Multithreading_Tkinter - Fatal编程技术网

Python+;Tkinter,如何在tk前端的后台独立运行?

Python+;Tkinter,如何在tk前端的后台独立运行?,python,multithreading,tkinter,Python,Multithreading,Tkinter,我是个笨蛋 在后台运行一个长时间运行的进程的首选方式是什么,与tkinter弹出窗口(表单)分开 我在使用tkinter时读过关于多线程的不同内容,但找不到一个简单的“像这样做” 要明确的是,我需要的行为是,用户启动程序,tkinter位弹出表示进程已经开始。用户可以在不影响其余进程的情况下关闭此弹出窗口。也许当这个过程结束时,我可以弹出另一个tkinter弹出窗口 如果tkinter在这方面做得过火,请随意建议更好的方法 谢谢 由于可以共享对象状态,因此编码更简单 class Worker:

我是个笨蛋

在后台运行一个长时间运行的进程的首选方式是什么,与tkinter弹出窗口(表单)分开

我在使用tkinter时读过关于多线程的不同内容,但找不到一个简单的“像这样做”

要明确的是,我需要的行为是,用户启动程序,tkinter位弹出表示进程已经开始。用户可以在不影响其余进程的情况下关闭此弹出窗口。也许当这个过程结束时,我可以弹出另一个tkinter弹出窗口

如果tkinter在这方面做得过火,请随意建议更好的方法


谢谢

由于可以共享对象状态,因此编码更简单

class Worker:
    finished = False
    def do_work(self):
       os.system("...")
       self.finished=True
    def start(self):
        self.th = threading.Thread(target=self.do_work)
        self.th.start()

w = Worker()
w.start()
tkMessageBox.showinfo("Work Started", "OK started working")
while not w.finished:
    time.sleep(0.5)
tkMessageBox.showinfo("Work Complete", "OK Done")

乔兰·比斯利(Joran Beasley)的答案是正确的,但这种方式使事情变得过于复杂。以下是简单的版本:

class Worker(threading.Thread):
    def run(self):
        # long process goes here

w = Worker()
w.start()
tkMessageBox.showinfo("Work Started", "OK started working")
w.join()
tkMessageBox.showinfo("Work Complete", "OK Done")
编辑:下面是一个工作示例:

import threading
import time
import tkMessageBox
import Tkinter as tk
root = tk.Tk()
root.withdraw()

class Worker(threading.Thread):
    def run(self):
        # long process goes here
        time.sleep(10)

w = Worker()
w.start()
tkMessageBox.showinfo("Work Started", "OK started working")
root.update()
w.join()
tkMessageBox.showinfo("Work Complete", "OK Done")

而条件:睡眠几乎是一种反模式。条件变量的存在是有原因的,尽管在这种情况下,join也可以(在一个更大的gui程序中,您可能希望封送到gui线程)好的一点。。。。我经常等待一些状态变量,我轮询我的任务状态。。。只是等它退出就太过分了。。。我显然没有想到:P