bei b1motion / dragging jede 2. bewegung falsche koordinate

Fragen zu Tkinter.
Antworten
stichbert
User
Beiträge: 2
Registriert: Sonntag 12. April 2015, 16:58

hallo,
ich wollte zum einstieg ein tkinter ein bild ueber den bildschirm ziehen, allerdings wird bei jeder 2. bewegung ein falsches koordinatenpaar gesendet.
also z.b. so :
in motion :22
in motion :1
in motion :23
in motion :1

das bild entfernt sich somit immer weiter von der tatsaechlichen mouseposition. was mach ich falsch?


Code: Alles auswählen

from tkinter import *
class Board(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)
        
        self.bild=PhotoImage(file="letter_a.gif")
        self.label=Label(image=self.bild)
        self.label.place(x=0,y=0)           
        self.label.bind('<B1-Motion>',self.b1motion)    
    def b1motion(self,event):
        print("in motion :"+str(event.x))        
        event.widget.place(x=event.x,y=event.y)
       
board=Board()
board.mainloop()
BlackJack

@stichbert: Die Koordinaten des Event-Objekts beziehen sich *auf das Label*. Sagen wir das Label ist an (0, 0) im Elternwidget platziert und 50×50 Pixel gross. Jetzt klickst Du in der Mitte vom `Label` und bewegst die Maus ein bisschen dann wird ein Event mit (25, 25) ausgelöst, das Label wird auf dem Elternwidget so platziert das die linke obere Ecke auf Position (25, 25) kommt. Jetzt wird die Maus wieder ein Stück bewegt, sagen wir ein Pixel nach rechts, dann wird ein Event mit (0, 1) ausgelöst, denn die Maus war zu dem Zeitpunkt ja aus Sicht des `Label` ganz oben links. Und das Bild wird im Elternwidget an (0, 0) positioniert. Nun befindet sich die Maus wieder nahe der Mitte des `Label`, und so weiter…
stichbert
User
Beiträge: 2
Registriert: Sonntag 12. April 2015, 16:58

danke, habs jetzt so geloest. kann ich die geometry-daten auch einfacher einzeln auslesen? habe nur winfo_width() und winfo_height() gefunden.

Code: Alles auswählen

        astring=event.widget.winfo_geometry() 
        astring=astring.split("+")
        self.newx=event.x+int(astring[1])
        self.newy=event.y+int(astring[2])
        event.widget.place(x=self.newx,y=self.newy)
BlackJack

@stichbert: `winfo_x()` und `winfo_y()`.
Antworten