Python tkinter: обновление графического интерфейса между вызовами подпроцесса - PullRequest
1 голос
/ 18 октября 2011

Я запрограммировал графический интерфейс, который вызывает файл .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>

Я не очень понимаю, что здесь происходит. Очевидно, это как-то связано с вызванным процессом. У кого-нибудь есть идея?

1 Ответ

4 голосов
/ 21 октября 2011

Я нашел грязное решение: Я вызываю root.update () перед каждым subprocess.call ().

Чтобы убедиться, что никакие кнопки не нажимаются во время обработки (что, по-видимому, является проблемой с root.update () согласно быстрому поиску в Google), я отключаю их все до запуска подпроцессов

как это:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...