Blu*_*nCZ 5 python linux gtk pygtk appindicator
我有一个简单的 Python 代码,它使用GI的AppIndicator3创建一个 Linux 托盘指示器。效果很好。但我想检测并处理简单的用户单击或双击此托盘图标。
据我所知,例如,Telegram使用Qt 类QSystemTrayIcon,它支持此功能,因为当用户双击托盘图标时,Telegram 窗口会自动显示。
scroll_event当用户在托盘图标上滚动鼠标滚轮时触发的信号。当
AyatanaAppIndicator3.Indicator接收到滚动事件时发出信号。
set_secondary_activate_target(menuitem)方法指示以某种方式处理中键单击事件。设置
menuitem为在图标/标签上发出辅助激活事件(即中键单击)时激活AyatanaAppIndicator3.Indicator。
有人了解它是如何工作的吗?前面的两个例子让我想知道为什么没有简单的鼠标单击信号/事件。我在想是否可以更深入,也许继承AyatanaAppIndicator3.Indicator类并重写一些事件处理?或者可能更深入地研究StatusNotifierItem和Activate方法(如果这是 AppIndicator 实现的)?
或者有什么棘手的解决方法吗?因为这似乎是一个十多年来没有答案的问题,我不满足于仅仅“不可能”的答案。
我也知道我不是第一个问这个问题的人。我做了一些小研究,发现了多个相关线程:
Python AppIndicator 绑定 -> 如何检查菜单是否打开?
如何在单击应用程序指示器时运行操作
如何对一键指示器进行编程(添加中键单击功能)?
当菜单显示/隐藏时,指示器应用程序不发送信号处理
单击事件和修饰符
小智 7
AppIndicator 的感知限制是经过深思熟虑的设计选择(请参阅背景信息)。
监听鼠标点击事件将不起作用。
通过 AppIndicator,您可以进行以下交互:
您将需要切换到另一个解决方案来检测任意鼠标点击。在这里,我假设您想坚持使用 Python/GTK,因为您相应地标记了您的问题。
一种解决方案是使用 Gtk.StatusIcon,它基于相当旧的系统托盘协议规范。问题是这个解决方案正在慢慢被淘汰。它在 GTK3 中被标记为已弃用,并在 GTK4 中被删除。
我所知道的唯一可行的解决方案是libxapps(由 Mint Linux 提供)。它具有XApp.StatusIcon,专门设计为 Gtk.StatusIcon 的现代替代品。它支持所有可以显示托盘图标的桌面环境。
背景资料
Ubuntu 桌面体验团队将 Linux 桌面通知区域视为“问题区域”。具体来说,他们批评了不同应用程序状态图标在用户体验和风格上的不一致。他们建议将用户交互限制为几种标准化方式。这项努力促成了 AppIndicator 的开发。 (来源)
顺便说一下,这是另一篇关于不同解决方案的旧(2011)但很有趣的博客文章:
StatusNotifierItem(aka App Indicators)for Qt applications