首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gio.VolumeMonitor: get_volumes()没有更新吗?

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

Stack Overflow用户
提问于 2020-04-25 11:11:35
回答 1查看 202关注 0票数 0

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

代码语言:javascript
复制
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()))

此脚本工作正常,如果智能手机已连接或没有其他任何连接,则将其发送回智能手机的名称。

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

代码语言:javascript
复制
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安装:是/否
  • 在智能手机上授权的转账:是/否

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

当一切正常时,我提议从智能手机到Debian运行增量备份(rsync--link-dest)。我让他在一个热闹的进度栏前等着。

为了显示不同的状态,我目前正在通过解析以下的输出来使用glib的gio二进制文件:

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

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

  • Gio.VolumeMonitorget_volumes()
  • Gio.Volumeget_activation_root()
  • Gio.Fileget_path()query_filesystem_info('filesystem :: size')

我也考虑过你的解决方案,效果很好。但我不知道如何将glib主循环集成到我的脚本中。

(环境: Debian Buster,xfce,libmtp,gvfs-mtp-后端,gvfs-引信)

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 10:12:35

您不应该使用while循环,但是您应该使用glib主循环来使它工作并侦听连接,您的程序也应该侦听主循环中发出的信号,请参见下面修改的脚本:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61424726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档