gpt4 book ai didi

Python tkinter : Update GUI between subprocess calls

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:35 25 4
gpt4 key购买 nike

我编写了一个 GUI 多次调用 .cmd 文件(使用不同的参数)

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 在处理文件时没有反应。只有在处理完所有文件后,GUI 才会更新所有“已处理的 XYZ”消息。

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++; }),GUI 会随着每个文件 1-5 更新。当我调用我想使用的原始 .exe 文件时,它显示“processing file1”并切换到“processing file2”但随后卡住直到程序终止(“全部完成!”)。

我真的不明白这是怎么回事。显然跟调用的进程有关系。有人有想法吗?

最佳答案

我找到了一个肮脏的解决方案:我在每个 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 : Update GUI between subprocess calls,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7801163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com