Я пишу небольшое приложение, использующее PyGI, которое в интерактивном режиме рисует линию на Gtk.DrawingArea между щелчками мыши. Но я не могу понять, как рисовать, используя контекст Каира в координатах, возвращаемых событием щелчка мыши.
Как следует обрабатывать рисунок из события «кнопка-нажатие», чтобы нарисовать шаблон, аналогичный тому, который был получен с помощью обратного вызова «draw» в прилагаемом коде?
class MyApp(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Draw on button press")
self.set_size_request(800, 500)
self.connect('delete-event', Gtk.main_quit)
self.drawing_area = Gtk.DrawingArea()
self.drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK)
self.drawing_area.connect('draw', self.on_drawing_area_draw)
self.drawing_area.connect('button-press-event', self.on_drawing_area_button_press)
self.drawing_area.show()
self.add(self.drawing_area)
self.show_all()
def on_drawing_area_button_press(self, widget, event):
print "Mouse clicked... at ", event.x, ", ", event.y
# How to draw a line starting at this point on the drawing area?
return True
def on_drawing_area_draw(self, drawing_area, cairo_context):
cairo_context.move_to(50, 50)
cairo_context.rel_line_to(0, 200)
cairo_context.rel_line_to(200, 0)
cairo_context.rel_line_to(0, -200)
cairo_context.set_source_rgb(0, 0, 0)
cairo_context.stroke()
return False
app = MyApp()
Gtk.main()
То, что необходимо сделать, является переменными набора, которые оттянуты в обратном вызове ничьей. Если Вы хотите, чтобы это перерисовало себя, можно использовать это для принуждения его к:
drawing_area.queue_draw()
Править: Вот пример кода, который можно использовать:
clicks = [];
def on_drawing_area_button_press(self, widget, event):
print "Mouse clicked... at ", event.x, ", ", event.y
clicks.append([event.x, event.y])
drawing_area.queue_draw()
return True
def on_drawing_area_draw(self, drawing_area, cairo_context):
cairo_context.move_to(50, 50)
for point in clicks
cairo_context.line_to(point[0], point[1])
cairo_context.stroke()
return False