Seite 1 von 1

Tkinter- Widgets in die Mitte platzieren

Verfasst: Donnerstag 14. Juni 2018, 22:40
von dolu28
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()

Re: Tkinter- Widgets in die Mitte platzieren

Verfasst: Donnerstag 14. Juni 2018, 23:07
von Sirius3
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?

Re: Tkinter- Widgets in die Mitte platzieren

Verfasst: Donnerstag 14. Juni 2018, 23:14
von dolu28
kannst du mir das genauer erklären? Habe erst neu damit angefangen, also ein blutiger Anfänger

Re: Tkinter- Widgets in die Mitte platzieren

Verfasst: Donnerstag 14. Juni 2018, 23:56
von __blackjack__
@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()

Re: Tkinter- Widgets in die Mitte platzieren

Verfasst: Freitag 15. Juni 2018, 08:44
von wuf
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 ;-)