Я использую PyGTK для создавания приложения GUI. Я хочу обновить textview виджет от другого потока, но виджет не становится обновленным каждый раз, я пробую обновление. Что я должен сделать для получения надежного обновления GUI?
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 ()
в любом месте вашей программы.
Как указано в предыдущих ответах, 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 ()).
Ошибки шины возникают при попытке доступа к памяти, не адресуемой компьютером. Например, память компьютера имеет диапазон адресов 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 используя метод, синтаксис которого аналогичен приведенному выше, необходимо импортировать объект модуля
То, что сказал Йоханнес, верно, однако, поскольку GTK является оберткой для glib и gobject, вы на самом деле хотите использовать gtk.idle_add(). Нет необходимости в ненужных импортах.