Я пишу графическую оболочку для программы командной строки на python с использованием GTK.Основная программа выводит примерно так:
Starting Tractor:
Dec 04 22:10:34.000 [notice] Bootstrapped 0%: Starting
Dec 04 22:10:34.000 [notice] Bootstrapped 80%: Connecting to the Tor network
Dec 04 22:10:35.000 [notice] Bootstrapped 85%: Finishing handshake with first hop
Dec 04 22:10:36.000 [notice] Bootstrapped 90%: Establishing a Tor circuit
Dec 04 22:10:37.000 [notice] Bootstrapped 100%: Done
Tractor is conneted.
У меня есть кнопка запуска, которая запускает программу через подпроцесс.так как я хочу, чтобы главное окно работало во время процесса запуска, я использовал для этого трейдинг.Вот мой код:
def on_start_clicked(self, button):
spinner = Gtk.Spinner()
self.props.icon_widget = spinner
spinner.start()
self.show_all()
header_bar = self.get_parent()
if self.is_running():
def task_thread():
task = Popen(command + "stop", stdout=PIPE, shell=True)
task.wait()
spinner.stop()
header_bar.show_progress_button(False)
self.update_label()
else:
def task_thread():
header_bar.show_progress_button(True)
task = Popen(command + "start", stdout=PIPE, shell=True)
while True:
output = task.stdout.readline().decode("utf-8")
if output == '' and task.poll() is not None:
break
if output and '%' in output:
print(output.split()[5][:-2])
task.wait()
spinner.stop()
self.update_label()
thread = Thread(target=task_thread)
thread.daemon = True
thread.start()
Проблема в том, что вывод журнала не в реальном времени, но он ожидает завершения всего процесса, а затем выводит весь вывод полностью!
Iхотите, чтобы фактический процент в то время, чтобы передать его на индикатор выполнения, показывающий, сколько задачи выполнено.Как я могу это сделать?
EDIT
Я изменил код следующим образом благодаря theGtknerd , но функция подачи по-прежнему работает после завершения процесса и просто печатаетПервая строка всего вывода.Я думаю, что здесь происходит сбой при срабатывании IO_IN.
def thread_finished (self, stdout, condition):
GLib.source_remove(self.io_id)
stdout.close()
self.spinner.stop()
self.update_label()
print("heeey")
return False
def feed (self, stdout, condition):
line = stdout.readline()
line = line.decode("utf-8")
print(line)
return True
def on_start_clicked(self, button):
self.spinner = Gtk.Spinner()
self.props.icon_widget = self.spinner
self.spinner.start()
self.show_all()
header_bar = self.get_parent()
if self.is_running():
header_bar.show_progress_button(False)
task = Popen(command + "stop", stdout=PIPE, shell=True)
else:
header_bar.show_progress_button(True)
task = Popen(command + "start", stdout=PIPE, shell=True)
self.io_id = GLib.io_add_watch(task.stdout, GLib.IO_IN, self.feed)
GLib.io_add_watch(task.stdout, GLib.IO_HUP, self.thread_finished)