如何在gtk / python程序中创建一个额外的无限循环?

时间:2011-12-16 01:30:02

标签: python gtk pygtk

新的,我知道当你调用gtk.main时程序应该进入一个无限循环。当调用self.quit时,gtk.main中的循环将会中断。

但我需要另一个循环活动,它会检查日志文件中的更改,并不断更新更改到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 个答案:

答案 0 :(得分:5)

gtk同时只存在一个主循环,即gtk.main进入新级别,gtk.main_quit存在于该级别。

通常,您需要做的是创建工作线程,它保持并行工作并在获取新信息时更新窗口小部件。但是,根据您描述的问题,我认为您只需要使用gio监控文件以进行更改,如下所示:

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

每当文件发生变化时,都会发出信号并执行file_changed_cb回调方法。在那里,您可以更新小部件以匹配正在监视的文件中的新信息。但请注意,如果您的回调方法需要很长时间才能完成,那么您的应用程序可能看起来没有响应,那么您必须采用线程策略。