2011-10-18 22 views
1

予編程調用一個.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」,但隨後凍結,直到程序終止(「全部完成!」)。

我真的不知道怎麼了這裏。顯然這與所謂的過程有關。有人有想法嗎?

+0

textarea的更新應該足夠了。有一個問題想到:也許這是一個複製粘貼錯誤,但爲什麼'app = App()'不是指'root'?你能粘貼你的完整代碼嗎? –

+0

感謝您的回答。不幸的是,這似乎還不夠。 GUI在處理期間不更新。由於我沒有構造函數,因此App()不是指向根。這是必要的嗎?完整的代碼很長,但我認爲最重要的部分包含在第一篇文章中。 – Timedog

+0

MMH,我沒有真正知道爲什麼,這不是令人耳目一新,但希望http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html,我不知道,更新的標籤文本是一個所謂的空閒任務。你可以在不使用'StringVar'的情況下進行測試,因此直接使用以下命令:'label.configure(text =「processing 」)'? –

回答

2

我發現了一個骯髒的解決方案: 我叫root.update()每subprocess.call前()。

爲了確保沒有任何按鍵在處理過程中按下(這似乎是根據一個快速谷歌搜索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()