Как сделать мини пример для 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)
Также проверьте рисунок с Каиром, который является предпочтительным и более гибким способом. Вот учебник.