【发布时间】:2013-04-11 14:05:17
【问题描述】:
我为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 后,它将终止(并删除窗口)。但是如果我在if 0: 块中启用raw_input(),它会等待两次在shell 中输入,并且在两次输入之间它会显示绘制的线(所以通常代码有效,这似乎只是一个奇怪刷新问题)。
我也尝试使用这个 sn-p 刷新 GTK 的事件队列:
while gtk.events_pending(): # drain the event pipe
gtk.main_iteration()
我把它插在不同的地方,总是无济于事。
我还尝试了通常的gtk.main() 作为脚本中的最后一个命令(当然)。但这也无济于事。
我该如何正确执行此操作,为什么 raw_input() 会产生奇怪的副作用?
【问题讨论】:
-
我发现这似乎是一个时间问题。
raw_input()之所以有效,是因为它通常会等待足够长的时间(我总是必须重新关注 shell 窗口,这大约需要一秒钟)。如果我在调用main_iteration()方法后使用事件管道代码sn-p 的排空并插入sleep(0.1),则会处理更多事件,而这些事件一开始似乎并没有在队列中。所以也许我的问题是:我如何确定绘图区域是否准备好接受绘图尝试?有window.is_ready()之类的吗?
标签: python pygtk drawingarea