Как не получить очистку gtkdrawingarea в розыгрыше? - PullRequest
0 голосов
/ 19 октября 2019

Моя область рисования очищается при каждом вызове события draw. Как избежать очистки области рисунка?

Спасибо

#!/usr/bin/env python3

import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk, Gdk
import cairo
import math

class MouseButtons:
    LEFT_BUTTON = 1
    RIGHT_BUTTON = 3

class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()

        self.init_ui()

    def init_ui(self):    

        self.darea = Gtk.DrawingArea()
        self.darea.connect("draw", self.on_draw)
        self.darea.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)        

        self.add(self.darea)

        self.set_title("Fill & stroke")
        self.resize(230, 150)
        self.set_position(Gtk.WindowPosition.CENTER)
        self.connect("delete-event", Gtk.main_quit)

        self.darea.connect("button-press-event", self.on_button_press)

        self.coords = []
        self.show_all()

    def on_draw(self, wid, cr):

        cr.set_source_rgb(0.6, 0.6, 0.6)
        cr.arc(self.coords[0], self.coords[1], 40, 0, 2*math.pi)
        cr.fill()

    def on_button_press(self, w, e):

        if e.type == Gdk.EventType.BUTTON_PRESS \
            and e.button == MouseButtons.LEFT_BUTTON:
            self.coords = [e.x, e.y]

        self.darea.queue_draw()           

def main():
    app = Example()
    Gtk.main()

if __name__ == "__main__":    
    main()

В этом примере каждый раз, когда я нажимаю на область рисунка, рисуется круг. Я хотел бы нарисовать новый круг, но без перерисовки предыдущего. Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Я нашел, что он ответил:

#!/usr/bin/env python3

import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk, Gdk
import cairo
import math

class MouseButtons:
    LEFT_BUTTON = 1
    RIGHT_BUTTON = 3

class Example(Gtk.Window):

    def __init__(self):
        super(Example, self).__init__()
        self.init_ui()

    def init_ui(self):    

        self.darea = Gtk.DrawingArea()
        self.darea.connect("draw", self.on_draw)
        self.darea.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)        

        self.add(self.darea)

        self.set_title("Fill & stroke")
        self.resize(230, 150)
        self.set_position(Gtk.WindowPosition.CENTER)
        self.connect("delete-event", Gtk.main_quit)

        self.darea.connect("button-press-event", self.on_button_press)
        self.show_all()

        a = self.darea.get_allocation()
        print (a.x, a.y, a.width, a.height)
        self.img = cairo.ImageSurface(cairo.Format.RGB24, a.width, a.height)

    def on_draw(self, wid, cr):
        cr.set_source_surface(self.img, 0, 0)
        cr.paint()

    def on_button_press(self, w, e):
        if e.type == Gdk.EventType.BUTTON_PRESS \
            and e.button == MouseButtons.LEFT_BUTTON:
            cr = cairo.Context(self.img)
            cr.set_source_rgb(0.6, 0.6, 0.6)
            cr.arc(e.x, e.y, 40, 0, 2*math.pi)
            cr.fill()

        self.darea.queue_draw()           

def main():
    app = Example()
    Gtk.main()

if __name__ == "__main__":    
    main()
0 голосов
/ 20 октября 2019

Я бы порекомендовал настроить вашу умственную модель области рисования;не думайте об этом как об «очищенном» каждый раз, когда вызывается обработчик отрисовки. Скорее, думайте об этом так: обработчик рисования вызывается каждый раз, когда область рисования должна быть перерисована с нуля (среди других причин: потому что перед ним было перемещено какое-то другое окно или потому что ваша программа запросила обновление рисования). Содержимое области рисования после его рисования нигде не сохраняется.

Если вам нужно постоянное содержимое окна, вам следует использовать резервное хранилище и нарисовать его на экране в обработчике рисования, или вы можете использовать холст. библиотека, если вы хотите рассматривать существующие нарисованные объекты как независимо существующие.

...