我在python2.7.10中使用Tkinter构建了一个GUI程序。
它完美无缺,因为它的根本原因。
不幸的是,当与之交互时,它会短暂地进入windows害怕的“没有响应”状态。
以下是简短的布局:
启动脚本启动主脚本。主脚本读取设置文件并引导GUI脚本。GUI脚本启动GUI。用户在一系列文件中输入要搜索的术语。GUI脚本进入一个边脚本来处理文件和检索结果。侧脚本继承了GUI脚本的某些方面。边脚本试图在使用继承的元素时更新用户;GUI没有这些元素。在返回GUI脚本并显示结果之前,GUI会短暂地失去响应。
简而言之,我需要这样做:
启动脚本启动主脚本。主脚本读取设置文件并引导GUI脚本。GUI脚本启动GUI。用户在一系列文件中输入要搜索的术语。GUI脚本进入一个边脚本来处理文件和检索结果。侧脚本继承了GUI脚本的某些方面。使用GUI元素,边脚本边用进度条和图像更新用户。GUI返回到GUI脚本并显示结果。
我已经建立了进度条,但是图像还没有建立,但是如果进度条不能工作,我就不会把时间浪费在图像上。
样本不可能,未被使用但显示-点代码;图形用户界面;
import Tkinter, PIL, SideScript1
Tkinter()
ShowText()
ShowStuff()
input = GetInput()
ShowProgressBar()
SideScript1.processfilesbasedoninput(input, progressbarcontrolvar)
DisplayResults()
SideScript1
def proccessfilesbasedoninput(input, pbcv):
DoStuff()
pbcv.gofurther(5)
DoMoreStuff()
pbcv.goevenfurther(10)
a1sauce = RandomMathsStuffs()
for all the data in every file in that one directory:
ReadData()
pbcv.goabitfurther(a1sauce)
if data is what I want:
break
pbcv.step(-100)
return data
我想我的问题是,我怎样才能让GUI更新这些元素而不是失去知觉呢?
我们正在讨论10万份文件,1.5秒内完成。
更新:此问题已被标记为另一个问题的副本。是吗?是啊。但这两者都是因为我((现在仍然是))不确定如何搜索这类问题,以及三个解决方案:multithreading
、multiprocessing
和较小的任务。不幸的是,该程序是在单个线程和进程上构建的,如果没有完全重写,获得预期的GUI响应将导致大规模的减速,如果它能够工作的话。
我确实看到了这个问题,TKinter是一个阻塞模块。不幸的是,我对如何在不造成大量错误的情况下阻止它,或者完全重写它的想法还不多见。
发布于 2016-07-23 21:57:55
链接的重复问题有一个答案。这是个糟糕的问题,但还是有一个答案。
update_idletasks
。
我试过了,成功了!井。说大也大吧。
一开始起作用了,然后也得到了同样的结果。GUI暂时冻结。
然后我突然想到了一个主意。为什么不试试update
呢?
我这样做了,它的工作,因为我需要它,然而,它有一个巨大的性能成功-几乎相同的update_idletasks
。
为了解决这个新问题,我增加了更多的数学,使更新发生,在我的例子中,每300个文件,而不是每一个文件-平衡性能命中和用户不立即删除我的程序,因为是的,这要花费你的资源。不,我一开始没有听你的建议。先开枪,然后再问问题,对吧?
我是怎么用的?很高兴我问了!下面是一个例子;
#GUI Code
DoStuff()
SideScript1.proccessdata(arg, kwarg, debate)
DoMoreStuff()
#File Management Code
DoStuff()
filenumber = 0
maxfilenumber = 0
for every file I need to search:
SearchFile()
filenumber +=1
if filenumber == maxfilenumber:
tkinter.update() #in my case, it was tkinst, or "TkInter Instance", since it was inherited from the GUI attributes.
filenumber = 0
if data is what I want:
break
return data
我不确定所有的后端和硬事实,但update()
似乎比update_idletasks()
更方便用户,速度更快,也不太容易出错和减速。
我的恶作剧现在恢复正常,在60 (30?1.2亿?2.5亿?)帧一秒钟,顺利和有效-和Tk不会有一个坐下罢工,每次我要求它的信息!
谢谢你的帮助!
https://stackoverflow.com/questions/38548826
复制