我正在帮助一个位于ubuntu通知区域的加密货币投票机的github项目。它使用libappindicator和gtk来显示,并使用glib来设置超时。
完整代码在此处:https://github.com/bluppfisk/coinprice-indicator/tree/separate_tickers
现在,由于Appindicator的限制,我决定从主线程为我展示的每个自动收报机运行一个新的appindicator实例,并将一个单独的appindicator图标作为应用程序的“主菜单”。
然后,因为Gtk.main()
进程会阻止我的脚本执行任何其他操作,所以我无法首先加载主菜单,然后在数据进入时添加每个自动收录器。所以我决定单独运行Gtk.main()
线程。
这大部分工作正常:首先加载主图标,然后主线程触发其对股票信息的HTTP请求,另一个指示符在通知区域中显示正确的数据之后。
但是,每当主线程启动这些HTTP连接时,我都无法触发使用Gtk.AboutDialog()
创建的关于对话框。此外,About Dialog上的关闭按钮以及任何其他UI元素仅在HTTP请求完成时作出反应。
我认为在一个单独的线程中运行Gtk.main()
会同时运行它吗?
这是有趣的代码:
import threading, gi
import from gi.repository Gtk, GdkPixbuf, GObject
try:
from gi.repository import AppIndicator3 as AppIndicator
except ImportError:
from gi.repository import AppIndicator
Class Coin(Object):
def __init__(self):
self.gui_ready = threading.Event()
self.start_main()
self.add_indicator()
self.add_indicator()
Gtk.main()
def start_main()
self.main_item = AppIndicator.Indicator.new(appname, icon, AppIndicator.IndicatorCategory.APPLICATION_STATUS)
self.main_item.set_status(AppIndicator.IndicatorStatus.ACTIVE)
self.main_item.set_label("", "")
self.main_item.set_menu(self._menu())
self.gui_thread = threading.Thread(target=self.start_gui_thread)
self.gui_thread.start()
self.gui_ready.wait()
def start_gui_thread(self):
GObject.threads_init()
self.gui_ready.set()
Gtk.main()
def _menu(self):
menu = Gtk.Menu()
self.about_item = Gtk.MenuItem("About")
self.about_item.connect("activate", self._about)
def _about(self, widget):
about = Gtk.AboutDialog()
# rest of code to run dialog, incl. buttons to close
def add_indicator(self, settings=None):
indicator = Indicator(self, len(self.instances), self.config, settings)
self.instances.append(indicator)