1

我是 GPSD 的维护者。得知 pygtk 的 gobject 绑定已被弃用,我正在尝试将我们的 Python 测试客户端转发到 python-gi。我使用 pygi-convert.sh脚本轻松移植了 xgps ,但现在在使用 xgpsspeed 时遇到了困难。

在 xgpsspeed 上运行 pygi-convert.sh 后,我首先必须手动修复“expose_event”信号,将其更改为“draw”。我预料到了这一点,因为我必须在成功的 xgps 端口中做同样的事情。

运行修补版本会引发此错误:

Traceback (most recent call last):
  File "./xgpsspeed", line 72, in draw
    event.area.x,
AttributeError: 'cairo.Context' object has no attribute 'area'

这显然与方法处理程序中的这部分代码有关:

def draw(self, _unused, event, _empty=None):
    self.cr = self.get_window().cairo_create()
    self.cr.rectangle(
        event.area.x,
        event.area.y,
        event.area.width,
        event.area.height
    )

我的 search-fu 没有找到任何明显的理由来让 event 参数在 3.x 下被传递给 Cairo 上下文,而不是它所期望的并在 2.x 下传递的事件。我只能猜测处理程序签名已更改,但我找不到任何解决该问题的文档。

4

1 回答 1

2

对于通过 Google 搜索找到此问题的任何人,请回答我自己的问题。

是的,draw 方法在 3.x 中采用不同的签名。该签名包括 Cairo 上下文,但包括2.x 中的 Gdk 公开事件。

通过为 sizer 分配事件创建一个处理程序,我能够进入下一步:

def on_size_allocate(self, _unused, allocation): self.width = allocation.width self.height = allocation.height

然后将矩形绘制为

self.cr.rectangle(0, 0, self.width, self.height)

这样我就不再需要公开事件内容了。

但是,为 x,y 参数插入 0 只是猜测该方法采用相对坐标并且可能存在细微错误。

关于这些东西的文档很糟糕

于 2016-03-25T05:00:10.480 回答