Content

python+Tkinter+多线程的实例(python进行多元线性回归模型)原创

文章摘要

这篇文章介绍了使用Python的Tkinter库和tktt模块(可能是自定义或特定库)创建一个带有GUI界面的多线程程序。程序的主要功能是通过Queue和threading模块在主线程和工人线程之间通信,实现进度条的动态更新。文章详细描述了如何在主线程中启动一个 worker 线程来执行循环任务,每隔一定时间更新进度,并通过 listen_for_result 函数将结果传递回主界面。代码还展示了如何在 worker 线程结束后,根据进度条的状态动态地更新 UI 状态。总结来说,文章围绕使用Python多线程技术实现 GUI 界面中动态更新的典型应用场景进行了阐述。

import Tkinter as tk from ttk import * import time import Queue, threading class MainWindow: def __init__(self): self.root=tk.Tk() self.root.title(‘Demo’) def show(self): self.progress=tk.IntVar() self.progress_max=100 self.progressbar=Progressbar(self.root, mode=’determinate’, orient=tk.HORIZONTAL, variable=self.progress, maximum=self.progress_max) self.progressbar.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) self.progress.set(0) btn=tk.Button(self.root, text=’start’, command=self.start) btn.pack(fill=tk.BOTH, expand=True, padx=15, pady=5) self.btn=btn self.root.mainloop() def start(self): self.progress.set(0) self.btn.config(state=tk.DISABLED) self.thread_queue=Queue.Queue() # used to communicate between main thread (UI) and worker thread new_thread=threading.Thread(target=self.run_loop, kwargs={‘param1’:100, ‘param2′:20}) new_thread.start() # schedule a time-task to check UI # it’s in main thread, because it’s called by self.root self.root.after(100, self.listen_for_result) def run_loop(self, param1, param2): progress=0 for entry in range(self.progress_max): time.sleep(0.1) progress=progress + 1 self.thread_queue.put(progress) def listen_for_result(self): ”’ Check if there is something in the queue. Must be invoked by self.root to be sure it’s running in main thread ”’ try: progress=self.thread_queue.get(False) self.progress.set(progress) except Queue.Empty: # must exist to avoid trace-back pass finally: if self.progress.get() < self.progressbar[‘maximum’]: self.root.after(100, self.listen_for_result) else: self.btn.config(state=tk.NORMAL) if __name__==’__main__’: win=MainWindow() win.show()