单击后如何保持 PyGTK AppIndicator 菜单打开?
How to keep PyGTK AppIndicator menu open after click?
我在 Ubuntu 17.10 时尝试使用 pygtk
模块在我的顶部栏中制作应用指示器。
经过一些研究,我成功地制作了一个菜单,您可以在其中暂停主线程(目前只向控制台打印 "Update"。)
现在我遇到了一个问题,找不到答案。
我计划为顶部栏制作一个无线电流媒体,每次点击时关闭的菜单对于搜索时的导航来说是非常不受欢迎的。
单击项目时如何使菜单保持打开状态?
这是我的代码:
import os
import signal
import time
from threading import Thread
import gi
gi.require_version("Gtk", "3.0")
gi.require_version("AppIndicator3", "0.1")
from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import GObject as gobject
class Indicator:
def __init__(self, name=None, icon=None):
self.path = os.path.abspath(os.path.dirname(__file__))
signal.signal(signal.SIGINT, signal.SIG_DFL)
if name is None:
self.name = "MyApp"
else:
self.name = name
if icon is None:
self.icon = gtk.STOCK_INFO
else:
self.icon = icon
self.indicator = appindicator.Indicator.new(
self.name, self.icon,
appindicator.IndicatorCategory.SYSTEM_SERVICES
)
self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.running = True
self.paused = False
self.thread = Thread(target=self.update)
self.thread.setDaemon(True)
self.thread.start()
def create_menu(self):
menu = gtk.Menu()
pause_entry = gtk.MenuItem("Pause")
pause_entry.connect("activate", self.pause)
menu.append(pause_entry)
quit_entry = gtk.MenuItem("Quit")
quit_entry.connect("activate", self.quit)
menu.append(quit_entry)
menu.show_all()
return menu
def update(self):
while self.running:
time.sleep(1)
if not self.paused:
print("Update", flush=True)
def start(self):
gobject.threads_init()
gtk.main()
def pause(self, menu):
self.paused = not self.paused
text = "Resume" if self.paused else "Pause"
for widget in menu.get_children():
print(widget.get_text())
widget.set_text(text)
def quit(self, menu=None):
self.running = False
gtk.main_quit()
if __name__ == "__main__":
indicator = Indicator()
indicator.start()
遗憾的是,我认为您无法在单击项目时让菜单保持打开状态。
这是 AppIndicator 开发人员特意设计的decision,目的是确保指示器以一致和统一的方式运行,并且不会出现自定义操作(例如右键单击、鼠标悬停等)最终用户可以应用。
我创建了一个 appindicator 实时显示新闻,当我研究相关 pygtk/appindicator API 参考 material 时;我遇到的唯一允许支持的菜单操作是滚动。
关于您的无线电流媒体项目,我建议将菜单作为您应用程序的主要焦点,并将菜单项适当地提交给 pygtk windows。然后使用 callbacks and signals 执行必要的操作。这也是我在我的小项目中采用的方法,结果非常好。
我在 Ubuntu 17.10 时尝试使用 pygtk
模块在我的顶部栏中制作应用指示器。
经过一些研究,我成功地制作了一个菜单,您可以在其中暂停主线程(目前只向控制台打印 "Update"。)
现在我遇到了一个问题,找不到答案。
我计划为顶部栏制作一个无线电流媒体,每次点击时关闭的菜单对于搜索时的导航来说是非常不受欢迎的。
单击项目时如何使菜单保持打开状态?
这是我的代码:
import os
import signal
import time
from threading import Thread
import gi
gi.require_version("Gtk", "3.0")
gi.require_version("AppIndicator3", "0.1")
from gi.repository import Gtk as gtk
from gi.repository import AppIndicator3 as appindicator
from gi.repository import GObject as gobject
class Indicator:
def __init__(self, name=None, icon=None):
self.path = os.path.abspath(os.path.dirname(__file__))
signal.signal(signal.SIGINT, signal.SIG_DFL)
if name is None:
self.name = "MyApp"
else:
self.name = name
if icon is None:
self.icon = gtk.STOCK_INFO
else:
self.icon = icon
self.indicator = appindicator.Indicator.new(
self.name, self.icon,
appindicator.IndicatorCategory.SYSTEM_SERVICES
)
self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.running = True
self.paused = False
self.thread = Thread(target=self.update)
self.thread.setDaemon(True)
self.thread.start()
def create_menu(self):
menu = gtk.Menu()
pause_entry = gtk.MenuItem("Pause")
pause_entry.connect("activate", self.pause)
menu.append(pause_entry)
quit_entry = gtk.MenuItem("Quit")
quit_entry.connect("activate", self.quit)
menu.append(quit_entry)
menu.show_all()
return menu
def update(self):
while self.running:
time.sleep(1)
if not self.paused:
print("Update", flush=True)
def start(self):
gobject.threads_init()
gtk.main()
def pause(self, menu):
self.paused = not self.paused
text = "Resume" if self.paused else "Pause"
for widget in menu.get_children():
print(widget.get_text())
widget.set_text(text)
def quit(self, menu=None):
self.running = False
gtk.main_quit()
if __name__ == "__main__":
indicator = Indicator()
indicator.start()
遗憾的是,我认为您无法在单击项目时让菜单保持打开状态。
这是 AppIndicator 开发人员特意设计的decision,目的是确保指示器以一致和统一的方式运行,并且不会出现自定义操作(例如右键单击、鼠标悬停等)最终用户可以应用。
我创建了一个 appindicator 实时显示新闻,当我研究相关 pygtk/appindicator API 参考 material 时;我遇到的唯一允许支持的菜单操作是滚动。
关于您的无线电流媒体项目,我建议将菜单作为您应用程序的主要焦点,并将菜单项适当地提交给 pygtk windows。然后使用 callbacks and signals 执行必要的操作。这也是我在我的小项目中采用的方法,结果非常好。