(Py)GTK: Как я могу заставить мое окно перерисовываться/вызывать expose-event?

В настоящее время я рисую некоторые вещи в подклассе DrawingArea, где я получаю контекст cairo внутри события expose и вызываю оттуда метод рисования. (согласно некоторому учебнику PyGTK, который я нашел)

Я привык делать repaint() с помощью java, но как мне получить здесь тот же эффект?


person otirra    schedule 08.12.2010    source источник


Ответы (2)


Использование queue_draw (что на самом деле определено для каждого виджета), как вы предложили, это правильный способ сделать это асинхронно. В документации четко указано следующее:

gtk_widget_draw устарела и не должна использоваться во вновь написанном коде.

В GTK+ 1.2 эта функция немедленно отображала область области виджета, вызывая метод виртуального рисования виджета. В GTK+ 2.0 метод рисования исчез, и вместо этого gtk_widget_draw() просто делает недействительной указанную область виджета, а затем немедленно обновляет недопустимую область виджета. Обычно вы не хотите обновлять область немедленно из соображений производительности, поэтому в целом gtk_widget_queue_draw_area() является лучшим выбором, если вы хотите нарисовать область виджета.

Если вы опасаетесь, что задержка отрисовки слишком велика, то вместо синхронной отрисовки вам следует аннулировать только ту область, которую необходимо перерисовать (используя queue_draw_area).

person AndiDog    schedule 08.12.2010
comment
мне пришлось заставить очередь обрабатываться с помощью: gtk.main_iteration_do(True), как указано в: stackoverflow.com/questions/8381631/ - person krumpelstiltskin; 21.05.2015

Я нашел решение, которое использует метод queue_draw() (вызывается из Gtk.DrawingArea, но кажется, что метод должен быть у каждого виджета gtk), но, вероятно, есть альтернативы, поскольку этот подразумевает, что он может задерживаться, хотя в моих тестах этого не произошло. .

person otirra    schedule 08.12.2010