首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TKinter:程序运行时文本小部件不更新

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

Stack Overflow用户
提问于 2014-11-03 23:02:03
回答 2查看 1.6K关注 0票数 0

我有一个程序,使用有限元方法进行计算,可能需要几分钟的时间。因为该程序似乎已经冻结了用户,所以我做了它,以便它计算它将进行的迭代次数,并将进度按百分比打印到TKinter中的文本小部件。

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

下面是代码的具体部分:

代码语言:javascript
复制
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)

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

如果我只是在控制台上打印“UI”变量,它就能正常工作,但我希望用户看到的是UI,而不是控制台。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-03 23:16:34

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

在回应布赖恩的评论时:

如何“等待”而不捆绑CPU?我的一些应用程序使用了一个包含1毫秒time.sleep()的简单循环,由此产生的性能影响并不明显。但是,要正确地执行此操作,您可能需要使用tkinter对象的.after()机制反复调用一个检查背景数字处理状态的函数。

票数 -1
EN

Stack Overflow用户

发布于 2014-11-04 01:10:04

如果我只是在控制台上打印“UI”变量,它就能正常工作,但我希望用户看到的是UI,而不是控制台。

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

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26724856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档