2016-07-07 14 views
0

ich eine Anwendung bin der Gestaltung für in Python Pixel-Kunst zu schaffen. Ich habe es derzeit so, dass der Benutzer eine erforderliche Rastergröße (Breite * Höhe) angeben kann und es wird ein Raster der angegebenen Höhe erstellt, wobei jedes Rasterquadrat einen Punkt in einer 2D-Liste darstellt.Ändern der Farbe aller Leinwand Elemente (Rechtecke) durch einen Mausklick und Drag gedrückt (Tkinter)

I Tkinter Die Leinwand-Widget verwendet und es ist create_rectangle Verfahren das Raster zu zeichnen, wie der Codeauszug zeigt.

Ich möchte ein Planquadrat in der Lage sein zu klicken und die Maus zu ziehen, das ursprüngliche geklickt Planquadrat und alle diejenigen, die älter als durch meine Maus die Farbe wechseln gezogen werden.

Ein wenig Forschung führen mich auf der Leinwand tag_bind und binden, aber keiner von ihnen scheint in der Lage zu sein, mir zu erlauben, die Drag-Funktionalität zu implementieren, würde Ich mag. Die Methode event.widget.findclosest ist sehr ungenau.

Hier ist der Code I ohne jeden Zugriff auf die Funktion OnClick das Raster zu zeichnen sind.

def drawGrid(self): 
    for x in range(0, self.grid_width): 
     for y in range(0, self.grid_height): 
      x1 = (x * self.pixel_width) 
      x2 = (x1 + self.pixel_width) 
      y1 = (y * self.pixel_height) 
      y2 = (y1 + self.pixel_height) 
      self.grid[x,y] = self.canvas.create_rectangle(x1,y1,x2,y2) 
    self.canvas.update() 

def rectangleOnClick(event): 
    #Colour the clicked square and all other squares that fall under mouse drag 
+0

nicht vertraut w/tkinter aber etwas, was ich habe an anderer Stelle gesehen getan wird mouseup Tracking, MouseDown- zusammen mit mit einem Objekt Cursorposition folgen und mit der Kollisionserkennung zwischen Bürste und Objekt ist es vorbei. – CaffeineAddiction

Antwort

0

Sie können Bindungen erstellen, die beim Drücken der Schaltfläche ein Flag setzen und das Flag beim Loslassen loslassen. Sie können eine Bindung für die Mausbewegung festlegen, die das Element unter dem Cursor färbt, wenn die Markierung gesetzt ist.

Es würde wie folgt aussehen:

class Example(object): 
    def __init__(self, parent): 
     ... 
     self._dragging = False 
     ... 
     self.canvas.bind("<ButtonPress-1>", self.on_click) 
     self.canvas.bind("<B1-Motion>", self.on_move) 
     self.canvas.bind("<ButtonRelease-1>", self.on_release) 

    def on_click(self, event): 
     self._dragging = True 
     self.on_move(event) 

    def on_move(self, event): 
     if self._dragging: 
      items = self.canvas.find_closest(event.x, event.y) 
      if items: 
       rect_id = items[0] 
       self.canvas.itemconfigure(rect_id, fill="red") 

    def on_release(self, event): 
     self._dragging = False 
+0

Fantastisch! Das hat perfekt funktioniert. Ich kann jetzt weitermachen, nachdem ich einen Tag hier gestanden habe. Vielen Dank. – RCarruthers