Enter_widget_while_pressed ?

Fragen zu Tkinter.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
So?

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()
Benutzeravatar
Goswin
User
Beiträge: 363
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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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?
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.
Antworten