Notify.Notification 中的 PyGObject 进度条

PyGObject Progress Bar in Notify.Notification

我正在使用带有 Python 3 的 PyGObject,我想使用其中有一个进度条的 Notify.Notification 来显示通知。进度条不需要更新它的 own/asynchronously 或任何东西——它可以(而且应该)是静态的,只有当我手动设置一个新值然后告诉通知显示时才会更新。我正在寻找类似音量通知之类的东西,它会在您更改音量时显示新音量。

我一直无法找到任何方法来执行此搜索文档,例如 this,这可以使用 PyGObject 吗?或者是否有另一个 Python 3 库允许这种行为?

我目前显示的是基于文本的进度通知,与此类似:

import gi
gi.require_version('Notify', '0.7')
from gi.repository import Notify

def __init___(self):
    ...
    Notify.init("Progress")
    self.notification = Notify.Notification(summary='Progress', body='0%')
    self.notification.set_image_from_pixbuf(notification_image)
    ...

def on_progress_update(self, progress):
    ...
    self.notification.update('Progress', str(progress) + '%', None)
    self.notification.show()
    ...

所以经过更多搜索后,我在 xfce 论坛上找到 this 讨论使用 send-notify 获取 xfce4-notifyd "gauges" 的帖子,并且能够弄清楚如何使用 Notify.Notification.set_hint()。因此,如果您希望通知显示进度 bar/status bar/gauge,您可以使用以下内容:

import gi

gi.require_version('Notify', '0.7')
from gi.repository import GLib, Notify

Notify.init("Name")
notification = Notify.Notification()
notification.set_hint('value', GLib.Variant.new_int32(volume))

注意事项:

  • 设置摘要和正文,如原始问题所示,如果使用此方法似乎毫无意义,因为它们都没有显示,只有进度条。 icon/image 仍然可以显示在进度条旁边,例如notification.set_image_from_pixbuf()
  • GLib.Variant 类型可以是 int32int64double,也可能是其他大于 int32 的数字类型,但不能是 byteint16,任何 uint 类型,例如 uint32,或(我假设)任何 non-numeric 类型。据我所知,请使用 int32
  • 虽然我在其他步骤中使用像 Name 这样的通用名称,但 set_hint 的值必须是 'value' 和小写 v.

另外值得注意的是,我不确定这是否是一种通用方法,或者它是否只适用于 xfce4-notifyd,我只使用 xfce4-notifyd,所以现在我不担心,但如果我调查这个我会尽量记得更新我的答案。或者,如果其他人知道这个问题的答案,请告诉我。

有效,只是想指出复制任何通知的一般方法。

通过 运行 dbus-monitor 和改变音量,像这样的东西应该打印在某处,因为所有通知都是通过 dbus 创建的:

method call time=1598625454.708735 sender=:1.75 -> destination=:1.81 serial=23739 path=/org/freedesktop/Notifications; interface=org.freedesktop.Notifications; member=Notify
   string "Xfce volume control"
   uint32 0
   string "audio-volume-medium-symbolic"
   string "Volume 46%"
   string ""
   array [
   ]
   array [
      dict entry(
         string "transient"
         variant             boolean true
      )
      dict entry(
         string "x-canonical-private-synchronous"
         variant             string ""
      )
      dict entry(
         string "value"
         variant             int32 46
      )
   ]
   int32 2000

这是生成进度条的提示名称和值:

dict entry(
   string "value"
   variant             int32 46
)