By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,592 Members | 1,482 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,592 IT Pros & Developers. It's quick & easy.

How to prevent Tkinter frame resize?

P: n/a
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()

Jul 19 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
ph*****************@yahoo.com wrote:
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

Jul 19 '05 #2

P: n/a
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.

Jul 19 '05 #3

P: n/a
Use the wm_resizable method of the toplevel widget.
from Tkinter import *; t = Tk(); t.wm_resizable(0,0); t.mainloop()


Jeff

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

iD8DBQFCaVNMJd01MZaTXX0RAhxaAKCSR+h6qrlc8SKt3nWUGI HHlk9JrwCffrXw
HUnG2UnjDDASTq/6g9M1TNI=
=IVP0
-----END PGP SIGNATURE-----

Jul 19 '05 #4

P: n/a
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.

Jul 19 '05 #5

P: n/a
Hi!

I think what you want is maxsize():
from Tkinter import *

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

Jul 19 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.