予編程調用一個.cmd文件幾次(具有不同的參數)的GUI的Python Tkinter的:子之間更新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()
處理()按下一個按鈕
我也時被調用嘗試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;而(ⅰ< 1E9){I ++;}),該GUI與每file1-5更新。當我打電話給我想要使用的原始.exe文件時,它顯示「正在處理文件1」並切換到「正在處理文件2」,但隨後凍結,直到程序終止(「全部完成!」)。
我真的不知道怎麼了這裏。顯然這與所謂的過程有關。有人有想法嗎?
textarea的更新應該足夠了。有一個問題想到:也許這是一個複製粘貼錯誤,但爲什麼'app = App()'不是指'root'?你能粘貼你的完整代碼嗎? –
感謝您的回答。不幸的是,這似乎還不夠。 GUI在處理期間不更新。由於我沒有構造函數,因此App()不是指向根。這是必要的嗎?完整的代碼很長,但我認爲最重要的部分包含在第一篇文章中。 – Timedog
MMH,我沒有真正知道爲什麼,這不是令人耳目一新,但希望http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html,我不知道,更新的標籤文本是一個所謂的空閒任務。你可以在不使用'StringVar'的情況下進行測試,因此直接使用以下命令:'label.configure(text =「processing」)'? –