Python TKinter threading-如何使用进度条返回值
我试图在bckground进程运行时显示进度条。没问题,一切都正常(我用不同的方式)。但是这个后台进程需要返回一个值,这就是我得到堆栈的地方。如果我使用其他主题的建议,我有一个错误 运行时错误主线程不在主循环中 现在我明白了TKinter只允许在主循环中运行windows(和小部件)。那么,如何将进度条包装在线程中?如果能够在流程完成时更改消息也会很好。我试图避免使用全局变量,但这是我唯一的选择吗? 我将“progress”或“master”或其他小部件作为变量传递给线程函数,但这也不起作用(相同的错误) 这是我修改过的代码(注意,var1、var2、var3只是我需要为后台进程传递的变量。它们对于返回结果很重要): 这是以前工作过的代码,但根本没有返回值的选项(不返回值)。它在不传递变量的情况下工作:Python TKinter threading-如何使用进度条返回值,python,multithreading,tkinter,progress-bar,Python,Multithreading,Tkinter,Progress Bar,我试图在bckground进程运行时显示进度条。没问题,一切都正常(我用不同的方式)。但是这个后台进程需要返回一个值,这就是我得到堆栈的地方。如果我使用其他主题的建议,我有一个错误 运行时错误主线程不在主循环中 现在我明白了TKinter只允许在主循环中运行windows(和小部件)。那么,如何将进度条包装在线程中?如果能够在流程完成时更改消息也会很好。我试图避免使用全局变量,但这是我唯一的选择吗? 我将“progress”或“master”或其他小部件作为变量传递给线程函数,但这也不起作用(相
import tkinter as tk
from tkinter import ttk
import threading
def my_window(var1, var2, var3):
myList = [100, 200, 300, 400, 500]
master = tk.Tk()
master.geometry("600x250+350+100")
msg1 = tk.Message(master, text="Please wait...Something is happening.", anchor='w', width = 500)
msg1.place(relx=0.1, rely=0.1, relwidth=0.9, relheight=0.6)
progress = ttk.Progressbar(master)
progress.config(mode='determinate', maximum=100, value=0)
progressStep = 100/len(myList)
def threading_function():
progress.place(relx=0.1, rely=0.6, relwidth=0.8, relheight=0.1)
for item in myList:
#do some background processes - takes few seconds each
progress.step(progressStep)
#importantVariable = result of what was happening
msg1.place_forget()
msg2 = tk.Message(master, text="The process is finished.", anchor='w', width = 500).place(relx=0.1, rely=0.1, relwidth=0.9, relheight=0.6)
button_Continue = tk.Button(master, text='Continue', command = master.destroy)
button_Continue.place(relx=0.4, rely=0.8, relwidth=0.2, relheight=0.15)
progress.place_forget()
return importantVariable
threading.Thread(target = threading_function).start()
master.mainloop()
return importantVariable #returns None, which is not what I need
因此,questin(再次)是,在使用进度条(最好是其他TKinter小部件)时,如何从线程返回结果?
谢谢不要返回变量。相反,将变量放入队列中,并使用
after
方法生成一个函数来消化队列。@HenryYik谢谢,请您再解释一下好吗?在此之前,我从未处理过排队问题。或者链接就可以了。你说的“摘要”是什么意思?
import tkinter as tk
from tkinter import ttk
import threading
def my_window(var1, var2, var3):
myList = [100, 200, 300, 400, 500]
master = tk.Tk()
master.geometry("600x250+350+100")
msg1 = tk.Message(master, text="Please wait...Something is happening.", anchor='w', width = 500)
msg1.place(relx=0.1, rely=0.1, relwidth=0.9, relheight=0.6)
progress = ttk.Progressbar(master)
progress.config(mode='determinate', maximum=100, value=0)
progressStep = 100/len(myList)
def threading_function():
progress.place(relx=0.1, rely=0.6, relwidth=0.8, relheight=0.1)
for item in myList:
#do some background processes - takes few seconds each
progress.step(progressStep)
#importantVariable = result of what was happening
msg1.place_forget()
msg2 = tk.Message(master, text="The process is finished.", anchor='w', width = 500).place(relx=0.1, rely=0.1, relwidth=0.9, relheight=0.6)
button_Continue = tk.Button(master, text='Continue', command = master.destroy)
button_Continue.place(relx=0.4, rely=0.8, relwidth=0.2, relheight=0.15)
progress.place_forget()
return importantVariable
threading.Thread(target = threading_function).start()
master.mainloop()
return importantVariable #returns None, which is not what I need