Python TKinter:程序运行时文本小部件不更新

Python TKinter:程序运行时文本小部件不更新,python,tkinter,Python,Tkinter,我有一个程序,使用有限元方法进行计算,可能需要几分钟。 因为程序对用户来说似乎已经冻结了,所以我这样做是为了让它计算出它将提前进行的迭代次数,并将进度百分比打印到TKinter中的文本小部件中 问题是主窗口在程序迭代时冻结,并且只更新最后的文本,这对于用户了解当前计算进度没有多大用处 以下是代码的具体部分: progr+=dcompl textbox.configure(state=NORMAL) textbox.delete(1.0,2.0) textbox.insert(1.0,"Proce

我有一个程序,使用有限元方法进行计算,可能需要几分钟。 因为程序对用户来说似乎已经冻结了,所以我这样做是为了让它计算出它将提前进行的迭代次数,并将进度百分比打印到TKinter中的文本小部件中

问题是主窗口在程序迭代时冻结,并且只更新最后的文本,这对于用户了解当前计算进度没有多大用处

以下是代码的具体部分:

progr+=dcompl
textbox.configure(state=NORMAL)
textbox.delete(1.0,2.0)
textbox.insert(1.0,"Processando... ")
textbox.insert(2.0,str(int(progr))+"%") #the variable progr is the current progress in %
textbox.configure(state=DISABLED)
每次通过代码的特定部分时,它都会更新progr变量


如果我只是将progr变量打印到控制台,它就可以正常工作,但我希望用户看到的是UI,而不是控制台

有什么方法可以使TKinter窗口在程序运行时不冻结和更新文本?

您可以导入线程模块并在后台以单独的threading.Thread运行数字处理代码,或者导入子流程模块并在完全单独的流程中运行它。在tkInter代码(必须留在主线程中)中,您将等待线程/子进程向您发送完成的信号并向您发送结果。记住不要从后台线程访问任何tkInter对象:tkInter工具箱不是线程安全的,这将导致偶发性崩溃

针对布赖恩的评论:


如何在不占用CPU的情况下等待?我的一些应用程序使用了一个包含1毫秒时间的简单循环。睡眠和由此产生的性能影响并不明显。但是,要正确地执行此操作,您可能需要使用tkinter对象的.after机制来重复调用检查后台数字处理状态的函数。

如果我只是将progr变量打印到控制台,它工作正常,但我希望用户看到的是UI,而不是控制台

如果使用标签而不是文本,并在打印位置更新Tkinter变量,它应该可以正常工作

def change_value():
    ## get the value because this program doesn't
    ## have a separate variable to use for the set()
    val=progr.get()  
    if val < 100:
        ## show that the same function can be called many times with updates
        textbox.after(50, change_value)
    progr.set(val+2)

top=Tk()
textbox=Label(top, text="Processando... ")
textbox.grid()

progr=IntVar()
progr.set(1)
Label(top, textvariable=progr).grid(row=1)

change_value()

top.mainloop()

您永远不想在GUI的主线程中调用sleep,因为它会在GUI睡眠时冻结整个GUI。谢谢。我使用线程模块创建了一个不同的线程,这解决了我的问题。