Python: как бороться с приоритетом потоков в Gtk3 - PullRequest
0 голосов
/ 10 мая 2019

Я строю пользовательский интерфейс, используя Python, Gtk3 и Glade.Я хочу изменить несколько вещей в пользовательском интерфейсе одновременно (например, запустить анимацию и отобразить новый текст), что приводит к зависанию приложения.

Я прочитал, что Gtk не является потокобезопасным, поэтому я не сталне использовал модуль Thread.Вместо этого я использовал функции Glib.idle_add и Gdk.threads_add_idle.Я пытаюсь обновить древовидную структуру, отобразить текст и анимированный логотип одновременно.Приложение работает, но оно останавливается на несколько секунд, а затем все появляется одновременно.Я пытаюсь установить разные приоритеты для потоков, но, похоже, это не исправить.

Gtk.threads_add_idle(Glib.PRIORITY_DEFAULT, label.set_text, "text_to_set")
Gtk.threads_add_igle(GLib.PRIORITY_DEFAULT, function_to_display_logo)

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Я узнал, в чем была моя ошибка.Я использовал функцию GLib.idle_add слишком много раз, даже в тех случаях, когда я не использовал ее.

Например, в основном коде у меня было:

Glib.idle_add(my_function,buffer)

, но my_function выглядела так:

def myfuntion(buffer):
    GLib.idle_add(buffer.set_text,"text")

Я удалил GLib.Вызов idle_add в основном коде и теперь он отлично работает.

0 голосов
/ 12 мая 2019

Пожалуйста, посмотрите здесь пример скрипта в https://github.com/f4iteightiz/UWR_scoreboard: окно GTK обновляется, например, каждые 0,2 с (обратные отсчеты нескольких таймеров появляются в метках; я думаю, что все остальное можно обновить)оставайся активным все время.Замерзание не заметно.

...