Как создать дополнительный бесконечный цикл в программе GTK / Python? - PullRequest
0 голосов
/ 16 декабря 2011

Новое в этом, я знаю, что программа должна входить в бесконечный цикл при вызове gtk.main.Цикл в gtk.main будет разорван при вызове self.quit.

Но мне нужен еще один активный цикл, который бы проверял файл журнала на наличие изменений и продолжал обновлять изменения в gtk.Textbuffer, чтобыпоказано в текстовом поле gtk.Textbox.Так, где я могу добавить этот цикл в следующем коде.

class MessageBox:

    def __init__(self):
        builder = gtk.Builder()
        builder.add_from_file("mbx.glade")
        self.window = builder.get_object("window")
        dic = { "on_buttonSend_clicked" : self.sendmsg,
                "on_entry_activate" : self.sendmsg,
                "on_buttonWhois_clicked" : self.sendwhois,
                "on_buttonIdleTime_clicked" : self.sendidletime,
                "on_window_destroy" : self.exitfunc}
        builder.connect_signals(dic)
        self.entry = builder.get_object("entry")
        self.display = builder.get_object("display")
        self.displaybuff=self.display.get_buffer()

    def exitfunc(self, widget):


    def sendmsg(self, widget):


    def sendwhois (self, widget):


    def sendidletime (self, widget):


if __name__ == "__main__":

    msgbox = MessageBox()
    msgbox.window.show()
    gtk.main()

1 Ответ

5 голосов
/ 16 декабря 2011

Существует только один основной цикл в gtk одновременно, то есть gtk.main выходит на новый уровень и gtk.main_quit существует с этого уровня.

Обычно, что вам нужноdo is - это рабочий поток create, который продолжает работать параллельно и обновляет виджеты при получении новой информации.Тем не менее, в соответствии с описанной вами проблемой, я считаю, что вам просто нужно отслеживать файл на предмет изменений с gio следующим образом:

monitor = gio.File(filename).monitor()
monitor.connect('changed', file_changed_cb)

При каждом изменении файла будет издан сигнал, и file_changed_cbметод обратного вызова будет выполнен.Там вы можете обновить виджеты, чтобы они соответствовали новой информации из отслеживаемого файла.Однако обратите внимание, что если ваш метод обратного вызова занимает слишком много времени для завершения, ваше приложение может выглядеть не отвечающим, то вам нужно перейти к стратегии потока.

...