我在python 2.7.10中使用Tkinter构建了一个GUI程序。
它完美地工作,因为不管怎样,这是根本原因。
不幸的是,当与之交互时,它会短暂地进入窗口可怕的"未响应"状态。
简而言之,布局如下:
启动脚本启动主脚本。主脚本读取设置文件并引导GUI脚本。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是一个阻塞模块。不幸的是,我对如何在不引起大规模错误或完全重写的情况下取消阻止它还没有什么想法。
链接的重复问题包含一个答案。这是一个糟糕的问题,但答案仍然存在。
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?120?2.5亿??))的速度流畅高效地运行——而且Tk不再每次我向它询问信息时都会坐下来!
感谢@Rawing的帮助!