Search code examples
pythonuser-interfacetkinterframe

Python Tkinter frame newby geometry problem?


I am very new in tkinter and python. Thats how my code looks:

import tkinter as tk

main = tk.Tk()
# Window size
main.geometry("400x700")
main.resizable(0, 0)

# Window position
w = main.winfo_reqwidth()
h = main.winfo_reqheight()
ws = main.winfo_screenwidth()
hs = main.winfo_screenheight()
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
main.geometry('+%d+%d' % (x, y))

fr1 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#271ee3", width=400, height=50)
fr2 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#0d9467", width=200, height=650)
fr3 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#3e1854", width=200, height=650)

fr1.pack()
fr2.pack(side="left")
fr3.pack(side="right")

main.mainloop()

With this code I get the following window

So far so good. The problem comes when i add this code:

# Label
l = tk.Label(fr2, text="Heyho")
l.grid(row=0, column=0)

Now it looks so

My goal is to get a window where i have in the first frame (fr1) a button that has the same geometry like fr1. In fr2 und fr3 I want to have severel labels among each other. My labels in fr2 und fr3 should have column 0 but ascending rows (0,1,2,3...). How can I do it??


Solution

  • It automatically resize Frame to Label's size so you don't see green background which is hidden behind label - and you see main window's gray background.

    You can see it better if you add other longer label and red background in main window

    enter image description here

    If you add

    fr2.grid_propagate(False)
    

    then frame will keep its size

    enter image description here

    but you still have problem with grid which doesn't use full size of Frame and you can't center it or align to right.

    If you add

    fr2.grid_columnconfigure(0, weight=1)
    

    then column 0 will try to use full size if there is no other columns, and label will be centered in cell

    enter image description here

    If you use

    sticky='we' 
    

    in grid() for labels then they will fill cell

    enter image description here


    import tkinter as tk
    
    main = tk.Tk()
    # Window size
    main.geometry("400x200")
    main.resizable(0, 0)
    main['bg'] = 'red'
    # Window position
    w = main.winfo_reqwidth()
    h = main.winfo_reqheight()
    ws = main.winfo_screenwidth()
    hs = main.winfo_screenheight()
    x = (ws/2) - (w/2)
    y = (hs/2) - (h/2)
    main.geometry('+%d+%d' % (x, y))
    
    fr1 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#271ee3", width=400, height=50)
    fr2 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#0d9467", width=200, height=650)
    fr3 = tk.Frame(main, borderwidth=2, relief="solid", bg = "#3e1854", width=200, height=650)
    
    fr1.pack()
    fr2.pack(side="left")
    fr3.pack(side="right")
    
    
    fr2.grid_propagate(False)
    fr2.grid_columnconfigure(0, weight=1)
    
    l1 = tk.Label(fr2, text="Heyho")
    l1.grid(row=0, column=0, sticky='we')
    
    l2 = tk.Label(fr2, text="Hello World")
    l2.grid(row=1, column=0, sticky='we')
    
    main.mainloop()