从 Web Flask App 更新 GTK 菜单
Update GTK menu from Web Flask App
我正在尝试创建一个 Ubuntu 指示器,它在一个单独的线程中启动一个 Flask 应用程序(使用 multiprocessing.Process
),然后从 Flask 应用程序中的一个操作中,将一个项目添加到指示器菜单(在这个简化的代码中,就在加载根页面时,应该创建一个具有当前日期时间的菜单项)。问题是虽然没有错误,但没有创建菜单。我按照其他地方的建议使用 GLib.idle_add
但没有成功。这是代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import argparse
from datetime import datetime
from flask import Flask
from multiprocessing import Process
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, GLib, AppIndicator3
APP_ID = "test"
APP_ICON = "test"
class GtkFlaskIndicatorTest(object):
def __init__(self, debug):
self.indicator = AppIndicator3.Indicator.new(APP_ID, APP_ICON, AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
GLib.threads_init()
self.app = GtkFlaskApp(self, debug)
self.app.start_app()
self.menu = None
self.quit_menu_item = None
self.build_menu()
Gtk.main()
def build_menu(self):
self.menu = Gtk.Menu()
self.quit_menu_item = Gtk.MenuItem(u"Quit")
self.quit_menu_item.connect('activate', self.quit)
self.menu.append(self.quit_menu_item)
self.menu.show_all()
self.indicator.set_menu(self.menu)
def add_menu_item(self, text):
print "add_menu_item: " + text
GLib.idle_add(self.add_menu_item_cb, text)
def add_menu_item_cb(self, text):
print "add_menu_item_cb: " + text
item = Gtk.MenuItem(text)
self.menu.append(item)
self.menu.show_all()
def quit_control_c(self, signal, frame):
self.quit(None)
def quit(self, source):
self.app.stop_app()
Gtk.main_quit()
class GtkFlaskApp(object):
def __init__(self, indicator, debug):
self.indicator = indicator
self.debug = debug
self.app = Flask("GtkFlaskFlaskApp")
self.app.add_url_rule('/', 'test', self.test)
def test(self):
text = str(datetime.now())
self.indicator.add_menu_item(text)
return text
def start_app(self):
self.app_server = Process(target=self.start_app_thread)
self.app_server.start()
def start_app_thread(self):
self.app.run(port=8888, debug=self.debug, use_reloader=False)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
parser = argparse.ArgumentParser()
parser.add_argument('--debug', action='store_true')
args = parser.parse_args()
GtkFlaskIndicatorTest(args.debug)
已解决,都是模块multiprocessing.Process
的问题。替换为 threading.Thread
,现在一切正常。
我正在尝试创建一个 Ubuntu 指示器,它在一个单独的线程中启动一个 Flask 应用程序(使用 multiprocessing.Process
),然后从 Flask 应用程序中的一个操作中,将一个项目添加到指示器菜单(在这个简化的代码中,就在加载根页面时,应该创建一个具有当前日期时间的菜单项)。问题是虽然没有错误,但没有创建菜单。我按照其他地方的建议使用 GLib.idle_add
但没有成功。这是代码:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import argparse
from datetime import datetime
from flask import Flask
from multiprocessing import Process
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, GLib, AppIndicator3
APP_ID = "test"
APP_ICON = "test"
class GtkFlaskIndicatorTest(object):
def __init__(self, debug):
self.indicator = AppIndicator3.Indicator.new(APP_ID, APP_ICON, AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
GLib.threads_init()
self.app = GtkFlaskApp(self, debug)
self.app.start_app()
self.menu = None
self.quit_menu_item = None
self.build_menu()
Gtk.main()
def build_menu(self):
self.menu = Gtk.Menu()
self.quit_menu_item = Gtk.MenuItem(u"Quit")
self.quit_menu_item.connect('activate', self.quit)
self.menu.append(self.quit_menu_item)
self.menu.show_all()
self.indicator.set_menu(self.menu)
def add_menu_item(self, text):
print "add_menu_item: " + text
GLib.idle_add(self.add_menu_item_cb, text)
def add_menu_item_cb(self, text):
print "add_menu_item_cb: " + text
item = Gtk.MenuItem(text)
self.menu.append(item)
self.menu.show_all()
def quit_control_c(self, signal, frame):
self.quit(None)
def quit(self, source):
self.app.stop_app()
Gtk.main_quit()
class GtkFlaskApp(object):
def __init__(self, indicator, debug):
self.indicator = indicator
self.debug = debug
self.app = Flask("GtkFlaskFlaskApp")
self.app.add_url_rule('/', 'test', self.test)
def test(self):
text = str(datetime.now())
self.indicator.add_menu_item(text)
return text
def start_app(self):
self.app_server = Process(target=self.start_app_thread)
self.app_server.start()
def start_app_thread(self):
self.app.run(port=8888, debug=self.debug, use_reloader=False)
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
parser = argparse.ArgumentParser()
parser.add_argument('--debug', action='store_true')
args = parser.parse_args()
GtkFlaskIndicatorTest(args.debug)
已解决,都是模块multiprocessing.Process
的问题。替换为 threading.Thread
,现在一切正常。