【发布时间】:2010-12-08 02:15:20
【问题描述】:
目前,我在 DrawingArea 的子类中绘制一些东西,在该子类中,我在暴露事件中获取 cairo 上下文并从那里调用绘制方法。 (根据我找到的一些 PyGTK 教程)
我习惯用java做repaint(),但是这里怎么能得到同样的效果呢?
【问题讨论】:
目前,我在 DrawingArea 的子类中绘制一些东西,在该子类中,我在暴露事件中获取 cairo 上下文并从那里调用绘制方法。 (根据我找到的一些 PyGTK 教程)
我习惯用java做repaint(),但是这里怎么能得到同样的效果呢?
【问题讨论】:
按照您的建议使用queue_draw(实际上是为每个小部件定义的)是异步执行此操作的正确方法。 documentation 明确指出:
gtk_widget_draw 已弃用,不应在新编写的代码中使用。
在 GTK+ 1.2 中,此函数将通过调用小部件的虚拟绘制方法立即渲染小部件的区域区域。在 GTK+ 2.0 中,draw 方法消失了,而 gtk_widget_draw() 只是简单地使小部件的指定区域无效,然后立即更新小部件的无效区域。通常出于性能原因您不想立即更新该区域,因此如果您想绘制一个小部件的区域,通常 gtk_widget_queue_draw_area() 是更好的选择。
如果你担心绘制延迟太高,那么不要同步绘制,你应该只使需要重绘的区域无效(使用queue_draw_area)。
【讨论】:
我找到了一个使用 queue_draw() 方法的解决方案(可从 Gtk.DrawingArea 调用,但似乎是每个 gtk 小部件必须具有的方法),但可能有替代方案,因为这意味着它可能会延迟,即使在我的测试没有发生。
【讨论】: