我正在为 Ubuntu 应用程序对决编写一个应用程序,并尝试使用此应用程序读取/写入用户的个人资料图片
>>> from gi.repository import AccountsService, GLib
>>> current_user = GLib.get_user_name()
>>> user = AccountsService.UserManager.get_default().get_user(current_user)
>>> print user.get_icon_file()
None
>>> print user.get_user_name()
None
但显然不起作用。还有其他方法可以将 AccountsService 与 Python 结合使用吗?我找不到有关 AccountsService 和 Python 的更多文档。
PS:为了测试此示例,您需要gir1.2-accountsservice-1.0
在 Ubuntu 12.04 上安装。
$ sudo apt-get install gir1.2-accountsservice-1.0
答案1
查看 libaccountsservice 的源代码后,您实际上必须等待用户加载后才能访问用户对象。这实现了以下结果:
from gi.repository import AccountsService, GLib
current_user = GLib.get_user_name()
user = AccountsService.UserManager.get_default().get_user(current_user)
def is_loaded_cb(user, param):
print user.get_icon_file()
user.connect('notify::is-loaded', is_loaded_cb)
main_loop = GLib.MainLoop()
main_loop.run()
或者,您可以通过 D-Bus 直接同步联系帐户服务:
from gi.repository import GLib, Gio
current_user = GLib.get_user_name ()
bus = Gio.bus_get_sync (Gio.BusType.SYSTEM, None)
result = bus.call_sync ('org.freedesktop.Accounts',
'/org/freedesktop/Accounts',
'org.freedesktop.Accounts',
'FindUserByName',
GLib.Variant ('(s)', (current_user,)),
GLib.VariantType.new ('(o)'),
Gio.DBusCallFlags.NONE,
-1,
None)
(path,) = result.unpack ()
result = bus.call_sync ('org.freedesktop.Accounts',
path,
'org.freedesktop.DBus.Properties',
'GetAll',
GLib.Variant ('(s)', ('org.freedesktop.Accounts.User',)),
GLib.VariantType.new ('(a{sv})'),
Gio.DBusCallFlags.NONE,
-1,
None)
(props,) = result.unpack ()
print props['IconFile']
print props['RealName']
如果要设置图标文件则需要调用相应的方法:
result = bus.call_sync ('org.freedesktop.Accounts',
path,
'org.freedesktop.Accounts.User',
'SetIconFile',
GLib.Variant ('(s)', ('/tmp/somefile.png',)),
GLib.VariantType.new ('()'),
Gio.DBusCallFlags.NONE,
-1,
None)
如果您需要使用任何其他方法,请使用 D-Feet(在软件中心)浏览 D-Bus 接口。