На основании комментариев к моему вопросу я изменил свой пример.Пожалуйста, используйте это с осторожностью, потому что мне все еще неясно, является ли решение поточно-ориентированным или нет.
Я попробовал GLib.idle_add()
и удалил свой таймер и очередь. Внимание : В документе нет правильной подписи / параметров метода.Первоначально это
idle_add(function, *user_data, **kwargs)
Возможное решение для потоков
#!/usr/bin/env python3
import time
import threading
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib
class MyThread(threading.Thread):
def __init__(self, callback, n_tasks):
threading.Thread.__init__(self)
self._callback = callback
self._max = n_tasks
def run(self):
for i in range(self._max):
# simulate a task
time.sleep(1)
# increment/update progress
GLib.idle_add(self._callback)
class MyWindow(Gtk.Window):
def __init__(self, n_tasks):
Gtk.Window.__init__(self)
# max and current number of tasks
self._max = n_tasks
self._curr = 0
# gui: progressbar
self._bar = Gtk.ProgressBar(show_text=True)
self.add(self._bar)
self.connect('destroy', Gtk.main_quit)
# start the thread
self._thread = MyThread(self._update_progress, self._max)
self._thread.start()
def _update_progress(self):
# increment
self._curr += 1
# update the progressbar
self._bar.set_fraction(self._curr / self._max)
# end this event handler
return False
if __name__ == '__main__':
win = MyWindow(30)
win.show_all()
Gtk.main()
Что делает GLib.idle_add()
?
Я не являюсь экспертом или основным разработчиком Gtk.В моем понимании я бы сказал, что вы можете _инсталлировать_ методы обработчика событий в основной цикл Gtk.Другими словами, второй поток сообщает основному циклу Gtk (который является первым потоком) вызвать метод givin, когда больше ничего не нужно (это часто завершается в цикле GUI).
Существует нет решения для процесса , потому что они запускаются в отдельном экземпляре интерпретатора Python.Невозможно вызвать GLib.idle_add()
между двумя процессами.