(Py)GTK: 如何强制重绘窗口 / 调用 expose-event?
目前我在一个叫做DrawingArea的子类里画东西。在一个叫做expose-event的事件里,我获取了一个cairo上下文,然后从那里调用一个绘制方法。(这是我在某个PyGTK教程中学到的)
我习惯在Java中使用repaint()来刷新画面,但在这里我该怎么做才能达到同样的效果呢?
2 个回答
0
我找到了一种解决办法,使用了 queue_draw()
这个方法(可以在 Gtk.DrawingArea
中调用,但看起来每个 gtk 组件都应该有这个方法)。不过可能还有其他的选择,因为这个方法可能会有延迟,尽管在我的测试中并没有出现这种情况。
6
你提到的使用 queue_draw
方法(这个方法是为每个小部件定义的)来进行异步绘制,是正确的做法。文档中也明确说明了这一点:
gtk_widget_draw 这个方法已经不推荐使用了,新的代码中不应该使用它。
在 GTK+ 1.2 中,这个方法会立即渲染小部件的区域,通过调用小部件的虚拟绘制方法来实现。但在 GTK+ 2.0 中,绘制方法被移除了,gtk_widget_draw() 只是将指定区域标记为无效,然后立即更新这个无效的区域。通常情况下,为了性能考虑,你不想立即更新这个区域,所以如果你想绘制小部件的某个区域,使用 gtk_widget_queue_draw_area() 会更好。
如果你担心绘制的延迟太高,那么与其同步绘制,不如只标记需要重新绘制的区域(使用 queue_draw_area
)。