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



我有一个程序,它使用有限元方法进行计算,可能需要几分钟的时间。因为这个程序对用户来说可能已经冻结了,所以我制作了它,以便它预先计算迭代次数,并将进度以百分比形式打印到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)

每次通过代码的特定部分时,它都会更新"prog"变量。

如果我只是将"prog"变量打印到控制台,它运行得很好,但我希望用户看到的是UI,而不是控制台。

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

如果我只是将"prog"变量打印到控制台,它运行得很好,但我希望用户看到的是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()

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

针对Bryan的评论:

如何在不占用CPU的情况下"等待"?我的一些应用程序使用了一个包含1毫秒time.sleep()的简单循环,结果对性能的影响并不明显。然而,为了正确地执行此操作,您可能需要使用tkinter对象的.after()机制来重复调用一个函数,该函数检查后台数字运算的状态。

最新更新