有没有一种方法可以使用 PyGTK AppIndicator 检测鼠标点击?

5
我有一段简单的Python代码,使用AppIndicator3GI创建了一个Linux托盘指示器。这很好用。但是我想检测和处理对托盘图标的简单单击或双击。
据我所知,例如Telegram 使用 Qt类QSystemTrayIcon,它支持此功能,因为当用户双击托盘图标时,Telegram窗口会显示出来。
  • 我知道AppIndicator3支持scroll_event信号,该信号在用户在托盘图标上滚动鼠标滚轮时触发。
AyatanaAppIndicator3.Indicator接收到滚动事件时发出信号。
还有一个set_secondary_activate_target(menuitem)方法,表示某种方式处理了中键单击事件。
设置menuitemAyatanaAppIndicator3.Indicator图标/标签上发出二次激活事件(即中键单击)时被激活。
有人了解它是如何工作的吗?前面的两个示例都让我想知道为什么没有一个简单的鼠标点击信号/事件。我在想如果可能深入一些,也许可以继承AyatanaAppIndicator3.Indicator 类并重新编写一些事件处理程序?或者更深入地挖掘 StatusNotifierItemActivate 方法,如果这是AppIndicator实现的话?
还是有任何巧妙的解决办法吗?因为这似乎是一个未解答的问题超过十年了,我对“不可能”这个答案感到不满意。
我也知道我不是第一个问这个问题的人。我进行了小型研究,并发现了多个相关线程:

Python AppIndicator绑定 -> 如何检查菜单是否打开?
单击应用程序指示器时如何运行操作
如何编写一个单击指示器(添加中键功能)
当显示/隐藏菜单时,indicator-application不发送信号
处理点击事件和修饰符

1个回答

6
AppIndicator的限制是有意为之的设计选择(请参见背景信息)。
监听鼠标点击事件将无法起作用。
使用AppIndicator,您可以进行以下交互:
主要操作:显示上下文菜单(可能只包含常规菜单项,不能放置任意小部件)。
次要操作:在此上下文菜单中激活一个特定项目(通常在桌面上使用鼠标中键单击)。
监听图标上的鼠标滚动事件。
您需要切换到另一种解决方案来检测任意鼠标点击。在这里,我假设您想坚持使用Python/GTK,因为您已经相应地标记了您的问题。
一种解决方案是使用基于相当老旧的System Tray Protocol Specification的Gtk.StatusIcon。问题是,这个解决方案正在逐渐被淘汰。它在GTK3中被标记为不推荐使用,在GTK4中已被删除。
我所知道的唯一其他可行的解决方案是libxapps(由Mint Linux提供)。它具有XApp.StatusIcon,专门设计为Gtk.StatusIcon的现代替代品。它支持所有可以显示托盘图标的桌面环境。
背景信息:
Ubuntu桌面体验团队认为Linux桌面通知区域是一个“问题区域”。具体而言,他们批评了不同应用程序状态图标在用户体验和样式上的不一致性。他们建议将用户交互限制在几种标准化的方式上。这项努力导致了AppIndicator的开发。(来源) 顺便说一句,这里还有另一篇旧的(2011年)但有趣的博客文章介绍了不同的解决方案:
Qt应用程序的StatusNotifierItem(又称应用指示器)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接