我有一个程序,它使用有限元方法进行计算,最多可能需要几分钟。 因为该程序似乎已经为用户冻结了,所以我做了它以便它预先计算它将进行的迭代次数,并将进度百分比打印到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窗口不冻结并在程序运行时更新文本?
答案 0 :(得分:0)
如果我只打印" 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()
答案 1 :(得分:-1)
您可以导入threading
模块并在单独的threading.Thread
中在后台运行数字运算代码,或者您可以导入subprocess
模块并在完全独立的情况下运行它处理。在必须保留在主线程中的tkInter代码中,您将等到线程/子进程向您发送已完成的信号并将结果发送给您。 (请记住,不要从后台线程访问任何tkInter对象:tkInter工具包不是线程安全的,这将导致零星的崩溃。)
回应布莱恩的评论:
如何在不占用CPU的情况下“等待”?我的一些应用程序使用了一个包含1毫秒time.sleep()
的简单循环,因此产生的性能损失并不明显。但是,要正确地执行此操作,您可能希望使用tkinter对象的.after()
机制来重复调用检查背景数字运算状态的函数。