я создаю приложение на Python, которое использует GTK для создания пользовательского интерфейса, и меня немного смущает обработка объектов GTK в потоках, например, объекта GtkProgressBar.
Вот контекст:
Я пытаюсь выполнить загрузку в основном потоке и добавляю GObject.timeout_add
, чтобы пульсировать полосу, пока загрузка не закончится. Но после первого импульса интерфейс завис.
Пока все в порядке, поток завис до завершения загрузки, поэтому любой компонент будет обновлен. Решение: создать новый поток.
Я создал эту новую тему, чтобы сделать загрузку и другие вещи. В этой теме я получаю индикатор выполнения для обновлений. Но пока идет загрузка, и я добавляю GObject.timeout_add
, чтобы пульсировать полосу, пользовательский интерфейс снова завис. Новое решение: создайте третий поток.
Итак, мои темы выглядят так:
Main-Thread
'---- Thread 1
'------Thread 2
Итак, в Thread 1
я делаю другие вещи и обновляю пользовательский интерфейс, а в Thread 2
я делаю загрузку и добавляю GObject.timeout_add
, и там я могу обновить индикатор выполнения. А в Thread 1
я присоединяюсь к Thread 2
Я обрабатываю объекты Gtk, используя функцию GObject.idle_add
.
Но меня очень смущает, почему загрузка и обновление индикатора выполнения хорошо работают на Thread 2
, а не на Thread 1
Кто-нибудь может объяснить мне, почему это происходит, или если я пропущу что-то об объектах GTK.
Спасибо