Seite 1 von 1

Frage zu frames

Verfasst: Montag 9. Februar 2026, 22:39
von StMan
Hallo,
wie kann ich erreichen dass die frames die ganze Fensterbreite nutzen und die Witgets darin zentriert werden?
Bei diesn Einstellungen nutzen sie nur ~4/5 der Breite, und die Witges sind alle linksseitig ausgerichtet. Egal was ich in sticky reinschreibe oder leer lasse.

Code: Alles auswählen

        root.rowconfigure(0, weight=1)  # oben
        root.rowconfigure(1, weight=1)  # mitte
        root.rowconfigure(2, weight=1)  # unten
        root.columnconfigure(0, weight=1)  
        root.columnconfigure(1, weight=1)  
        root.columnconfigure(2, weight=1)  
        
        
        frame_oben = tk.Frame(root, bg="lightblue")
        frame_oben.grid(row=0, column=0, sticky="nswe")
        #frame_oben.grid_propagate(True)
       
        frame_mitte = tk.Frame(root, bg="lightyellow")
        frame_mitte.grid(row=1, column=0, sticky="nswe")
        
        frame_unten = tk.Frame(root, bg="lightblue")
        frame_unten.grid(row=2, column=0, sticky="nswe")

Re: Frage zu frames

Verfasst: Montag 9. Februar 2026, 23:07
von snafu
Ist fast richtig. Wenn du columnconfigure() nur auf Spalte 0 anwendest, müsste es klappen:

Code: Alles auswählen

import tkinter as tk

COLORS = ["lightblue", "lightyellow", "lightblue"]

def main():
    root = tk.Tk()
    root.geometry("100x150")
    root.columnconfigure(0, weight=1)

    for i, color in enumerate(COLORS):
        root.rowconfigure(i, weight=1)
        frame = tk.Frame(root, bg=color)
        frame.grid(row=i, column=0, sticky="nswe")

    root.mainloop()


if __name__ == "__main__":
    main()

Re: Frage zu frames

Verfasst: Montag 9. Februar 2026, 23:59
von snafu
Und hier noch eine Variante ohne Angabe der Fenstermaße:

Code: Alles auswählen

import tkinter as tk

COLORS = ["lightblue", "lightyellow", "lightblue"]


def main():
    root = tk.Tk()
    root.columnconfigure(0, weight=1)
    row_indices = list(range(len(COLORS)))
    root.rowconfigure(row_indices, weight=1, minsize=50)
    
    for i, color in zip(row_indices, COLORS):
        frame = tk.Frame(root, bg=color)
        frame.grid(row=i, column=0, sticky="nswe")
    
    root.mainloop()


if __name__ == "__main__":
    main()

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 05:44
von Pedroski55
und die Witgets darin zentriert werden?
zentriert ist default

Spiele hiermit, man sehen welche Veränderungen was bewirken. Nicht zuviel auf einmal abändern!

Code: Alles auswählen

import tkinter as tk

# https://pythonguides.com/python-tkinter-grid/
# https://www.pythontutorial.net/tkinter/tkinter-grid/

def myApp():
    # mach Fenster
    win = tk.Tk(className='Streifen machen schlank')
    # geomancing
    win.geometry("400x400")    
    win['background']='pink'
    # mach a 3 x 2 grid
    win.columnconfigure(0, weight=1, minsize= 100)
    win.columnconfigure(1, weight=1, minsize= 100)
    win.columnconfigure(2, weight=1, minsize= 100)
    win.rowconfigure(0, weight=1, minsize= 30)
    win.rowconfigure(1, weight=2, minsize= 30)
    # mach labels
    colourr = 'red'
    colourg = 'green'
    coloury = 'yellow'
    label_one = tk.Label(win, text="One", bg=colourr, borderwidth=3, relief="sunken", width=5, height=2)
    label_two = tk.Label(win, text="Two", bg=coloury, borderwidth=4, relief="sunken", width=6, height=3)
    label_three = tk.Label(win, text="Three", bg=colourg, borderwidth=5, relief="sunken", width=7, height=4)
    label_four = tk.Label(win, text="Four", bg=colourr, borderwidth=3, relief="sunken", width=5, height=2)
    label_five = tk.Label(win, text="Five", bg=coloury, borderwidth=4, relief="sunken", width=6, height=3)
    label_six = tk.Label(win, text="Six", bg=colourg, borderwidth=5, relief="sunken", width=7, height=4)
    # labeln zum grid
    # default ist zentriert
    label_one.grid(row = 0, column = 0, ipadx = 5, ipady=5, padx = 5, pady=5)
    label_two.grid(row = 0, column = 1, ipadx = 5, ipady=5, padx = 2, pady=2)
    label_three.grid(row = 0, column = 2, ipadx = 5, ipady=5, padx = 5, pady=5)
    label_four.grid(row = 1, column = 0, ipadx = 5, ipady=5, padx = 2, pady=2)
    label_five.grid(row = 1, column = 1, ipadx = 5, ipady=5, padx = 5, pady=5)
    label_six.grid(row = 1, column = 2, ipadx = 5, ipady=5, padx = 2, pady=2)
    win.mainloop()

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 17:14
von StMan
OK, soweit alles gut.
Aber ich habe mein root mit frames auf zwei (oder drei ) Spalten aufgeteilt. Mein Problem ist dass die Zeilen von Spalte 0 die Zeilen der Spalte 1 beeinflussen.
Beispiel: in Spalte 0. Z0-tk.label, Z1- tk.Entry, Z2 tk.Entry, Z3 tk.Entry jeweils mit label davor. Z4-tk.label, z5-tk.label. Soweit alles gut!
Jetzt trage ich in Spalte 1. Z0-tk.label, Z1 eine Listbox, nun wird alles in Spalte 0 auseinander gezogen und verschoben..
Wie kann ich die Spalte 0 und 1 voneinander unabhängig machen? Oder habe ich da ein Denkfehler.

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 17:31
von snafu
@StMan: Zeig mal bitte tatsächlichen Code, der das Problem verdeutlicht.

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 17:56
von StMan
es geht erstmal nur frame_oben_re, frame_oben_mi und frame_oben_re. Mit .rowconfigure und columnconfigure habe ich schon alles ausprobiert.

