有没有办法用 PyGTK AppIndicator 检测鼠标点击
Is there a way to detect a mouse click with PyGTK AppIndicator
我有一个简单的 Python 代码,它使用 AppIndicator3 from GI 创建一个 Linux 托盘指示器。那很好用。但我想检测并处理简单的用户点击或双击此托盘图标。
据我所知,例如,Telegram uses Qt class QSystemTrayIcon,它支持此功能,因为当用户双击托盘图标时,Telegram window 会自动显示。
- 我知道 AppIndicator3 支持
scroll_event
当用户在托盘图标上滚动鼠标滚轮时触发的信号。
Signaled when the AyatanaAppIndicator3.Indicator
receives a scroll event.
- 还有一个
set_secondary_activate_target(menuitem)
方法指示以某种方式处理了中键单击事件。
Set the menuitem
to be activated when a secondary activation event
(i.e. a middle-click) is emitted over the
AyatanaAppIndicator3.Indicator
icon/label.
有人知道它是如何工作的吗?前面的两个例子都让我想知道为什么没有简单的鼠标点击 signal/event。我在想是否有可能更深入,也许继承 AyatanaAppIndicator3.Indicator class and rewrote some event handling? Or maybe dig even deeper into StatusNotifierItem and Activate 方法,如果它是 AppIndicator 实现的?
或者对此有什么棘手的解决方法吗?因为这似乎是一个十几年没有答案的问题,我对“不可能”的回答不满意
我也知道我不是第一个问这个问题的人。我做了一些小调查,发现了多个相关主题:
Python AppIndicator bindings -> howto check if the menu is open?
How to run an action when clicking on an appindicator
How to program a one click indicator (add middle click functionality)?
indicator-application does not send signals when a menu is shown/hidden
handle click events and modifiers
AppIndicator 的感知限制是故意的设计选择(请参阅背景信息)。
监听鼠标点击事件不会工作。
使用 AppIndicator 您可以进行以下交互:
- 主要操作:显示上下文菜单(可能只包含常规菜单项,不能放置任意小部件)。
- 次要操作:激活此上下文菜单中的一项特定项目(通常在桌面上单击鼠标中键)。
- 监听图标上的鼠标滚动事件。
您将需要切换到另一个检测任意鼠标点击的解决方案。在这里,我假设您想坚持 Python/GTK,因为您相应地标记了您的问题。
一种解决方案是使用基于相当古老的 System Tray Protocol Specification 的 Gtk.StatusIcon。问题是这个解决方案正在慢慢被淘汰。它在 GTK3 中标记为已弃用,并已在 GTK4 中删除。
我知道的唯一其他可行的解决方案是 libxapps (by Mint Linux). It features XApp.StatusIcon,它专门设计用于 Gtk.StatusIcon 的现代替代品。它支持所有可以显示托盘图标的桌面环境。
背景资料
Ubuntu 桌面体验团队将 Linux 桌面通知区域视为“问题区域”。具体来说,他们批评了不同应用状态图标在用户体验和风格上的不一致。他们提议将用户交互限制为几种标准化方式。这一努力促成了 AppIndicator 的开发。
(Source)
顺便说一句,这是另一篇关于不同解决方案的旧博客(2011 年),尽管很有趣 post:
StatusNotifierItem (aka App Indicators) for Qt applications
我有一个简单的 Python 代码,它使用 AppIndicator3 from GI 创建一个 Linux 托盘指示器。那很好用。但我想检测并处理简单的用户点击或双击此托盘图标。
据我所知,例如,Telegram uses Qt class QSystemTrayIcon,它支持此功能,因为当用户双击托盘图标时,Telegram window 会自动显示。
- 我知道 AppIndicator3 支持
scroll_event
当用户在托盘图标上滚动鼠标滚轮时触发的信号。
Signaled when the
AyatanaAppIndicator3.Indicator
receives a scroll event.
- 还有一个
set_secondary_activate_target(menuitem)
方法指示以某种方式处理了中键单击事件。
Set the
menuitem
to be activated when a secondary activation event (i.e. a middle-click) is emitted over theAyatanaAppIndicator3.Indicator
icon/label.
有人知道它是如何工作的吗?前面的两个例子都让我想知道为什么没有简单的鼠标点击 signal/event。我在想是否有可能更深入,也许继承 AyatanaAppIndicator3.Indicator class and rewrote some event handling? Or maybe dig even deeper into StatusNotifierItem and Activate 方法,如果它是 AppIndicator 实现的?
或者对此有什么棘手的解决方法吗?因为这似乎是一个十几年没有答案的问题,我对“不可能”的回答不满意
我也知道我不是第一个问这个问题的人。我做了一些小调查,发现了多个相关主题:
Python AppIndicator bindings -> howto check if the menu is open?
How to run an action when clicking on an appindicator
How to program a one click indicator (add middle click functionality)?
indicator-application does not send signals when a menu is shown/hidden
handle click events and modifiers
AppIndicator 的感知限制是故意的设计选择(请参阅背景信息)。
监听鼠标点击事件不会工作。
使用 AppIndicator 您可以进行以下交互:
- 主要操作:显示上下文菜单(可能只包含常规菜单项,不能放置任意小部件)。
- 次要操作:激活此上下文菜单中的一项特定项目(通常在桌面上单击鼠标中键)。
- 监听图标上的鼠标滚动事件。
您将需要切换到另一个检测任意鼠标点击的解决方案。在这里,我假设您想坚持 Python/GTK,因为您相应地标记了您的问题。
一种解决方案是使用基于相当古老的 System Tray Protocol Specification 的 Gtk.StatusIcon。问题是这个解决方案正在慢慢被淘汰。它在 GTK3 中标记为已弃用,并已在 GTK4 中删除。
我知道的唯一其他可行的解决方案是 libxapps (by Mint Linux). It features XApp.StatusIcon,它专门设计用于 Gtk.StatusIcon 的现代替代品。它支持所有可以显示托盘图标的桌面环境。
背景资料
Ubuntu 桌面体验团队将 Linux 桌面通知区域视为“问题区域”。具体来说,他们批评了不同应用状态图标在用户体验和风格上的不一致。他们提议将用户交互限制为几种标准化方式。这一努力促成了 AppIndicator 的开发。 (Source)
顺便说一句,这是另一篇关于不同解决方案的旧博客(2011 年),尽管很有趣 post:
StatusNotifierItem (aka App Indicators) for Qt applications