Gio.VolumeMonitor: get_volumes()没有更新?

问题描述 投票:0回答:1

我想验证我的智能手机是否通过USB正确连接,以便通过MTP传输文件。

from gi.repository import Gio
volume_monitor = Gio.VolumeMonitor.get()
for volume in volume_monitor.get_volumes():
    activation_root = volume.get_activation_root()
    if activation_root:
        if activation_root.get_uri_scheme() == 'mtp':
            print('mtp found: name = {}'.format(volume.get_name()))

这个脚本工作正常,如果智能手机已经连接好了,就会给我发回智能手机的名字,否则什么都没有。

但如果我用下面的循环做同样的事情,结果总是第一个循环的结果,即使我在两个循环之间连接或断开智能手机。

from gi.repository import Gio
answer = "y"
while answer=="y":
    volume_monitor = Gio.VolumeMonitor.get()
    for volume in volume_monitor.get_volumes():
        activation_root = volume.get_activation_root()
        if activation_root:
            if activation_root.get_uri_scheme() == 'mtp':
                print('mtp found: name = {}'.format(volume.get_name()))
    answer = input("Retry?")

我错过了什么?

PS: 这里描述了相同的问题。模块对象不会更新,直到代码重新启动。


编辑 应声 gianmt

我有一个python脚本,它通过以下方式与用户进行交互 禅意 对话框。

我显示这些不同的状态。

  • 用USB线连接:是 否
  • 安装MTP:是 否
  • 智能手机上的转账授权:是 否

根据这些不同的可能状态,我可以引导用户获得 是的 到所有这些状态。

当一切正常时,我提出运行一个增量备份(rsync--link-dest)从智能手机到Debian。我让他在一个zenity进度条前等待。

为了显示不同的状态,我目前使用的是 gio 通过解析glib的输出来实现二进制。

  • gio mount -li
  • gio info mtp://smarphone_hostname/
  • gio info mtp://smarphone_hostname/ | grep filesystem::size

我想使用以下对象和方法:

  • Gio.VolumeMonitor: get_volumes()
  • Gio.Volume: get_activation_root()
  • Gio.File: get_path(), query_filesystem_info('filesystem :: size')

你的解决方案,我也曾考虑过,效果非常好。但我不知道如何将glib主回路集成到我的脚本中。

(环境: Debian Buster, xfce, libmtp, gvfs-mtp-backend, gvfs-fuse)

python-3.x pygobject gobject mtp gio
1个回答
0
投票

你不应该使用 while 循环,但你应该使用 glib mainloop 来使它工作并监听连接,同时你的程序应该监听 mainloop 中发出的信号,见下面修改的脚本。

from gi.repository import Gio, GLib

main = GLib.MainLoop()

def on_volume_added(monitor, volume):
    print (volume.get_name())

volume_monitor = Gio.VolumeMonitor.get()
volume_monitor.connect("volume-added", on_volume_added)

for volume in volume_monitor.get_volumes():
    activation_root = volume.get_activation_root()
    if activation_root:
        if activation_root.get_uri_scheme() == 'mtp':
            print('mtp found: name = {}'.format(volume.get_name()))

main.run()
© www.soinside.com 2019 - 2024. All rights reserved.