【问题标题】:Define a GLib.Variant in Python在 Python 中定义一个 GLib.Variant
【发布时间】:2017-06-22 11:58:24
【问题描述】:

我正在尝试在 Python 中定义 GLib.Variant 数据类型以将其与 pydbus 库一起使用。这是我的尝试:

#!/usr/bin/python

from gi.repository import GLib
from pydbus import SessionBus

var1 = GLib.Variant.new_variant('draw-cursor', False)
var2 = GLib.Variant.new_variant('framerate', 30)

bus = SessionBus()
calling = bus.get('org.gnome.Shell.Screencast', '/org/gnome/Shell/Screencast')

calling.Screencast('out.webm', {var1, var2})

但是它说TypeError: GLib.Variant.new_variant() takes exactly 1 argument (2 given)。我可以清楚地看到这一点。但是,我怎样才能为我将定义的值分配?不应该是像{'framerate': 30}这样的字典吗?

【问题讨论】:

    标签: python glib dbus gvariant


    【解决方案1】:

    第二次失败 (AttributeError: 'Variant' object has no attribute 'items') 似乎是因为pydbus 期望您传入dict,而不是GLib.Variant,并且它无条件地将您传入的任何内容包装在GLib.Variant 中。这意味着它会尝试从options 变体中获取items,但由于GLib.Variant 不支持该变体而失败。

    此代码适用于pydbus

    calling.Screencast('out.webm', {
        'draw-cursor': GLib.Variant('b', False),
        'framerate': GLib.Variant('i', 30)
    })
    

    【讨论】:

      【解决方案2】:

      options 参数的类型为 a{sv},因此您可能需要明确提供类型:

      options = GLib.Variant('a{sv}', {
          'draw-cursor': GLib.Variant('b', False),
          'framerate': GLib.Variant('i', 30),
      })
      

      【讨论】:

      • 现在显示:AttributeError: 'Variant' object has no attribute 'items'。我不知道这是否是 GLib 本身的错误。
      • 它对我有用;顺便说一下,这是最新的 GLib 和 Python 3。
      • 嗯,我也有。然而它产生了错误。完整代码为:pastebin.mozilla.org/8976332对吗?
      • 你没有说错误来自Screencast 现在的调用。您确定首先需要在那里传递一个变体吗?
      • 是的。在许多其他地方旁边的一些文档中提到了它。这也是一个例子:askubuntu.com/questions/359587/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2010-12-02
      • 2018-02-01
      • 2011-02-06
      • 2014-01-03
      相关资源
      最近更新 更多