Python TKinter threading-如何使用进度条返回值

Python TKinter threading-如何使用进度条返回值,python,multithreading,tkinter,progress-bar,Python,Multithreading,Tkinter,Progress Bar,我试图在bckground进程运行时显示进度条。没问题,一切都正常(我用不同的方式)。但是这个后台进程需要返回一个值,这就是我得到堆栈的地方。如果我使用其他主题的建议,我有一个错误 运行时错误主线程不在主循环中 现在我明白了TKinter只允许在主循环中运行windows(和小部件)。那么,如何将进度条包装在线程中?如果能够在流程完成时更改消息也会很好。我试图避免使用全局变量,但这是我唯一的选择吗? 我将“progress”或“master”或其他小部件作为变量传递给线程函数,但这也不起作用(相

我试图在bckground进程运行时显示进度条。没问题,一切都正常(我用不同的方式)。但是这个后台进程需要返回一个值,这就是我得到堆栈的地方。如果我使用其他主题的建议,我有一个错误

运行时错误主线程不在主循环中

现在我明白了TKinter只允许在主循环中运行windows(和小部件)。那么,如何将进度条包装在线程中?如果能够在流程完成时更改消息也会很好。我试图避免使用全局变量,但这是我唯一的选择吗? 我将“progress”或“master”或其他小部件作为变量传递给线程函数,但这也不起作用(相同的错误)

这是我修改过的代码(注意,var1、var2、var3只是我需要为后台进程传递的变量。它们对于返回结果很重要):

这是以前工作过的代码,但根本没有返回值的选项(不返回值)。它在不传递变量的情况下工作:

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