【问题标题】:How To Make Mini Example For DrawingArea Display Something如何使绘图区域的迷你示例显示一些东西
【发布时间】: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


【解决方案1】:

您应该连接到绘图区域的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 绘图,这是首选且更灵活的方式。 Here 是一个教程。

【讨论】:

  • 这非常有启发性!感谢本教程。 Cairo 似乎内置在 pygtk 的东西中,对吗?实际上,我想在我的绘图中设置数百万个点;多次这样做没有意义(太慢,需要几个小时)。我猜我应该在位图中设置点(单个像素)。我的印象是 DrawingArea 是面向位图的,现在我明白它是面向矢量的。您是否也有关于面向位图的教程的指针?
  • 不,DrawingArea 实际上是面向位图的。但是你真的无法避免多次绘制所有内容。如果绘图时间太长,那么解决方案是使用后备存储;在其上绘制点,并在发生暴露事件时将其绘制到 DrawingArea。
  • 嗯,我猜是缺乏基础知识。在 tkinter 中,我可以创建一个像素图对象,将该像素图放在画布上,然后在像素图中设置位。然后画布会为我刷新。关于如何在 pygtk 中执行此“后备存储”的任何提示? pygtk 中是否有与 tkinter-pixmap 对象等价的对象?
  • 顺便说一句,开罗的东西看起来很整洁,就像你指给我的教程一样。玩弄这些东西...... :-)
  • PyGTK tutorial 中有一个关于使用没有开罗的后备商店进行绘图的示例。还有一个 C example 使用 Cairo,但它也使用较新的 GTK 3 绘图 API。恐怕你得自己拼凑起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
相关资源
最近更新 更多