Я запрограммировал графический интерфейс, который вызывает файл .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 ()
Это всегда то же самое. Графический интерфейс не реагирует при обработке файлов. Только после того, как все файлы были обработаны, графический интерфейс обновляется всеми сообщениями «обработано XYZ».
Не должен ли update_idletasks () обновлять графический интерфейс после каждого вызова подпроцесса?
Спасибо
редактирование:
Я сузил проблему до этого простого кода:
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. Когда я вызываю оригинальный .exe-файл, который хотел использовать, он отображает «обработка файла1» и переключается на «обработку файла2», но затем останавливается до завершения программы («все готово!»). </p>
Я не очень понимаю, что здесь происходит. Очевидно, это как-то связано с вызванным процессом. У кого-нибудь есть идея?