ГТК основные блоки - Питон
Я новичок в GTK, и я наткнулся на проблему, которая звучит просто, но я просто не могу найти способ с ней справиться. В основном, звонит gtk.main()
останавливает однопоточный процесс я знаю это gtk.main()
блокирует, но я не звонил gtk.main()
в любое время до этого выход из основного цикла не принесет никакой пользы, поскольку нет цикла, из которого можно выйти.
Даже так, gtk.main_level()
возвращает 0. Более того, когда я пытаюсь gtk.main()
из командной строки python он также зависает. Есть кое-что основное, что я пропускаю, так может кто-нибудь указать мне на это? Оценил.
РЕДАКТИРОВАТЬ: Gtk метод мне нужен gobject.add_timeout
, как это:
gobject.timeout_add(2000, callback)
gtk.main() # This blocks the thread.
2 ответа
Похоже, что это блокирует приложение, но то, что делает, это обработка событий. Одно из событий должно завершить цикл. Вы можете проверить идею за циклами событий в Википедии.
Если вы не хотите программировать графический интерфейс, то вам не нужен Gtk, вам нужен только Glib. Вот пример, чтобы показать вам, как работает основной цикл (концепция похожа на Gtk и Glib):
from gi.repository import GLib, GObject
counter = 0
def callback(*args):
global counter
counter += 1
print 'callback called', counter
if counter > 10:
print 'last call'
return False
return True
def terminate(*args):
print 'Bye bye'
loop.quit()
GObject.timeout_add(100, callback)
GObject.timeout_add(3000, terminate)
loop = GLib.MainLoop()
loop.run()
Если обратный вызов возвращается False
, тогда он будет удален и больше не вызываться. Если вы хотите, чтобы обратный вызов был вызван снова, он должен вернуть True
(как вы можете видеть в функции callback
).
Я установил еще один обратный звонок terminate
чтобы показать, как выйти из цикла. Если вы не сделаете это явно, то GLib продолжит ждать больше событий (у него нет никакого способа узнать, что вы хотите сделать).
С PyGTK (старым и устаревшим) код будет:
import gobject, glib, gtk
counter = 0
def callback(*args):
global counter
counter += 1
print 'callback called', counter
if counter > 10:
print 'last call'
return False
return True
def terminate(*args):
print 'Bye bye'
loop.quit()
gobject.timeout_add(100, callback)
gobject.timeout_add(3000, terminate)
loop = glib.MainLoop()
loop.run()
Я столкнулся с той же проблемой, то я добавляю это gtk.gdk.threads_init()
перед звонком gtk.mainloop()
, У меня работает нормально