22

I got this Text widget, and I'd like for it to expand and fill its entire parent, using the Grid geometry manager.

According to the examples I've seen, this sample program should work, alas it doesn't, when expanding the window, the contents are not resizing.

from Tkinter import *
root = Tk()

input_text_area = Text(root)
input_text_area.grid(row=1, column=0, columnspan=4, sticky=W+E)
input_text_area.configure(background='#4D4D4D')

root.mainloop()

Any help is appreciated

For what it's worth, I'm running in Python 2.7 (latest 2.x version), and coding in PyCharm, though I don't think the IDE is relevant.

nbro
  • 15,395
  • 32
  • 113
  • 196
SoManyGoblins
  • 5,605
  • 8
  • 45
  • 65

3 Answers3

29

When using grid, any extra space in the parent is allocated proportionate to the "weight" of a row and/or a column (ie: a column with a weight of 2 gets twice as much of the space as one with a weight of 1). By default, rows and columns have a weight of 0 (zero), meaning no extra space is given to them.

You need to give the column that the widget is in a non-zero weight, so that any extra space when the window grows is allocated to that column.

root.grid_columnconfigure(0, weight=1)

You'll also need to specify a weight for the row, and a sticky value of N+S+E+W if you want it to grow in all directions.

Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
20

Since your window only contains one widget and you want this widget to fill the entire window, it would be easier to use the pack geometry manager instead of grid

input_text_area.pack(expand=True, fill='both')

expand=True tells Tkinter to allow the widget to expand to fill any extra space in the geometry master. fill='both' enables the widget to expand both horizontally and vertically.

  • 6
    My code was just an example, my layout is a bit more complex, I reduced the problem to the minimum expression, I don't really want to use the pack geometry manager, I find it even more appallingly awful to use for less than trivial UIs. – SoManyGoblins Feb 09 '15 at 22:00
7
from tkinter import *
root = Tk()

input_text_area = Text(root)
input_text_area.grid(row=0, column=0, columnspan=4, sticky=N+S+W+E)
input_text_area.configure(background='#4D4D4D')
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

root.mainloop()

not sure if this is what you want. but this fills the entire screen.

Ajay
  • 81
  • 1
  • 2