在 Python 中,使用 gtk.main() 来启动一个 GTK+ 应用程序的主循环。在主循环中,应用程序会处理用户输入和进行图形更新。主循环通常会在应用程序启动后一直运行,直到用户关闭应用程序。
然而,在某些情况下,需要在主循环执行一段时间后继续执行代码。例如,您可能需要从网络上获取数据或执行一些后台任务。
2、解决方案
为了解决这个问题,可以将主循环放在一个单独的线程中,这样主线程就可以继续执行代码。具体步骤如下:
- 在主线程中创建一个新线程。
- 将主循环放入新线程中。
- 在主线程中等待新线程完成。
以下是一个代码示例:
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() 函数来安排一个回调函数在主循环中执行。