Tkinter- Widgets in die Mitte platzieren

Fragen zu Tkinter.
Antworten
dolu28
User
Beiträge: 5
Registriert: Montag 7. Mai 2018, 15:05

Hallo, ich habe ein kleines GUI-Programm geschrieben und will meine Widgets in die Mitte platzieren. Sie sind zurzeit auf der linken Seite. Ich habe viele Beispiele im Internet ausprobiert(z.B mit .place) ,aber nichts hat mir weitergeholfen. Kann mir einer vllt. helfen :)? LG

Code:

Code: Alles auswählen

import tkinter as tk

def site_open(frame):
    frame.tkraise()
    
window = tk.Tk()

window.title('Test')
window.geometry('500x300')

StartPage = tk.Frame(window)
FirstPage = tk.Frame(window)

for frame in (StartPage, FirstPage):
    frame.grid(row=0, column=0, sticky='news')

lab = tk.Label(StartPage, text='Welcome to the Assistant').pack()
lab1 = tk.Label(StartPage, text='\n We show you helpful information about you').pack()
lab2 = tk.Label(StartPage, text='\n \n Name:').pack()
ent = tk.Entry(StartPage).pack()
but = tk.Button(StartPage, text='Press', command=lambda:site_open(FirstPage)).pack()

lab1 = tk.Label(FirstPage, text='1Page').pack()
but1 = tk.Button(FirstPage, text='Press', command=lambda:site_open(StartPage)).pack()

site_open(StartPage)
window.mainloop()
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, Deine Widgets sind zentriert, aber halt in der Mitte des Frames.
Warum bindest Du eigentlich so viele Variablen an None? Zumindest das Entry willst Du doch später noch referenzieren?
dolu28
User
Beiträge: 5
Registriert: Montag 7. Mai 2018, 15:05

kannst du mir das genauer erklären? Habe erst neu damit angefangen, also ein blutiger Anfänger
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@dolu28: Als erstes mal müsstest Du dafür sorgen, das Deine beiden Seiten-Frames das Fenster überhaupt ausfüllen. Solange sie das nicht tun, macht es auch keinen Sinn etwas in ihnen zu zentieren, denn es gibt dafür keinen Platz. Dazu musst Du dem Grid im Hauptfenster in Zeile und Spalte 0 ein Gewicht geben.

Und dann würde ich die Inhalte der Seiten jeweils noch einmal in einen Frame stecken und mit ``expand=True`` packen.

Die ganzen `lab`-, `ent`- und `but`-Namen, teilweise mit angehängten Nummern sind nicht nur unschön, und unnötig weil sie nirgends verwendet werden, sie können sogar gar nicht sinnvoll verwendet werden, denn es wird an alle der Wert `None` gebunden. Das ist nämlich der Rückgabewert der `pack()`-Methode und nicht das Objekt auf dem diese Methode jeweils aufgerufen wurde.

Ich habe den `Frame`\s mal Hintergrundfarben gegegeben. Damit sieht man besser wie gross der jeweilige Frame ist. Das hilft bei der Fehlersuche und beim experimentieren.

Code: Alles auswählen

import tkinter as tk


def site_open(frame):
    frame.tkraise()


def main():
    window = tk.Tk()

    window.title('Test')
    #
    # TODO Die Fenstergrösse würde ich hier nicht vorgeben.
    # Der grösste Seiten-Frame entscheidet wie viel Platz die komplette
    # GUI braucht.
    # 
    window.geometry('500x300')
    window.rowconfigure(0, weight=1)
    window.columnconfigure(0, weight=1)

    start_page = tk.Frame(window, bg='yellow')
    first_page = tk.Frame(window, bg='green')

    for frame in [start_page, first_page]:
        frame.grid(row=0, column=0, sticky='news')

    frame = tk.Frame(start_page, bg='red')
    frame.pack(expand=True)
    tk.Label(frame, text='Welcome to the Assistant').pack()
    tk.Label(
        frame, text='\nWe show you helpful information about you'
    ).pack()
    tk.Label(frame, text='\n\nName:').pack()
    
    tk.Entry(frame).pack()
    tk.Button(
        frame, text='Press', command=lambda: site_open(first_page)
    ).pack()

    frame = tk.Frame(first_page, bg='blue')
    frame.pack(expand=True)
    tk.Label(frame, text='1Page').pack()
    tk.Button(
        frame, text='Press', command=lambda: site_open(start_page)
    ).pack()

    site_open(start_page)
    window.mainloop()


if __name__ == '__main__':
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi dolu28

for frame in [start_page, first_page]

Bei dieser Zeile nehme ich an, dass bei deiner GUI first_page nicht die letzte Seite sein wird, (second..., third.... usw) Sollte dies der Fall sein wie verfährst du dann mit der Schaltfläche Press?

Gruss wuf ;-)
Take it easy Mates!
Antworten