如何在 python 中 pygtk.main() 之后继续执行代码

72 阅读2分钟

在 Python 中,使用 gtk.main() 来启动一个 GTK+ 应用程序的主循环。在主循环中,应用程序会处理用户输入和进行图形更新。主循环通常会在应用程序启动后一直运行,直到用户关闭应用程序。

huake_00066_.jpg 然而,在某些情况下,需要在主循环执行一段时间后继续执行代码。例如,您可能需要从网络上获取数据或执行一些后台任务。

2、解决方案

为了解决这个问题,可以将主循环放在一个单独的线程中,这样主线程就可以继续执行代码。具体步骤如下:

  1. 在主线程中创建一个新线程。
  2. 将主循环放入新线程中。
  3. 在主线程中等待新线程完成。

以下是一个代码示例:

import gtk
import threading

class DataFetch(threading.Thread):

    def __init__(self, interval, username, password, check_shout_box):
        super(DataFetch, self).__init__()
        self.interval = interval
        self.username = username
        self.password = password
        self.check_shout_box = check_shout_box

    def run(self):
        gtk.main()

class HBHTray:

    def __init__(self):
        self.status_icon = gtk.StatusIcon()
        self.status_icon.set_from_file('img')
        self.status_icon.set_tooltip('No new messages')

        self.menu = gtk.Menu()
        self.check_box = gtk.CheckMenuItem('Notify')
        self.check_box.connect('activate', self.change_check_box)
        self.check_box.set_active(True)
        self.menu.append(self.check_box)

        self.menu_item = gtk.ImageMenuItem('Options')
        self.menu_item.connect('activate', self.options, self.status_icon)
        self.menu.append(self.menu_item)

        self.menu_item = gtk.ImageMenuItem('About')
        self.menu_item.connect('activate', self.about, self.status_icon)
        self.menu.append(self.menu_item)

        self.menu_item = gtk.ImageMenuItem('Quit')
        self.menu_item.connect('activate', self.quit, self.status_icon)
        self.menu.append(self.menu_item)

        self.status_icon.connect('popup-menu', self.pop_menu, self.menu)
        self.status_icon.set_visible(1)

    def pop_menu(self, widget, button, time, data=None):
        if data:
            data.show_all()
            data.popup(None, None, gtk.status_icon_position_menu, 3, time, self.status_icon)

    def notify(self, message):
        pynotify.init('null')
        notification = pynotify.Notification('Something', message, 'dialogue')
        notification.attach_to_status_icon(self.status_icon)
        notification.show()

    def start(self):
        gtk.main()

    def about(self, a, b):
        self.notify('test')

    def options(self, a, b):
        print(a, b)

    def change_check_box(self, null):
        pass

    def quit(self, a, b):
        raise SystemExit

if __name__ == '__main__':
    interval, username, password, check_shout_box = get_options('.tray')
    gui = HBHTray()
    data_fetch = DataFetch(interval, username, password, check_shout_box)
    data_fetch.start()
    data_fetch.join()

在这个示例中,我们创建了一个新的线程,并将主循环放在了这个线程中。然后,我们在主线程中等待新线程完成。这样,主线程就可以继续执行代码,而主循环则会在新线程中继续运行。

需要注意的是,这种方法仅适用于 GTK+ 2。在 GTK+ 3 中,主循环是默认在主线程中运行的。如果您需要在 GTK+ 3 中继续执行代码,可以使用 GLib 的 g_idle_add() 函数来安排一个回调函数在主循环中执行。