我为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()
此版本不会在打开窗口中显示绘制的线条;按下进入外壳后,它将终止(并移除窗口)。但是如果我在raw_input()
块上启用if 0:
,它会在shell中输入两次等待,在两次输入之间它将显示绘制的行(所以一般来说代码工作,它似乎只是一个奇怪的刷新问题)。
我还尝试使用此代码段刷新GTK的事件队列:
while gtk.events_pending(): # drain the event pipe
gtk.main_iteration()
我把它插在各个地方,总是无济于事。
我还尝试了通常的gtk.main()
作为脚本中的最后一个命令(当然)。但它也没有帮助。
我如何正确地做到这一点,为什么raw_input()
有这种奇怪的副作用?
答案 0 :(得分:2)
您应该连接到绘图区域的expose-event
信号。这是你应该尝试在绘图区域绘制的唯一地方;这样做的原因是,当窗口最小化或其他窗口移动时,您绘制的任何内容都会再次被删除。但是,曝光事件总是在正确的时间发生,因此您可以在需要时使绘图保持最新。
像这样:
def on_drawing_area_expose(drawing_area, event, data=None):
# ... do your drawing here ...
drawing_area.connect('expose-event', on_drawing_area_expose)
同时查看使用Cairo绘图,这是首选且更灵活的方式。 Here是一个教程。