Code: Alles auswählen

#region main-Window
class mainWindow:
    def __init__(self, root, app, status_var):
        self.root = root
        self.app = app
        self.status_var = status_var 
    
        SCREEN_WIDTH = root.winfo_screenwidth()
        SCREEN_HEIGTH = root.winfo_screenheight()
        WIN_WIDTH = 700
        WIN_HEIGTH = 800
        WIN_X = (SCREEN_WIDTH - WIN_WIDTH) // 2
        WIN_Y = (SCREEN_HEIGTH - WIN_HEIGTH) // 2        
        root.title("Das Hauptfenster")
        root.geometry(f"{WIN_WIDTH}x{WIN_HEIGTH}+{WIN_X}+{WIN_Y}")
        root.attributes("-topmost",True)
        root.option_add("*font","ARIAL 12")
        root.configure(bg="#b5b3b3")
        root.iconbitmap("C:/_Py-Dev/Bilder/mysql2.ico")
        
        pad = {"padx": 110, "pady": 10} 
        
        # Konfiguriere das grid-Layout 
        root.rowconfigure(0, weight=0)  # oben
        root.rowconfigure(1, weight=0)  # mitte
        root.rowconfigure(2, weight=0)  # unten
        root.columnconfigure(0, weight=0)  #Zeile 0 spannt sich über volle Breite, weight=0 nimmt keinen zusätzlichen Platz ein
        root.columnconfigure(1, weight=1)  #Zeile 1 spannt sich über volle Breite
        root.columnconfigure(2, weight=0)  #Zeile 2 spannt sich über volle Breite
        
        
        frame_oben_li = tk.Frame(root, bg="lightblue")
        frame_oben_li.grid(row=0, column=0, sticky="nswe")
        #frame_oben.grid_propagate(True)
        
        frame_oben_mi = tk.Frame(root, bg="#ffbad9")
        frame_oben_mi.grid(row=0, column=1, sticky="nswe")
        #frame_oben.grid_propagate(True)
        
        frame_oben_re = tk.Frame(root, bg="lightgreen")
        frame_oben_re.grid(row=0, column=2, sticky="nswe")
       
        frame_mitte = tk.Frame(root, bg="lightyellow")
        frame_mitte.grid(row=1, column=0, columnspan=3,sticky="nswe")
        
        frame_unten = tk.Frame(root, bg="lightblue")
        frame_unten.grid(row=2, column=0, columnspan=3, sticky="nswe")
        
        
        # Überschrift
        lb_ueberschrift = ttk.Label(frame_oben_li, background="#4ec9b0" , font= "Arial 9",  text="Bitte Daten zur Anmeldung bei mySQL eingeben")
        lb_ueberschrift.grid(column=0, row=0, padx=0, pady=10,  sticky="")
        
        ########## Überschrift label oben links ###############
        lb_mitte = ttk.Label(frame_oben_re, font= "Arial 8", text="Datenbank mit Doppelklick wählen")
        lb_mitte.grid(column=1, row=1, padx=0, pady=10, sticky="")
        
        # Host
        ttk.Label(frame_oben_li, text="Host:").grid(column=0, row=1, sticky="sw",pady=10, padx=60)
        self.host_var = tk.StringVar(value="localhost")
        ttk.Entry(frame_oben_li, textvariable=self.host_var, width=20).grid(column=0, row=1, sticky="",**pad)

        # Username
        ttk.Label(frame_oben_li, text="Username:").grid(column=0, row=2, sticky="w", pady=60, padx=20)
        self.user_var = tk.StringVar(value="root")
        ttk.Entry(frame_oben_li, textvariable=self.user_var, width=20).grid(column=0, row=2, sticky="",**pad)

        # Password
        ttk.Label(frame_oben_li, text="Password:").grid(column=0, row=3, sticky="w", pady=10,padx=22)
        self.password_var = tk.StringVar()
        ttk.Entry(frame_oben_li, textvariable=self.password_var, show="*", width=20).grid(column=0, row=3, sticky="",**pad)

        host = self.host_var.get().strip()
        username = self.user_var.get().strip()
        password = self.password_var.get()
        
        # Buttons
        ttk.Button(frame_oben_li, text="Connect", command=self.on_connect).grid(column=0, row=5, padx=(100,0), sticky="")
        ttk.Button(frame_oben_li, text="Quit", command=root.destroy).grid(column=0, row=5, padx=(0,100), sticky="")
        
        ###########    Status Label    #########
        # Status label
        self.status_label = ttk.Label(frame_mitte, text="warte auf verbindung", foreground="#9f0263", font="ARIAL 10 bold",anchor="w") 
        self.status_label.grid(column=0, row=0, sticky="", pady=10) #, padx=120)              

      
        
        #########   Datenbank Listbox  ########### 
        self.var_all = tk.BooleanVar()
        self.checkbox_all = tk.Checkbutton(frame_oben_re, text="Auch Systemdatenbanken anzeigen", font="ARIAL 8",variable=self.var_all,) #command=update_list)
        self.checkbox_all.grid(row=2, column=1, ipadx=0, ipady=0,sticky="NW",padx=(50,0), pady=0)
        
        self.dbOrdner_inhalt= []
        
        self.dbOrdner_scrollbar = tk.Scrollbar(frame_oben_re, orient="vertical") 
        self.dbOrdner_scrollbar.grid(row=3, column=1, ipady=32, sticky="NW")  #, padx=(290,0), pady=32)  
        
        self.dbOrdner_listbox = tk.Listbox(frame_oben_re, height=6) 
        self.dbOrdner_listbox.grid(row=3, column=1, ipadx=30, sticky="NW")#,padx=(50,0), pady=(30,0))
        
        self.bOrdner_var = tk.Variable(frame_mitte, value=self.dbOrdner_inhalt) 
        self.dbOrdner_scrollbar.config(command=self.dbOrdner_listbox.yview)
        for item in self.dbOrdner_inhalt: self.dbOrdner_listbox.insert("end", item)
        #self.dbOrdner_listbox.bind("<Double-1>",lambda e: print(self.dbOrdner_listbox.get(self.dbOrdner_listbox.curselection())))
            
        self.selected_value = None
        self.dbOrdner_listbox.bind("<Double-1>", lambda e: self.fetch_table_from_selection())
                        
        ########### neue Datenbank anlegen  ##########################
        db_btn=ttk.Button(frame_oben_re, text="neue Datenbank anlegen", command=lambda:self.app.dbneu(host, username, password,self.dbname_var.get(),status_callback=self.update_status))
        db_btn.grid(column=1, row=1,sticky="n",padx=80, pady=30)
        self.dbname_var = tk.StringVar()
        ttk.Entry(frame_oben_re,textvariable=self.dbname_var, width=20).grid(column=1, row=1,sticky="n", padx=0,pady=70)
        dbname = self.dbname_var.get().strip()   
        


Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 20:21
von snafu
Ich bin (im Moment) hier raus, da ich leider nicht verstehe, was dein Ziel ist...

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 20:49
von StMan
ich versuche es mal hiermit:
mein Fenster (root) aufgeteilt in 4 Bereiche.
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xZ0 -----(Sp0- fr_oben_li)--------x------------(Sp0- fr_oben_lre)------------x
xZ1 label--------------------------------x--------------label-------------------------------x
xZ2 label + entry--------------------x-------#################--------x Bereich 1 +2
xZ3 label + entry--------------------x-------#--------listbox--------------#---------x
xZ4 label + entry--------------------x-------#--------------------------------#---------x
xZ5 label--------------------------------x--------################---------x
xxx#xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xZ0------------------------------ Sp0--fr_mitte--------------------------------------------x
x
x-----------------------Bereich 3
x
xZ0----------------------------Sp0--fr_unten----------------------------------------------x
x
x----------------------Bereich4
x
x----------------------------------------------------------------------------------------------------x

Re: Frage zu frames

Verfasst: Dienstag 10. Februar 2026, 21:50
von StMan
Fehler:
nicht: xZ0 -----(Sp0- fr_oben_li)--------x------------(Sp0- fr_oben_lre)------------x
sonder: xZ0 -----(Sp0- fr_oben_li)--------x------------(Sp1- fr_oben_lre)------------x
mehr als 1 leerzeichen kann der Editor scheinbar nicht.