Как сделать мини пример для DrawingArea, отобразить что-нибудь

Я написал мини-пример для 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: блок, он дважды ждет ввода в оболочке и между двумя вводами он отобразит нарисованную линию (так что в целом код работает, кажется, это просто странная проблема обновления).

Я также попытался очистить очередь событий GTK, используя этот фрагмент:

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

Я вставил его в разные места, всегда безрезультатно.

Я тоже попробовал обычный gtk.main() как последняя команда в сценарии (конечно). Но это также не помогло.

Как я делаю это правильно и почему это raw_input() с этим странным побочным эффектом?

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)

Также проверьте рисунок с Каиром, который является предпочтительным и более гибким способом. Вот учебник.

Другие вопросы по тегам