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