2016-07-19 6 views
-2

Ich steckte fest versucht, den Code zu verstehen, dass ich von Bryan Oakley here stieß. Gegenwärtig ermöglicht dieser Code dem Benutzer, zwei Ovale mit tkinter zu ziehen. Ich wollte in der Lage sein, diesen Code so zu ändern, dass der Benutzer anstelle von Ovalen Strings (Schlüssel/Wert-Paare) aus zwei Listen ziehen und abgleichen kann. Zum Beispiel möchte ich, dass der Benutzer in der Lage ist, eine Zeichenfolge wie "Benutzer" aus einer Liste und "Ryan" aus einer anderen Liste zu ziehen und sie zu vergleichen. Ich würde sehr schätzen jede Eingabe darüber, wie ich gehen sollte, um den Code zu ändern, so dass der Benutzer in der Lage ist, die zwei Zeichenfolgen zu ziehen.Ändern von Code zum Ziehen von Strings

import Tkinter as tk 

class SampleApp(tk.Tk): 
    '''Illustrate how to drag items on a Tkinter canvas''' 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     # create a canvas 
     self.canvas = tk.Canvas(width=400, height=400) 
     self.canvas.pack(fill="both", expand=True) 

     # this data is used to keep track of an 
     # item being dragged 
     self._drag_data = {"x": 0, "y": 0, "item": None} 

     # create a couple movable objects 
     self._create_token((100, 100), "white") 
     self._create_token((200, 100), "black") 

     # add bindings for clicking, dragging and releasing over 
     # any object with the "token" tag 
     self.canvas.tag_bind("token", "<ButtonPress-1>", self.OnTokenButtonPress) 
     self.canvas.tag_bind("token", "<ButtonRelease-1>", self.OnTokenButtonRelease) 
     self.canvas.tag_bind("token", "<B1-Motion>", self.OnTokenMotion) 

    def _create_token(self, coord, color): 
     '''Create a token at the given coordinate in the given color''' 
     (x,y) = coord 
     self.canvas.create_oval(x-25, y-25, x+25, y+25, 
           outline=color, fill=color, tags="token") 

    def OnTokenButtonPress(self, event): 
     '''Being drag of an object''' 
     # record the item and its location 
     self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0] 
     self._drag_data["x"] = event.x 
     self._drag_data["y"] = event.y 

    def OnTokenButtonRelease(self, event): 
     '''End drag of an object''' 
     # reset the drag information 
     self._drag_data["item"] = None 
     self._drag_data["x"] = 0 
     self._drag_data["y"] = 0 

    def OnTokenMotion(self, event): 
     '''Handle dragging of an object''' 
     # compute how much this object has moved 
     delta_x = event.x - self._drag_data["x"] 
     delta_y = event.y - self._drag_data["y"] 
     # move the object the appropriate amount 
     self.canvas.move(self._drag_data["item"], delta_x, delta_y) 
     # record the new position 
     self._drag_data["x"] = event.x 
     self._drag_data["y"] = event.y 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 
+0

Bitte fügen Sie das Snippet zu Ihrer Frage hinzu. –

+0

@ParvizKarimli Der Code wurde hinzugefügt. – Neil

+1

Bitte geben Sie genau an, auf welches Problem Sie stoßen. Es ist schwer, Ihnen zu helfen, wenn wir nicht wissen, was Sie gerade erleben. –

Antwort

2

Ist das, was Sie suchen,:

import tkinter as tk 

class SampleApp(tk.Tk): 
    '''Illustrate how to drag items on a Tkinter canvas''' 

    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     # create a canvas 
     self.canvas = tk.Canvas(width=400, height=400, bg='red') 
     self.canvas.pack(fill="both", expand=True) 

     # this data is used to keep track of an 
     # item being dragged 
     self._drag_data = {"x": 0, "y": 0, "item": None} 

     # create a couple movable objects 
     self._create_token((100, 100), "white", "User") 
     self._create_token((200, 100), "black", "Ryan") 

     # add bindings for clicking, dragging and releasing over 
     # any object with the "token" tag 
     self.canvas.tag_bind("token", "<ButtonPress-1>", self.OnTokenButtonPress) 
     self.canvas.tag_bind("token", "<ButtonRelease-1>", self.OnTokenButtonRelease) 
     self.canvas.tag_bind("token", "<B1-Motion>", self.OnTokenMotion) 

    def _create_token(self, coord, color, mytext): 
     '''Create a token at the given coordinate in the given color''' 
     (x,y) = coord 
     self.canvas.create_text(x-25, y-25, 
           fill=color, tags="token", text=mytext) 

    def OnTokenButtonPress(self, event): 
     '''Being drag of an object''' 
     # record the item and its location 
     self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0] 
     self._drag_data["x"] = event.x 
     self._drag_data["y"] = event.y 

    def OnTokenButtonRelease(self, event): 
     '''End drag of an object''' 
     # reset the drag information 
     self._drag_data["item"] = None 
     self._drag_data["x"] = 0 
     self._drag_data["y"] = 0 

    def OnTokenMotion(self, event): 
     '''Handle dragging of an object''' 
     # compute how much this object has moved 
     delta_x = event.x - self._drag_data["x"] 
     delta_y = event.y - self._drag_data["y"] 
     # move the object the appropriate amount 
     self.canvas.move(self._drag_data["item"], delta_x, delta_y) 
     # record the new position 
     self._drag_data["x"] = event.x 
     self._drag_data["y"] = event.y 

if __name__ == "__main__": 
    app = SampleApp() 
    app.mainloop() 

?

Was ich geändert:
(Edited LINES: 10, 18, 19, 27, 30 und 31)
-canvas Hintergrundfarbe von Standard (weiß) zu rot, weiß und schwarz Gegenstände darauf zu identifizieren besser;
- self.canvas.create_oval zu self.canvas.create_text da Sie Zeichenfolgen anstelle von Ovalen möchten;
-auch, das zweite Paar von Koordinaten entfernt (x+25, y+25) seit create_text erfordert nur ein paar Koordinaten (create_oval erfordert zwei von ihnen), und entfernt outline=color da ein Textobjekt nicht outline Option hat, so Tkinter gibt einen unknown option Fehler zurück;
-und schließlich, nachdem es von create_oval zu create_text ändern, hatte ich die text Option mytext auf die _create_token Funktion (def _create_token(self, coord, color, mytext):) und seine Instanzen ("User" & "Ryan") an die beweglichen Objekte hinzuzufügen:
self._create_token((100, 100), "white", "User") self._create_token((200, 100), "black", "Ryan").

+0

Ja, das ist großartig. Wenn es Ihnen nichts ausmacht, können Sie erklären, warum wir die Tags = "token" in 'create_text' brauchen? – Neil

+0

Es ist nur ein Tag-Name. Tags werden verwendet, um Objekte zu steuern. Tags sind symbolische Namen, die an Elemente angehängt sind. Tags sind gewöhnliche Zeichenfolgen und sie können alles außer Leerzeichen enthalten (solange sie nicht wie Element-Handles aussehen) (Quelle: http://effbot.org/tkinterbook/canvas.htm). Ich empfehle Ihnen, [this] (http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/canvas-tags.html) zu lesen. –