我是 GPSD 的维护者。得知 pygtk 的 gobject 绑定(bind)已被弃用后,我尝试将 Python 测试客户端转发到 python-gi。我使用 pygi-convert.sh script 轻松移植了 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 没有发现任何明显的原因,导致事件参数在 3.x 下传递到 Cairo 上下文,而不是它所期望的并在 2.x 下传递的事件。我只能猜测处理程序签名已更改,但我找不到任何解决该问题的文档。
最佳答案
为通过 Google 搜索找到此内容的任何人回答我自己的问题。
是的,draw 方法在 3.x 中采用不同的签名。该签名包含 Cairo 上下文,但不包含 2.x 中的 Gdk 公开事件。
我能够通过为 sizer 分配事件创建处理程序来进入下一步:
def on_size_allocate(self, _unused, 分配):
self.width = 分配.width
self.height = 分配.height
然后将矩形绘制写为
self.cr.矩形(0, 0, self.宽度, self.高度)
这样我实际上就不再需要公开事件内容了。
但是,为 x,y 参数插入 0 只是一种猜测,该方法采用相对坐标,可能会出现微妙的错误。
关于这些东西的文档很糟糕。
关于python - 移植到 python-gi 时未知的 Cairo 上下文字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36211214/