«Вручную» вызвать выставить событие на gtk.DrawingArea - PullRequest
3 голосов
/ 05 января 2012

Я создаю небольшой инструмент для визуализации данных. GUI создан с помощью Pygtk и очень прост. После того, как пользователь ввел имя файла, он может нажать кнопку «calc», чтобы увидеть результат. Выходные данные отрисовываются Pycairo и представляются в виде gtk.DrawingArea.

Приложение работает следующим образом: При нажатии кнопки файл обрабатывается, а его содержимое сохраняется в специальном классе. Этот класс является пользовательским контейнером: он создается вместе с графическим интерфейсом и либо пуст, либо заполнен. Событие выставления DrawingArea связано с функцией рисования, которая читает контейнер и рисует его содержимое. Пока контейнер пуст, DrawingArea остается пустым, но после нажатия кнопки calc и загрузки файла DrawingArea должно быть заполнено моими визуальными элементами.

Проблема в том, что: Все отлично работает, кроме обновления DrawingArea. Я не могу понять, как вручную вызвать выставить. После нажатия calc я должен изменить размер окна, чтобы увидеть результат.

Более конкретно: Я скопировал этот код из учебника и сам не знаю, как предоставить событие параметра:

def do_expose_event(self,event):
    # Create the cairo context
    cr = self.window.cairo_create()

    # Restrict Cairo to the exposed area; avoid extra work
    cr.rectangle(event.area.x, event.area.y,
            event.area.width, event.area.height)
    cr.clip()

    self.draw(cr, *self.window.get_size())

Ответы [ 3 ]

11 голосов
/ 06 января 2012

Чтобы обновить ваш виджет, вы должны сообщить GTK +, что его нужно перерисовать, обычно используя gtk.Widget.queue_draw() (называемый self.queue_draw()), который делает недействительным весь ваш виджет и планирует перерисовку (отправляя события expose ), что произойдет после того, как ваша программа вернется в основной цикл.

Если вам нужен больший контроль над перерисовываемым регионом, вы всегда можете использовать gtk.Widget.queue_draw_area(), чтобы указать область для аннулирования, или перейти к gtk.gdk.Window.invalidate_rect().

0 голосов
/ 05 января 2012

Позвоните self.draw() из обработчика calc и забудьте о создании поддельной структуры событий для передачи для выставления.

Но если вы настаиваете на неправильном использовании do_expose_event(), вызывая его напрямую, вам не нужносоздайте целую структуру событий, просто вызовите ее с одним элементом, на который она ссылается (event.area), с заданной геометрией окна, чтобы ничего не было обрезано.

0 голосов
/ 05 января 2012

Вы написали обратный вызов события, который необходимо подключить к событию expose, например: self.connect("do_expose_event", self.expose) в методе __init__ вашего объекта.

...