Reputation: 25
Very simple question that I cannot find the answer to on Stack Exchange. (Only this misleading thread: Python3 Tkinter: Grids Within Grids? Frames Alongside Other Frames? which sadly does not answer the question).
I am using tkinter with Python to attempt a program with a GUI. Unfortunately, I completely do not understand the grid system.
I was under the impression that each frame contains its own grid system, where 0,0 is the top-left of that frame.
I created this code:
root = Tk()
main_frame = Frame(root, width='1520', height='1080', bg='#a1a1a1').grid(row=0, column=1)
side_frame = Frame(root, width='400', height='1080', bg='#757575').grid(row=0, column=0)
header_label = Label(main_frame, text='Heading', font=('Agency', 48), bg='#a1a1a1', fg='#ffffff').grid(row=0, column=0)
And hoped that because the label is set to (0,0) in the main frame, that the label would appear in the main frame. However, it didn't. I find that a bit odd and upsetting. Below is a picture of what is instead happening - the header label is appearing in the 'side_frame'.
Could someone please explain to me how the grid system works? I wasn't really having trouble until I tried to add a scrollbar to the main_frame - I then realised that there's some serious awkwardness embedded within tkinter and I'd like to properly understand it.
Thanks!
Upvotes: 1
Views: 176
Reputation: 386325
The problem is that you're setting main_frame
and side_frame
to None
, so passing that as the parent for any other widget will make that widget a child of the root widget.
That is because in python x=y().z()
sets the value of x
to z()
. Thus, when you do main_frame = Frame(...).grid(...)
sets main_frame
to the result of .grid(...)
, and grid
always returns None
.
You should separate widget creation from widget layout, and this is one of the reasons why. The other big reason is that it makes the code easier to read and visualize.
main_frame = Frame(root, width='1520', height='1080', bg='#a1a1a1')
side_frame = Frame(root, width='400', height='1080', bg='#757575')
main_frame.grid(row=0, column=1)
side_frame.grid(row=0, column=0)
Upvotes: 1