Koordinaten von Button abrufen

Fragen zu Tkinter.
Antworten
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Ich habe vermutlich (fast) alles versucht, die Koordinaten eines Buttons abzurufen.
Mit höhe ect. scheint es ja einfach zu gehen, mittels

Code: Alles auswählen

Hoehe = Button1['height']
aber wie geht es mit den Koordinaten? Also wie weit es eben von Links/Oben entffernt ist?
Habe schon wirklich alles erdenklich (8-9 Variationen) durch, ohne erfolg.
Auch Dinge, wie:

Code: Alles auswählen

Koords = Button1.widget.place([y])
und dergleichen.
Meist änderte sich nur die Fehlermeldung.
:(
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

Moinsen...

Code: Alles auswählen

y = int(Button1.place_info()['y'])
x = int(Button1.place_info()['x'])
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Redprince hat geschrieben:Moinsen...

Code: Alles auswählen

y = int(Button1.place_info()['y'])
x = int(Button1.place_info()['x'])
Funktioniert wunderbar.
Danke.
Für mich etwas verwirrend das ganze ... .

Leider hatte ich, für das was ich vorhabe, einen kleinen Gedankenfehler reingebracht.
Was mir noch sehr weiterhelfen würde, die Koordinaten für das Fenster festzustellen. Also wo sich das Tk-Fenster (oder Canvas) sich innerhalb des Bildschirms befindet.
Denn leider läßt sich das Button1 nicht durch root (also Tk) oder cv (Canvas) ersetzen. Wobei ich diesen Umstand sehr verwirend finde.
Hat Label dann auch eine extra Schreibweise?
Naja, kann ich ja mal selbst (was Label betrifft) testen.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
jochim
User
Beiträge: 32
Registriert: Montag 5. August 2002, 20:47
Wohnort: Dortmund

Was mir noch sehr weiterhelfen würde, die Koordinaten für das Fenster festzustellen. Also wo sich das Tk-Fenster (oder Canvas) sich innerhalb des Bildschirms befindet.

mit widget.winfo_rootx() und widget.winfo_rooty() können der x bzw y -Wert der oberen linken Ecke auf dem Bildschirm abgerufen werden.
Nachzulesen unter
http://www.pythonware.com/library/tkint ... mation.htm
wo noch mehr Infos zu Tkinter zu finden sind.

MfG
Jochim
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

Jaja, die Befehle kannte ich auch schon (Namentlich), mittels 'dir'.
Nur wie und wo man die anwendet war mir ein Rätsel.
Habe es aber inzischen dank Eurer Hilfe hinbekommen.

Danke.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Erwin hat geschrieben: Habe es aber inzischen dank Eurer Hilfe hinbekommen.
Zeigst Du bitte auch wie Du's letztendlich gemacht hast ;)
Erwin
User
Beiträge: 141
Registriert: Donnerstag 9. Juni 2005, 08:51

mawe hat geschrieben:...
Zeigst Du bitte auch wie Du's letztendlich gemacht hast ;)
Läßt sich machen.
Mußte nur noch vorher es ein wenig kleiner Schreiben, das Ganze.
Das mit den Button-Koordinaten und Co, brauchte ich, um eben jenen Code zustande zu bringen, den Ihr unten sehen könnt:
Ein art Drag und Drop Effekt mit Button, also das Verschieben von Button, während das Programm/Sricpt läuft.

Code: Alles auswählen

from Tkinter import *

def MoveOrSave1(event): #ob und welcher Button bewegt werden soll
    global GlobalV_MoveOnOff1, GlobalV_ButtonXY
    GlobalV_ButtonXY = event
    if GlobalV_MoveOnOff1 == False:
        GlobalV_MoveOnOff1 = True
    else: GlobalV_MoveOnOff1 = False

def MoveW(event): # hier findet die Bewegung statt.
    if GlobalV_MoveOnOff1 == True:
        x1, y1 = root.winfo_pointerxy() # liest die 'Bildschirm'-Koordinaten vom Button ein
        GlobalV_ButtonXY.widget.place(x = x1 - int(root.winfo_rootx()) - 50,
                                      y = y1 - int(root.winfo_rooty()) - 20)
        # wird neu platziert: x & y = Koordinaten am 'Bildschirm'
        # minus die Koordinaten des Fensters am Bildschirm (und die -50 u. -20)
        # = neue Platzierung im Fenster.
        # Die - 50 und 20, damit der Mauszeiger etwas im Button ist.
        # Platziert wird immer. Unbeweglich nach weiterem Klick.

# Gloabele Variablen
GlobalV_MoveOnOff1 = False

# Grafische Elemente
root = Tk()
Button1 = Button(root, width = '35', height = '5', text = '1')
Button1.place(x=50,y=50)
Button1.bind('<Button-3>', MoveOrSave1)
Button1.bind('<Motion>', MoveW)
Button2 = Button(root, width = '35', height = '5', text = '2')
Button2.place(x=50,y=150)
Button2.bind('<Button-3>', MoveOrSave1)
Button2.bind('<Motion>', MoveW)
Button3 = Button(root, width = '35', height = '5', text = '3')
Button3.place(x=300,y=50)
Button3.bind('<Button-3>', MoveOrSave1)
Button3.bind('<Motion>', MoveW)
Button4 = Button(root, width = '35', height = '5', text = '4')
Button4.place(x=300,y=150)
Button4.bind('<Button-3>', MoveOrSave1)
Button4.bind('<Motion>', MoveW)
root.bind('<Motion>', MoveW) # Damit es nicht so ruckelt, das Button beim Verschieben

mainloop()
Fehlt nur, daß sowas schon als Code irgendwo rumliegt.
Mit Rechter Maustaste kann man dann eben ein Button auswählen, um es dann ebenfalls mit Rechts woanders abzulegen.
Schade nur, daß immer das letzte von Script generierte Button über den anderen ist, wenn sich diese überschneiden.

Und ständig wird halt eben die Funktion Motion abgefragt.
Mann könnte es zwar auf aktive Buttons beschränken, dann ist es aber alles andere als flüssig (also zumindest bei mir).
Hm... wenn man vielleicht irgendwo gezielt eine 'if'-Anweisung reintun könnte ... .

Aber ansonsten, wenn man mit Tkinter was proggen will, wo der Anwender die Möglichkeit haben soll, die Buttons nach seinen Wünschen Anordnen zu könne, ist dies denke ich, recht gut geeignet.

Das mit der Globalen Variable ist halt vermutlich nicht Ideall gelößt, was ich so neulich hörte.
Naja, Wer es verwenden will, und es Ihm/Ihr nicht paßt, muß es halt dementsprechend anpassen.
Aber das versteht sich ja wohl von selbst.
Ich mache nie einen Fehler Zweimal.
Schließlich ist die Auswahl ja groß genug.
Antworten