【问题标题】:TKinter: text widget doesn't update while program is runingTKinter:程序运行时文本小部件不更新
【发布时间】:2014-11-03 23:02:03
【问题描述】:

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

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    如果我只是将“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()
    

    【讨论】:

      【解决方案2】:

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

      回应 Bryan 的评论:

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

      【讨论】:

      • 你永远不想在 GUI 的主线程中调用 sleep,因为它会在休眠时冻结整个 GUI。
      • 谢谢。我使用线程模块创建了一个不同的线程,这解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多