我非常擅长使用菜单创建应用程序指示器。下面的示例中有一个菜单项(退出)。添加另一个项目、我的实际应用程序或要运行的行不会遇到任何问题。
但是,我尝试做的是让项目在单击指示器图标时运行。每次单击指示器图标时,它都会运行。要删除指示器图标,用户将单击退出。
有人能告诉我应该把要运行的代码放在哪里吗?
这是指标代码:
#!/usr/bin/python
import os
import signal
import subprocess
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator
APPINDICATOR_ID = 'appreveallauncher'
def main():
indicator = appindicator.Indicator.new(APPINDICATOR_ID,
os.path.abspath('sample_icon.svg'),
appindicator.IndicatorCategory.SYSTEM_SERVICES)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(build_menu())
gtk.main()
def build_menu():
menu = gtk.Menu()
item_quit1 = gtk.MenuItem('Quit')
item_quit1.connect('activate', quit)
item_reveallauncher = gtk.MenuItem('Reveal Launcher')
item_reveallauncher.connect('activate', reveallauncher)
# This is my attempt to add the middle click functionality
menu_items = gtk.MenuItem("Reveal Launcher Middle Click")
menu.append(menu_items)
menu_items.connect("activate", menu_items)
menu_items.set_secondary_activate_target(menu_items)
menu.append(item_reveallauncher)
menu.append(item_quit1)
menu.show_all()
return menu
def menu_items(_):
subprocess.call("xdotool key alt+F1", shell=True)
def reveallauncher(_):
subprocess.call("xdotool key alt+F1", shell=True)
def quit1(_):
gtk.main_quit()
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
main()
# last = self.get_last_menuitem(self.app_menu)
# self.app.set_secondary_activate_target(last)
以下是该行:
subprocess.call("xdotool key alt+F1", shell=True)
这是运行上述代码时的错误:
Traceback (most recent call last):
File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 57, in <module>
main()
File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 19, in main
indicator.set_menu(build_menu())
File "/home/users/l/j/ljames/workspace/pythontest/src/basic.py", line 35, in build_menu
menu_items.connect("activate", menu_items)
TypeError: second argument must be callable
我想要实现的是当指示器被点击时显示 Ubuntu Launcher。
更新
我已更新上述代码示例,以包含所需操作的行。Sergiy Kolodyazhnyy 已在他的回答中指出了中键单击分辨率。我在底部注释了必要的行。现在,我正在尝试获取这些行的正确语法和位置。
答案1
简短的回答是不能。单击指示器图标只会调出菜单。可以做的是设置中间(滚轮)单击(在触摸板上,右键和左键同时按下),这可以通过设置指示器对象的辅助激活目标来完成。
以下是我自己使用的例子启动器列表指示器在第 152 和 153 行:
152 last = self.get_last_menuitem(self.app_menu)
153 self.app.set_secondary_activate_target(last)
当用户在指示器项上按下鼠标中键时,它将激活特定的菜单项而无需关闭菜单。
您还可以选择使用滚动事件,如下所示:
86 self.app.connect("scroll-event", self.set_next)
答案2
为了消除错误并将 middleclick 功能应用于相关代码(尽管可能存在许多替代方法),我build_menu
在主 si 中的语句中添加了一个参数,即build_menu
定义可以接受一个参数。我称此参数为indicator
。然后添加了 middleclick 方法,set_secondary_activate_target()
。
固定代码:
#!/usr/bin/python
import os
import signal
import subprocess
import gi
from middleClick import reveallauncher
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk as gtk
gi.require_version('AppIndicator3', '0.1')
from gi.repository import AppIndicator3 as appindicator
APPINDICATOR_ID = 'appreveallauncher'
def main():
indicator = appindicator.Indicator.new(APPINDICATOR_ID,
os.path.abspath('sample_icon.svg'),
appindicator.IndicatorCategory.SYSTEM_SERVICES)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(build_menu(indicator))
gtk.main()
def build_menu(indicator):
menu = gtk.Menu()
item_reveallauncher = gtk.MenuItem('Reveal Launcher')
item_reveallauncher.connect('activate', reveallauncher)
indicator.set_secondary_activate_target(item_reveallauncher)
item_quit = gtk.MenuItem('Quit')
item_quit.connect('activate', quit)
menu.append(item_reveallauncher)
menu.append(item_quit)
menu.show_all()
return menu
def reveallauncher(_):
subprocess.call("xdotool key alt+F1", shell=True)
def quit(_):
gtk.main_quit()
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
main()
通过 Google 搜索可以找到该方法的许多示例用法set_secondary_activate_target
。然而,我遇到的问题是,它们都包含在一个复杂的脚本中,以许多依赖行的方式使用。我努力将其放在一个最简单的示例中,以便下一个尝试将其适应他们的代码的人更容易。