2

我写了一个小例子DrawingArea,启动时什么都不显示。如果我插入一个raw_input()只是为了在特定位置等待键盘按下,它会起作用,所以这是一种解决方法。这是代码:

#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk

R = 300

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(R, R)
drawing_area = gtk.DrawingArea()
window.add(drawing_area)
window.show_all()
gc = drawing_area.get_style().fg_gc[gtk.STATE_NORMAL]

if 0:
  raw_input()

drawing_area.window.draw_line(gc, R/10, R/10, R*9/10, R*9/10)

raw_input()

此版本在打开的窗口中不显示画线;在 shell 中按 enter 后,它将终止(并删除窗口)。但是如果我启用raw_input()atif 0:块,它会等待两次在 shell 中输入,并且在两次输入之间它会显示绘制的线(所以通常代码可以工作,这似乎只是一个奇怪的刷新问题)。

我还尝试使用以下代码片段刷新 GTK 的事件队列:

while gtk.events_pending():  # drain the event pipe
  gtk.main_iteration()

我把它插在不同的地方,总是无济于事。

我还尝试了通常gtk.main()作为脚本中最后一个命令的命令(当然)。但这也没有帮助。

我该如何正确地做到这一点,为什么raw_input()会有这种奇怪的副作用?

4

1 回答 1

2

您应该连接到绘图区域的expose-event信号。那是您应该尝试在绘图区域上绘制的唯一位置;这样做的原因是,当窗口最小化或另一个窗口在其上移动时,您绘制的任何内容都会再次被擦除。但是,expose 事件总是在正确的时间发生,因此您可以在需要时随时更新绘图。

像这样:

def on_drawing_area_expose(drawing_area, event, data=None):
    # ... do your drawing here ...

drawing_area.connect('expose-event', on_drawing_area_expose)

还可以查看 Cairo 绘图,这是首选且更灵活的方式。是一个教程。

于 2013-04-13T16:36:05.230 回答