Python tkinter:在子进程调用之间更新GUI
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python tkinter:在子进程调用之间更新GUI,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2445字,纯文字阅读大概需要4分钟。
内容图文
![Python tkinter:在子进程调用之间更新GUI](/upload/InfoBanner/zyjiaocheng/950/204dd3aad00d41869e7c26e80a9116e3.jpg)
我编写了一个多次调用.cmd文件的GUI(使用不同的参数)
class App:
def process(self):
for filename in os.listdir(path):
subprocess.call(['script.cmd', filename])
self.output('processed ' + filename)
def output(self, line):
self.textarea.config(state = NORMAL)
self.textarea.tag_config("green", background="green", foreground="black")
self.textarea.insert(END, line, ("green"))
self.textarea.yview(END)
self.textarea.config(state = DISABLED)
self.textarea.update_idletasks()
root = Tk()
app = App()
app.build_gui(root)
app.pack_gui(root)
root.mainloop()
按下按钮时调用process()
我也尝试过subprocess.Popen()和旧的os.spawnv()
它总是一样的. GUI在处理文件时没有反应.只有在处理完所有文件后,才会使用所有“已处理的XYZ”消息更新GUI.
update_idletasks()不应该在每个子进程调用后更新GUI吗?
谢谢
编辑:
我把问题缩小到这个简单的代码:
from Tkinter import *
import subprocess
file_list = ['file1', 'file2', 'file3', 'file4', 'file5']
def go():
labeltext.set('los')
for filename in file_list:
labeltext.set('processing ' + filename + '...')
label.update_idletasks()
proc = subprocess.call(["C:\\test\\process.exe", filename])
labeltext.set('all done!')
root = Tk()
Button(root, text="Go!", command=go).pack(side=TOP)
labeltext = StringVar()
labeltext.set('Press button to start')
label = Label(root, textvariable=labeltext)
label.pack(side=TOP)
root.mainloop()
现在,如果脚本正常工作,它依赖于process.exe.如果我用繁忙循环编写一个简单的C程序(例如process.exe的源代码:int i = 0; while(i< 1e9){i;}),则用每个文件1-5更新GUI.当我调用我想要使用的原始.exe文件时,它显示“处理文件1”并切换到“处理文件2”,但随后冻结直到程序终止(“全部完成!”). 我真的不明白这里有什么.显然它与所谓的过程有关.有没有人有想法?
解决方法:
我找到了一个脏的解决方案
我在每个subprocess.call()之前调用root.update().
为了确保在处理期间没有按下任何按钮(根据快速谷歌搜索,这似乎是root.update()的问题),我在子进程启动之前禁用所有按钮
像这样:
from Tkinter import *
import subprocess
file_list = ['file1', 'file2', 'file3', 'file4', 'file5']
def button():
b_process.configure(state=DISABLED)
go()
b_process.configure(state=NORMAL)
def go():
for filename in file_list:
label.configure(text="processing " + filename)
root.update()
proc = subprocess.call(["C:\\DTNA\\stat\\run.exe", filename])
print 'process terminated with return code ' + str(proc)
label.configure(text="all done!")
root = Tk()
b_process = Button(root, text="Go!", command=button)
b_process.pack(side=TOP)
label = Label(root, text='Press button to start')
label.pack(side=TOP)
root.mainloop()
内容总结
以上是互联网集市为您收集整理的Python tkinter:在子进程调用之间更新GUI全部内容,希望文章能够帮你解决Python tkinter:在子进程调用之间更新GUI所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。