Tkinter: Position eines Button in einem Fenster in Abhängigkeit der Fenstergröße anpassen

Fragen zu Tkinter.
Antworten
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Hallo zusammen,

kann mir einer bei folgendem helfen?

Ich möchte ein Button in einem Fenster in Abhängigkeit der Fenstergröße positionieren.
Wird also das Fenster mit der Maus vergrößert oder verkleinert, dann soll sich die Position des Buttons entsprechend ändern.

#Fenster generieren
Fenster = Tk()
Fenster.title("Test")
Fenster.geometry("250x250")

#Button erzeugen mit Ausgangsposition
Button_1 = Button(Fenster,text="Drücken")
Button_1.place(x=125,y=125)

#Auf die Skalierung des Fensters mit einem Event reagieren
Fenster.bind("<Configure>", Position)

#Funktion für das Anpassen der Position des Buttons
def Position(event):
fw = int(event.width)
fh = int(event.height)
Button_1.place(x=fw/2,y=fh/2)

#Loop
Fenster.mainloop()



Leider funktioniert der obige Code nicht. Button bleibt immer an der Ausgangsposition.
ich vermute mal, dass der Befehl Button_1.place(x=fw/2,y=fh/2) in der Funktion an dieser Stelle falsch ist.
Vielleicht brauche ich hier zum Aktualisieren der Position des Buttons im Fenster einen anderen Befehl.

Kann mir jemand helfen. Ich habe es vor kurzem mit der Oberflächenprogrammierung (über Tkinter) angefangen.


Viele Grüße
Armend
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist ganz einfach: nicht den place Geometrie Manager verwenden. Sondern zb grid. Dann passiert das ganz von alleine.
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Hi,

danke für deine Antwort erstmal.

Also auch mit grid habe ich dasselbe Problem.
Was meinst du denn mit automatisch. Meinst du damit, dass ich kein Event dafür brauche. Das habe ich versucht - funktioniert nicht.
Ist eigentlich auch klar, weil ich auch im grid eine Position festlegen muss.

Mit Event und grid habe ich dasselbe wie mit place. Position ändert sich nicht.

Kannst du bitte einen kurzen Code dazu reinstellen. Anhand eines Codes sieht man besser, was du genau meinst.

VG
Armend
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

PS: Ich nutze Python 2.7

Daher auch Tkinter und nicht tkinter :D
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Armend

Ist einfach mit pack:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

try:
    #~~ For Python 2.x
    import Tkinter as tk
except ImportError:
    #~~ For Python 3.x
    import tkinter as tk

app_win = tk.Tk()

tk.Button(app_win, text="My Button").pack(expand=True)

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Armend hat geschrieben: Also auch mit grid habe ich dasselbe Problem.
Was meinst du denn mit automatisch. Meinst du damit, dass ich kein Event dafür brauche. Das habe ich versucht - funktioniert nicht.
Ist eigentlich auch klar, weil ich auch im grid eine Position festlegen muss.

Mit Event und grid habe ich dasselbe wie mit place. Position ändert sich nicht.
Das stimmt nicht. Grid und pack arbeiten mit relativen Positionen, und die passen sich automatisch an. Und ja, dadurch entfällt die Notwendigkeit einer Ereignisbehandlung.
Armend
User
Beiträge: 22
Registriert: Mittwoch 11. April 2018, 11:59

Hi,

danke für eure Hilfe.

Also ich habe jetzt herausgefunden, dass die place-Funktion auch eine Übergabe einer relativen Position erlaubt.
Zum Beispiel: Button_1.place(relx=0.2,rely=0.3) -> anstelle von (x=0.2,y=0.3)

Bei grid habe ich so etwas oder ähnliches noch nicht herausfinden können (muss aber nicht heißen, dass es nicht geht :) )
Das Beispiel von dir "wuf" hat bewirkt, dass das Button stets in der Mitte war. Ich würde aber gerne eine individuelle Position einstellen.

Sicherlich geht das alles auch mit pack und grid. Ich habe es jetzt mal mit place gemacht. 8)

Danke euch nochmal :)

VG
Armend
Antworten