Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set the min and max height or width of a Frame?

The size of Tkinter windows can be controlled via the following methods:

.minsize() .maxsize() .resizable() 

Are there equivalent ways to control the size of Tkinter or ttk Frames?

@Bryan: I changed your frame1.pack code to the following:

frame1.pack(fill='both', expand=True) frame1.bind( '<Configure>', maxsize ) 

And I added this event handler:

# attempt to prevent frame from growing past a certain size def maxsize( event=None ):     print frame1.winfo_width()     if frame1.winfo_width() > 200:         print 'frame1 wider than 200 pixels'         frame1.pack_propagate(0)         frame1.config( width=200 )         return 'break' 

The above event handler detects that a frame's width is too big, but is unable to prevent the increase in size from happening. Is this a limitation of Tkinter or have I misunderstood your explanation?

like image 428
Malcolm Avatar asked Dec 09 '10 14:12

Malcolm


People also ask

How to set height and width of frame in Tkinter?

By default, Tkinter Frame fits to its children and thus its width and height depends on its children. You can override this behavior and force a specific width and height to the frame. To force the width and height of frame widget call pack_propagate(0) on the frame.

How do you change the size of a frame in Python?

To change the frame width dynamically, we can use the configure() method and define the width property in it.

How do I stop my frames from resizing?

To make the frame constant in size, we have to stop the widgets to resize the frame. So there are three methods, Boolean pack_propagate(True/False) method prevents the resizing of the frame from the widget. resizable(x,y) method prevents the window to be resized.

What is Labelframe in tkinter?

A labelframe is a simple container widget. Its primary purpose is to act as a spacer or container for complex window layouts. This widget has the features of a frame plus the ability to display a label.


2 Answers

There is no single magic function to force a frame to a minimum or fixed size. However, you can certainly force the size of a frame by giving the frame a width and height. You then have to do potentially two more things: when you put this window in a container you need to make sure the geometry manager doesn't shrink or expand the window. Two, if the frame is a container for other widget, turn grid or pack propagation off so that the frame doesn't shrink or expand to fit its own contents.

Note, however, that this won't prevent you from resizing a window to be smaller than an internal frame. In that case the frame will just be clipped.

import Tkinter as tk  root = tk.Tk() frame1 = tk.Frame(root, width=100, height=100, background="bisque") frame2 = tk.Frame(root, width=50, height = 50, background="#b22222")  frame1.pack(fill=None, expand=False) frame2.place(relx=.5, rely=.5, anchor="c")  root.mainloop() 
like image 183
Bryan Oakley Avatar answered Oct 01 '22 03:10

Bryan Oakley


A workaround - at least for the minimum size: You can use grid to manage the frames contained in root and make them follow the grid size by setting sticky='nsew'. Then you can use root.grid_rowconfigure and root.grid_columnconfigure to set values for minsize like so:

from tkinter import Frame, Tk  class MyApp():     def __init__(self):         self.root = Tk()          self.my_frame_red = Frame(self.root, bg='red')         self.my_frame_red.grid(row=0, column=0, sticky='nsew')          self.my_frame_blue = Frame(self.root, bg='blue')         self.my_frame_blue.grid(row=0, column=1, sticky='nsew')          self.root.grid_rowconfigure(0, minsize=200, weight=1)         self.root.grid_columnconfigure(0, minsize=200, weight=1)         self.root.grid_columnconfigure(1, weight=1)          self.root.mainloop()  if __name__ == '__main__':     app = MyApp() 

But as Brian wrote (in 2010 :D) you can still resize the window to be smaller than the frame if you don't limit its minsize.

like image 29
Richard Avatar answered Oct 01 '22 04:10

Richard