Es gibt in Tkinter Events <Enter> und <Leave>, welche anzeigen, ob der Mauscursor bei UNGEDRÜCKTER Maustaste ein Widget betritt oder verlässt. <Enter> und <Leave> für gedrückte Maustasten gibt es anscheinend nicht. Ich beobachte aber, dass bei fremden GUIs durchaus Dinge passieren können, wenn ich mit gedrückter Maustaste ein Widget betrete oder verlasse. Wie machen die das???
Beispiel von erwünschter Funktion:
Um einen Damestein zu bewegen, drücke ich auf das Feld, wo sich der Stein befindet, schiebe den Cursor bei gedrückter Maustaste auf das Feld, wo der Stein hinsoll, und lasse die Maustaste los.
Enter_widget_while_pressed ?
So?Goswin hat geschrieben:Um einen Damestein zu bewegen, drücke ich auf das Feld, wo sich der Stein befindet, schiebe den Cursor bei gedrückter Maustaste auf das Feld, wo der Stein hinsoll, und lasse die Maustaste los.
Code: Alles auswählen
import Tkinter as tk
class App(object):
def __init__(self):
root = tk.Tk()
self.canv = tk.Canvas(root, width=300, height=200, bg="saddlebrown")
self.canv.pack()
dot = self.canv.create_oval(135, 85, 165, 115, fill="snow")
self.canv.addtag_withtag("dot", dot)
self.canv.tag_bind("dot","<Enter>", lambda e:self.canv.config(cursor="hand1"))
self.canv.tag_bind("dot","<Leave>", lambda e:self.canv.config(cursor=""))
self.canv.tag_bind("dot","<ButtonPress>", self.drag)
self.canv.tag_bind("dot","<B1-Motion>", self.move)
root.mainloop()
def drag(self,e):
self.x, self.y = e.x, e.y
def move(self,e):
self.canv.move("dot", e.x-self.x, e.y-self.y)
self.x, self.y = e.x, e.y
if __name__ == "__main__":
App()
- Goswin
- User
- Beiträge: 366
- Registriert: Freitag 8. Dezember 2006, 11:47
- Wohnort: Ulm-Böfingen
- Kontaktdaten:
Hallo Numerix,
Vielleicht geht es auch so, vielleicht ist es unpraktisch, das kann ich auf die Schnelle nicht sagen, ich werde darüber nachdenken, jedenfalls vielen Dank für deinen Ansatz.
Mein Programm muss jederzeit wissen, auf welchem Feld der Stein steht. In meinem ursprünglichen Ansatz war jedes Feld ein getrenntes Widget, und wenn ich auf ein Feld drücke, dann verändert sich das Aussehen derjenigen Felder, auf welche ich den Stein ziehen darf. Bei deinem Entwurf sieht es so aus, als ob das gesamte Spielbrett ein einziges Widget ist, und ich über die Koordinaten des Steins herausfinden muss, wo der Stein steht. Ist so eine Vorgehensweise wirklich zu empfehlen?
Vielleicht geht es auch so, vielleicht ist es unpraktisch, das kann ich auf die Schnelle nicht sagen, ich werde darüber nachdenken, jedenfalls vielen Dank für deinen Ansatz.
Mein Programm muss jederzeit wissen, auf welchem Feld der Stein steht. In meinem ursprünglichen Ansatz war jedes Feld ein getrenntes Widget, und wenn ich auf ein Feld drücke, dann verändert sich das Aussehen derjenigen Felder, auf welche ich den Stein ziehen darf. Bei deinem Entwurf sieht es so aus, als ob das gesamte Spielbrett ein einziges Widget ist, und ich über die Koordinaten des Steins herausfinden muss, wo der Stein steht. Ist so eine Vorgehensweise wirklich zu empfehlen?
IMHO ist das eine Design-Entscheidung. Was der bessere Weg ist, vermag ich so nicht zu sagen. Ich persönlich hätte wahrscheinlich als gesamtes Spielfeld ein Canvas genommen und die einzelnen Felder als Canvas-Objekte (rectangle) über Canvas-Tags gesteuert. Außerdem ein spezielles Koordinatensystem (jedes Feld eine Zelle) eingeführt und dann jeweils geprüft, an welcher Position dieses Systems ein Spielstein beim Verschieben einrastet.Goswin hat geschrieben:Mein Programm muss jederzeit wissen, auf welchem Feld der Stein steht. In meinem ursprünglichen Ansatz war jedes Feld ein getrenntes Widget, und wenn ich auf ein Feld drücke, dann verändert sich das Aussehen derjenigen Felder, auf welche ich den Stein ziehen darf. Bei deinem Entwurf sieht es so aus, als ob das gesamte Spielbrett ein einziges Widget ist, und ich über die Koordinaten des Steins herausfinden muss, wo der Stein steht. Ist so eine Vorgehensweise wirklich zu empfehlen?