Python 3.x 如何在抽签活动中不清除gtkdrawingarea?

Python 3.x 如何在抽签活动中不清除gtkdrawingarea?,python-3.x,gtk3,pygtk,pycairo,Python 3.x,Gtk3,Pygtk,Pycairo,每次调用draw事件时,我的drawingarea都会被清除。 如何避免要清理的提款区 谢谢 #!/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(

每次调用draw事件时,我的drawingarea都会被清除。 如何避免要清理的提款区

谢谢

#!/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()
在本例中,每次单击drawingarea时,都会绘制一个圆。我想画一个新的圆圈,但不想重新画上一个。
有可能吗?

我建议调整你在绘图区域的思维模式;不要认为每次调用绘图处理程序时它都被“清除”。相反,可以这样想:每次需要从头开始重新绘制绘图区域时,都会调用绘图处理程序(除其他原因外:因为其他窗口在其前面移动,或者因为您的程序要求进行绘图更新)。绘制后,绘图区域的内容不会保留在任何位置

如果您需要持久的窗口内容,那么您应该使用后备存储并在绘图处理程序中将其绘制到屏幕上,或者如果您想将现有的绘制对象视为独立存在,则可以使用画布库。

我发现他回答:

#!/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()