2016-07-18 23 views
1

Also habe ich einen Code von meinem Vorgesetzten, mit dem ich Verständnisprobleme habe. Ich möchte ein Rechteck zeichnen, wo mein Cursor unter Verwendung der create_rectangle Verfahren für die ich Argumente geben/Koordinaten als:Ermitteln der absoluten Position des Cursors in tkinter

rect = create_rectangle(x, y, x + 10, y + 10, fill = 'blue', width = 0)

Ich wünsche x und y hier die aktuellen Koordinaten meines Cursor zu sein in Bezug auf mein Wurzelfenster.

Die Art und Weise x und y in meinem Code berechnet werden, bevor sie an diese Funktion übergeben ist:

x = root.winfo_pointerx() - root.winfo_rootx() 
y = root.winfo_pointery() - root.winfo_rooty() 

Und ich kann mich nicht für das Leben verstehen, warum dies geschehen ist. Ich versuchte dabei nur

x = root.winfo_pointerx() 
y = root.winfo_pointery() 

und auch nur

x = root.winfo_rootx() 
y = root.winfo_rooty() 

aber keiner dieser ziehen Sie das Rechteck, wo der Cursor befindet. Ich habe auch versucht, in die Dokumentation zu schauen, kann aber nicht wirklich verstehen, was passiert.

Warum werden x = root.winfo_pointerx() - root.winfo_rootx() und y = root.winfo_pointery() - root.winfo_rooty() hier ausgeführt?

+3

'winfo_pointer()' = Position des Cursors auf dem Bildschirm. 'winfo_root()' = Position des Fensters auf dem Bildschirm. 'winfo_pointer() - winfo_root()' = Position des Cursors in Ihrem Fenster. –

Antwort

3

Sie fragen nach dem Unterschied zwischen absoluten Bildschirm und relativ Mauszeiger Positionen.

Die Notation:

x = root.winfo_pointerx() - root.winfo_rootx() 
y = root.winfo_pointery() - root.winfo_rooty() 

spiegelt die absolute Position des Mauszeigers im Gegensatz zu winfo_pointerx() und w.winfo_pointery() (oder w.winfo_pointerxy()), die den Mauszeiger Koordinaten relativ zu Ihrer w ‚s Wurzelfenster reflektieren.

Aber was bedeuten absolute und relative Begriffe?

winfo_rootx() und winfo_rooty() Rückkehr bzw. die x und y Koordinaten SOF obere linke Ecke dieses Widget auf dem Wurzelfenster.

winfo_pointerx()Aber diese x und y Koordinaten werden in Bezug auf SCREEN Ihren Laptops berechnet und winfo_pointery() die x- und y-Koordinaten der Maus Schleppzeiger relativ zu dem Haupt Fenster Root NICHT auf den SCREEN.

Also nur laufen winfo_pointerxy() Sie sich nur die Root-Fenster in Betracht zu ziehen, aber Sie sind den Rest zu ignorieren (die SCREEN).

Aber das Problem ist, dass, wenn Sie mit der Maus auf das Fenster Wurzel bewegen, Sie dürfen nicht vergessen, dass Ihr System die Koordinaten auf Ihrem Laptop SCREEN basiert die Berechnung.

Alternative Ansatz

Beachten Sie, dass Sie Ihren aktuellen Code ersetzen können:

def get_absolute_position(event=None): 
    x = root.winfo_pointerx() - root.winfo_rootx() 
    y = root.winfo_pointery() - root.winfo_rooty() 
    return x, y 

Durch einen anderen Ansatz Vorteil aus der Veranstaltung Koordinaten unter:

def get_absolute_position(event): 
    x = event.x 
    y = event.y 
    return x, y 
1

Ganz einfach:

from tkinter import * 
root = Tk() 

def f(event): 
    print(event.x, event.y) 

root.bind("<Motion>", f)