How to prevent Tkinter frame resize?

G

Guest

I am trying to prevent a user from resizing a frame beyond its
"natural" size as given by winfo_reqwidth and winfo_reqheight, without
any success. Can anyone make any suggestions, based on my code below?

Thanks!

from Tkinter import *

class Table(Frame):
def __init__(self, master,
rows=['row 1'], cols=['col 1'],
row_labels=True,
col_labels=True,
row_buttons=True,
col_buttons=True):
Frame.__init__(self, master)
self.rows = rows
self.cols = cols
self.row_labels = row_labels
self.col_labels = col_labels
self.row_buttons = row_buttons
self.col_buttons = col_buttons
self.col_width = 6
self.draw()
self.bind('<Configure>', self.changed)
def changed(self, ev):
w, h = self.winfo_reqwidth(), self.winfo_reqheight()
cfg = {}
if ev.height > h:
cfg['height'] = h
if ev.width > w:
cfg['width'] = w
if cfg:
self.config(**cfg) ######## this has no effect ########
def draw(self):
if self.row_labels or self.row_buttons:
col = 1
for t in self.cols:
if self.row_labels:
e = Entry(self, width=self.col_width,
relief=GROOVE)
e.insert(INSERT, t)
e.grid(row=0, column=col+1)
if self.row_buttons:
e = Label(self, text=col, width=self.col_width,
relief=GROOVE,bg='gray', fg='blue')
e.grid(row=1, column=col+1)
col += 1
if self.col_labels or self.col_buttons:
row = 1
for t in self.rows:
if self.col_labels:
e = Entry(self, width=15,
relief=GROOVE)
e.insert(INSERT, t)
e.grid(row=row+1, column=0)
if self.col_buttons:
e = Label(self, text=row, width=self.col_width,
relief=GROOVE,bg='gray', fg='blue')
e.grid(row=row+1, column=1)
row += 1


if __name__ == '__main__':
top = Tk()
cols = ['col %s' % i for i in range(5)]
rows = ['row %s' % i for i in range(5)]
s = Table(top, rows=rows, cols=cols)
s.pack(fill=BOTH, expand=1)
mainloop()
 
M

Martin Franklin

I am trying to prevent a user from resizing a frame beyond its
"natural" size as given by winfo_reqwidth and winfo_reqheight, without
any success. Can anyone make any suggestions, based on my code below?

Thanks!

from Tkinter import *

class Table(Frame):
def __init__(self, master,
rows=['row 1'], cols=['col 1'],
row_labels=True,
col_labels=True,
row_buttons=True,
col_buttons=True):
Frame.__init__(self, master)
self.rows = rows
self.cols = cols
self.row_labels = row_labels
self.col_labels = col_labels
self.row_buttons = row_buttons
self.col_buttons = col_buttons
self.col_width = 6
self.draw()
self.bind('<Configure>', self.changed)
def changed(self, ev):
w, h = self.winfo_reqwidth(), self.winfo_reqheight()
cfg = {}
if ev.height > h:
cfg['height'] = h
if ev.width > w:
cfg['width'] = w
if cfg:
self.config(**cfg) ######## this has no effect ########

I'm not sure I follow your code but this method is bound to the
<Configure> event *but* needs to return the string "break" so that it
does not pass that event on to the default event handler.



def changed(self, ev):
w, h = self.winfo_reqwidth(), self.winfo_reqheight()
cfg = {}
if ev.height > h:
cfg['height'] = h
if ev.width > w:
cfg['width'] = w
if cfg:
self.config(**cfg) ######## this has no effect ########
return "break"

This may do what you want.....

Cheers
Martin
 
G

Guest

I've tried this, but it still doesn't work. At this point I suspect
that the problem is not with the resizing of the frame, but of the
toplevel widget in which the frame lives. I've been tinkering with
that, but still without success.
 
J

Jeff Epler

Use the wm_resizable method of the toplevel widget.
Jeff

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)

iD8DBQFCaVNMJd01MZaTXX0RAhxaAKCSR+h6qrlc8SKt3nWUGIHHlk9JrwCffrXw
HUnG2UnjDDASTq/6g9M1TNI=
=IVP0
-----END PGP SIGNATURE-----
 
G

Guest

That's a useful tidbit of knowledge, but it doesn't quite get at what
I'm trying to do.

I want to allow a window to be resized, limited to some maximum size.
My approach was to use the <Configure> event to capture window resize
events. Then, if the new size is larger than the maximum, I would force
it back to the maximum size by reconfiguring the height and width of
the widget.
 
M

Markus Weihs

Hi!

I think what you want is maxsize():


from Tkinter import *

root = Tk()
root.maxsize(100,100)
root.mainloop()


Regards, Mark
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,994
Messages
2,570,223
Members
46,812
Latest member
GracielaWa

Latest Threads

Top