Frage

I've written a mini example for DrawingArea which, when started, displays nothing. If I insert a raw_input() just for waiting for a keyboard press at a specific place, it functions, so this is a workaround. Here's the code:

#!/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()

This version doesn't display the drawn line in the opening window; upon pressing enter in the shell, it will just terminate (and remove the window). But if I enable the raw_input() at the if 0: block, it waits twice for an enter in the shell and between the two enters it will display the drawn line (so in general the code works, it seems to be just a weird refresh problem).

I also tried to flush the event queue of GTK using this snippet:

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

I inserted it at various places, always to no avail.

I also tried the usual gtk.main() as the last command in the script (of course). But it also didn't help.

How do I do this correctly and why is that raw_input() having that strange side-effect?

War es hilfreich?

Lösung

You should connect to your drawing area's expose-event signal. That is the only place that you should try to draw on the drawing area; the reason for this is that anything you draw is erased again when the window is minimized or another window moves over it. However, the expose event always happens at the right time so you can keep the drawing up-to-date whenever it is needed.

Like this:

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

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

Also check out drawing with Cairo, which is the preferred and more flexible way. Here is a tutorial.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top