Tkinter window geometry to manage height width and zoom out using state and resizable() option
Our parent window is referred as my_w in all our examples below.
my_w = tk.Tk()
Resize the window
There is a button at the top bar for the user to resize the parent window. By holding and dragging the edges we can resize the window.
We can prevent this by using resizable() option. By default width and height values are 1 ( True ).
my_w.resizable(width=0,height=0) # size change Not allowed
We can only allow horizontally resizing the window.
my_w.resizable(width=1,height=0)
state
By managing the state method we can maximize the window to full screen. Values for this option are normal ( default value ) , iconic, withdrawn, or zoomed
my_w.state('zoomed')
Zooming the parent window
We can increase or decrease the width , height from inside the window by managing the geometry() option. We can place buttons in our window to zoom in or zoom out the parent window.
We used the click event of button to call a function my_resize() and inside it change the width and height of parent window.
minsize() and maxsize()
We can restrict the height and width of the window by using minsize() and maxsize(). These are the end limits for our height width for expansion and contraction of the window.
Tkinter managing window geometry by width and height for dynamic creation of Buttons
my_w.winfo_geometry(): The string showing size and on-screen location. my_w.winfo_height(): The current height of the window.( May not be updated) my_w.winfo_width(): The current width of the window.( May not be updated) my_w.winfo_reqheight(): The requested minimum height required. May change after geometry manager my_w.winfo_reqwidth(): The requested minimum width required. May change after geometry manager my_w.winfo_screenheight(): Screen height in pixel my_w.winfo_screenwidth(): Screen width in pixel my_w.winfo_idletasks(): to force the display to be updated before the application next idles
The geometry is not accurate until the application has updated its idle tasks. In particular, all geometries are initially '1x1+0+0' until the widgets and geometry manager have negotiated their sizes and positions.
To get the correct dimensions we have to use any event and then take the fresh data. We can also force updation by using winfo_idletasks().
Here is one example where number of buttons are not fixed, so different width requirment may come up based on the number of languages are there in the list.
Check how the outputs changes ( showing width and height ) at different stages of the program.
import tkinter as tk
my_w = tk.Tk()
width,height=50,217
v_dim=str(width)+'x'+str(height)
my_w.geometry(v_dim)
#my_w.maxsize(300,220) # (maximum ) width , ( maximum) height
#my_w.minsize(250,220) # (minimum ) width , ( minimum) height
my_w.resizable(True, True)
my_w.title("www.plus2net.com") # Adding a title
languages = ("PHP",'Python','Perl','JQuery','Java','MySQL','CSS','Oracle')
var = 0
def my_upd():
print('****')
print('screenwidth',str(my_w.winfo_screenwidth())) # Width of the screen
print('reqwidth',str(my_w.winfo_reqwidth())) # Requested width of the window
print('width',str(my_w.winfo_width())) # width of the window
print('screenheight',str(my_w.winfo_screenheight())) # Screen height
print('reqheight:',str(my_w.winfo_reqheight())) # rquested width of the window
print('height:',str(my_w.winfo_height())) # width of the window
print('****')
for language in languages:
btn = tk.Button(my_w, text=language,command=lambda:my_upd())
btn.grid(row=1,column=var,padx=2,pady=10)
var += 1
width=50*len(languages) # set width based on number of buttons
v_dim=str(width)+'x'+str(height)
my_w.geometry(v_dim)
print('screenwidth',str(my_w.winfo_screenwidth())) # Width of the screen
print('reqwidth',str(my_w.winfo_reqwidth())) # Requested width of the window
print('width',str(my_w.winfo_width())) # width of the window
print('screenheight',str(my_w.winfo_screenheight())) # Screen height
print('reqheight:',str(my_w.winfo_reqheight())) # rquested width of the window
print('height:',str(my_w.winfo_height())) # width of the window
my_w.update_idletasks() # Update the idle to update display
print('####')
print('screenwidth',str(my_w.winfo_screenwidth())) # Width of the screen
print('reqwidth',str(my_w.winfo_reqwidth())) # Requested width of the window
print('width',str(my_w.winfo_width())) # width of the window
print('screenheight',str(my_w.winfo_screenheight())) # Screen height
print('reqheight:',str(my_w.winfo_reqheight())) # rquested width of the window
print('height:',str(my_w.winfo_height())) # width of the window
print('####')
my_w.mainloop()