(Py)GTK: 如何强制重绘窗口 / 调用 expose-event?

2 投票
2 回答
3779 浏览
提问于 2025-04-16 08:13

目前我在一个叫做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)。

撰写回答