如何编写一个一键单击指示器(添加中键单击功能)?

如何编写一个一键单击指示器(添加中键单击功能)?

我非常擅长使用菜单创建应用程序指示器。下面的示例中有一个菜单项(退出)。添加另一个项目、我的实际应用程序或要运行的行不会遇到任何问题。

但是,我尝试做的是让项目在单击指示器图标时运行。每次单击指示器图标时,它都会运行。要删除指示器图标,用户将单击退出。

有人能告诉我应该把要运行的代码放在哪里吗?

这是指标代码:

#!/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。然而,我遇到的问题是,它们都包含在一个复杂的脚本中,以许多依赖行的方式使用。我努力将其放在一个最简单的示例中,以便下一个尝试将其适应他们的代码的人更容易。

相关内容