2 u013771353 u013771353 于 2015.07.09 19:13 提问

Python-Tkinter请问有什么办法可以在事件处理过程中,即时刷新Text的信息?

新手刚学了Thinter,我用了for循环往文本框里添加信息,,用的insert方法,点击按钮后结果如下图所示,,表面上看不出控制台的结果跟Text组件的结果有啥区别,,但是事实上左边的Text的信息是4秒后才把添加的四条信息刷新出来的,,然而看到信息里面的用time方法打印出的时间戳确实方法已经处理过……
也就是说事件发生-循环语句中处理好但是要方法结束后,事件产生的组件信息才会刷新出来?

def test():
        for i in range(1,5):
            i=i*1.0
            print(time.time())
            t4.insert(i,'hello--'+str(time.time())+'\n')
            if i==4:
                break
            time.sleep(1)
            print(time.time())      
b2=Button(frm_l,width=10,command=test)                      

图片说明

那请问有什么办法可以在事件处理过程中,即时刷新Text的信息?

补充一下,其实搞这个Text信息,,就是为了使用时候可以看到程序的一些运行情况。。我是想把方法的运行情况的返回值(把原本打印到控制台的提示信息变成方法的返回值)都直接显示到Text文本框里面,这是比较直观的方法。
然而事实上现在却卡在这里。或者换个思路,,有什么办法让别人(没有安装python环境)使用打包后的exe程序的时候看到控制台里面的信息。。

3个回答

u013771353
u013771353   2015.07.12 19:09

晕,原来是这么简单的问题,,难怪没人回答了,,Text组件用insert添加内容之后,再用update方法就可以即时把内容刷新刷新出来了

91program
91program   Ds   Rxr 2015.07.09 19:39

一般的处理方法是在 for 中增加一点延时,再发消息让界面刷新。

u013771353
u013771353 我开始的时候也是以为延时问题来不及刷新的,所以在上面代码加了time的sleep做了延时。但是无论延时多长,,都是事件结束才把信息刷新出来。。也就是跟for循环里面的信息量无关,这过程就是一个阻塞的过程,方法结束就一次过把产生的信息一次过刷新出来的感觉。。
2 年多之前 回复
oyljerry
oyljerry   Ds   Rxr 2015.07.09 21:26

这应该是python GIL的原因,被锁住了,所以要等事件结束,才能刷新。
可以在你的代码中添加time.sleep(1),让出锁给界面刷新。

oyljerry
oyljerry 回复无限超频: 如果这样你要看一下tinker的实现了
2 年多之前 回复
u013771353
u013771353 好晕GIL锁什么的看得头疼,,但是我上面代码也尝试加了time.sleep啊。。多少秒都不管用,,死活都要事件结束才把信息刷新出来。。
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片