ГТК основные блоки - Питон

Я новичок в 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(), У меня работает нормально

Другие вопросы по тегам