GUI, не обновленный от другого потока при использовании PyGtk

Я использую PyGTK для создавания приложения GUI. Я хочу обновить textview виджет от другого потока, но виджет не становится обновленным каждый раз, я пробую обновление. Что я должен сделать для получения надежного обновления GUI?

6
задан appusajeev 14 January 2010 в 19:04
поделиться

4 ответа

GTK + не безопасно, поэтому вы не должны просто вызывать методы обновления GUI из других потоков. GLIB.idle_add (или gobject.idle_add в более старых версиях pygtk) можно использовать для этой цели.

Вместо написания:

label.set_text("foo")

Вы бы написали:

glib.idle_add(label.set_text, "foo")

, который вызывает очередь функции в GTK +.

Если вам нужно запустить несколько операторов, часто легче обернуть их в функции:

def idle():
    label1.set_text("foo")
    label2.set_text("bar")
glib.idle_add(idle)

Убедитесь, что функция передана IDLE_ADD , не возвращает true ; В противном случае это снова будет очередно.

Отредактируйте: Как указал Даниэль, вам нужно позвонить GTK.GDK.THREADS_INIT () в любом месте вашей программы.

13
ответ дан 8 December 2019 в 18:37
поделиться

Как указано в предыдущих ответах, GTK не «Безопасен в потоке», но это «поток» - см. Эта страница на темах: HTTPS: //developer.gnome .org / gdk2 / Стабильный / gdk2-threads.html

Для изменения виджетов GTK из другого потока вы должны использовать блокировку GTK. Вызов GTK.THREADS_INIT () сразу после импорта модуля GTK, а затем вы можете обновить себя так:

gtk.threads_enter()
# make changes...
gtk.threads_leave()

Обратите внимание, что приведенное выше не будет работать на Windows (см. Ссылка выше). В Windows вы должны использовать GOBJECT.IDLE_ADD () Как объяснено выше, хотя не забудьте поставить GOBJECT.THREADS_INIT () непосредственно после импорта GOBJECT в вашем коде! Функция idle_add () выполнит самообновление в основной ните (поток работает gtk.main ()).

2
ответ дан 8 December 2019 в 18:37
поделиться

Ошибки шины возникают при попытке доступа к памяти, не адресуемой компьютером. Например, память компьютера имеет диапазон адресов 0x00 - 0xFF, но вы пытаетесь получить доступ к элементу памяти 0x0100 или выше.

В действительности ваш компьютер будет иметь гораздо больший диапазон, чем от 0x00 до 0xFF.

Чтобы ответить на Ваш первоначальный пост:

Сообщите мне о ситуации, которая обязательно приведет к ошибке шины.

В коде выполните индексацию в память за пределами максимального предела памяти. Я не знаю... использовать какое-то гигантское шестнадцатеричное значение 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF индексированное в символ *...

-121--2370495-

Использование метода jQuery $ .post () :

setInterval(function(){
  $.post("getCount.php", function(result) {
    // do something with result
  }, "html");
}, 10000);

Я предполагаю, что у вас есть веская причина для запроса собственного локального сценария. Если вам нужна подробная информация о том, кто посещает ваш сайт, когда и из каких типов сред (машин, браузеров и т.д.), я бы посоветовал вам заняться внедрением чего-то вроде Google Analytics .

-121--4780341-

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

-1
ответ дан 8 December 2019 в 18:37
поделиться

То, что сказал Йоханнес, верно, однако, поскольку GTK является оберткой для glib и gobject, вы на самом деле хотите использовать gtk.idle_add(). Нет необходимости в ненужных импортах.

-1
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: