[Tkinter-discuss] Tkinter page layout
btkuhn at email.unc.edu
btkuhn at email.unc.edu
Tue Nov 4 22:59:20 CET 2008
Thanks Guilherme. I think you're right that I must be approaching my
layout incorrectly. Your sample code does work, but I anticipate that
this would get fairly difficult to manage with complex windows. I
thought that I was approaching the layout problem logically. Basically,
I want two frames, one on the left and one on the right, so I created
these frames within the larger (entire window) frame. Then, I want to
fill each frame with various objects; for instance, a text box, label,
button, and listbox in the left frame and a label and text box in the
right. Is there a better way to approach this than what I am doing? My
thinking is that the frames will look very awkward if the widgets take
up the entire frames and the frames "shrink to fit" the widgets.
Thanks again.
Quoting Guilherme Polo <ggpolo at gmail.com>:
> On Tue, Nov 4, 2008 at 5:45 PM, <btkuhn at email.unc.edu> wrote:
>> Hi guys,
>>
>> I'm new to the list; actually just found out it existed. I'm fairly new to
>> python and programming, and I'm just beginning with Tkinter. I'm trying to
>> layout my page, and I'm having problems understanding the action of some of
>> the frames. I actually posted about this on a general python help message
>> board and someone suggested that I repost it to this list. My question is
>> somewhat complex, so in attempt to simplify things a bit I am posting part
>> of a response I posted in a thread on the previous message board. Hopefully
>> this fully describes my problem:
>>
>>
>> When I specify dimensions of the text boxes, no matter how high or low, the
>> enclosing frame seems to adjust to fit the new boxes. So, for instance, if I
>> try inserting a text widget in leftframe with dimensions 1x1, leftframe
>> shrinks down to 1x1. If I make the text widget 100x100, leftframe takes that
>> size. What I want, and what seems like should be happening, is if I have
>> leftframe which is 500X500 pixels, and I create a text box wit effective
>> dimensions of 200X200 (I understand that text widgets use lines as
>> dimensions), the text box should take up a little less than half of
>> leftframe, with leftframe remaining 500X500 pixels. Instead, leftframe is
>> shrinking down to become 200X200, and I can't figure out why. After a while
>> I tried removing the text boxes and I got the same problem. I think maybe
>> this code will better illustrate the problem. This first set of code is the
>> totally stripped down version, and you can see leftframe in white on the
>> left, and rightframe in blue on the right.
>>
>> from Tkinter import *
>> import tkFileDialog,tkSimpleDialog,tkMessageBox
>>
>>
>> WINDOWWIDTH=500
>> WINDOWHEIGHT=500
>> TITLEFONT = ("Courier",12,"normal")
>> HEADINGFONT = ("Helvetica",9,"bold")
>>
>>
>>
>> class App:
>> def __init__ (self,master):
>> self.window = Frame(master,width=WINDOWWIDTH,height=WINDOWHEIGHT)
>> self.window.pack(expand=YES, fill=BOTH)
>> self.master= master
>> self.currentfeeds = []
>> #Create frame to contain all others
>> self.display=Frame(self.window,width=WINDOWWIDTH,height=WINDOWHEIGHT,
>> bg='black')
>> self.display.pack()
>>
>>
>>
>> #Create widgets
>> self.createwidgets()
>> def createwidgets(self):
>> # create a top menu
>> self.addMenu(self.master)
>> self.addToolbar()
>> self.leftframe=Frame(self.display,
>> width=WINDOWWIDTH/3,height=WINDOWHEIGHT, bg='white')
>> self.rightframe=Frame(self.display,
>> width=2*WINDOWWIDTH/3,height=WINDOWHEIGHT, bg='blue')
>> self.leftframe.pack(side="left", expand="yes", fill="x")
>> self.rightframe.pack(side="left", expand="yes", fill="x")
>>
>>
>>
>> def addMenu(self,master):
>> self.menu = Menu(self.window)
>> master.config(menu=self.menu)
>> self.filemenu = Menu(self.menu)
>>
>> def addToolbar(self):
>> self.toolbar = Frame(self.display)
>>
>> self.toolbar.pack(side='top',expand="yes", fill="x")
>>
>>
>> root=Tk()
>> app=App(root)
>>
>> root.mainloop()
>>
>
> You could have simplified a lot more actually. (*)
>
>>
>>
>>
>> Next, if I try to pack ANYTHING inside rightframe, it shrinks down to size
>> and totally distorts my screen dimensions. Here is the exact same code,
>> adding a label widget in self.rightframe. It completely shrinks rightframe
>> and distorts the screen dimensions. Does my question make sense now?
>>
>>
>>
>>
>> from Tkinter import *
>> import tkFileDialog,tkSimpleDialog,tkMessageBox
>>
>>
>> WINDOWWIDTH=500
>> WINDOWHEIGHT=500
>> TITLEFONT = ("Courier",12,"normal")
>> HEADINGFONT = ("Helvetica",9,"bold")
>>
>>
>>
>> class App:
>> def __init__ (self,master):
>> self.window = Frame(master,width=WINDOWWIDTH,height=WINDOWHEIGHT)
>> self.window.pack(expand=YES, fill=BOTH)
>> self.master= master
>> self.currentfeeds = []
>> #Create frame to contain all others
>> self.display=Frame(self.window,width=WINDOWWIDTH,height=WINDOWHEIGHT,
>> bg='black')
>> self.display.pack()
>>
>>
>>
>> #Create widgets
>> self.createwidgets()
>> def createwidgets(self):
>> # create a top menu
>> self.addMenu(self.master)
>> self.addToolbar()
>> self.leftframe=Frame(self.display,
>> width=WINDOWWIDTH/3,height=WINDOWHEIGHT, bg='white')
>> self.rightframe=Frame(self.display,
>> width=2*WINDOWWIDTH/3,height=WINDOWHEIGHT, bg='blue')
>> self.leftframe.pack(side="left", expand="yes", fill="x")
>> self.rightframe.pack(side="left", expand="yes", fill="x")
>>
>>
>>
>> self.label=Label(self.rightframe,text='Current
>> story',font=HEADINGFONT).pack(side='top')
>> def addMenu(self,master):
>> self.menu = Menu(self.window)
>> master.config(menu=self.menu)
>> self.filemenu = Menu(self.menu)
>>
>> def addToolbar(self):
>> self.toolbar = Frame(self.display)
>>
>> self.toolbar.pack(side='top',expand="yes", fill="x")
>>
>>
>> root=Tk()
>> app=App(root)
>>
>> root.mainloop()
>>
>
> See (*).
>
>
> Thinking about your problem for a moment, it is not really a problem.
> You are not supposed to develop GUI applications with a completely
> fixed layout, because people that will use the GUI app will adjust it
> according to their preferences. It is very very bad to layout widgets
> like that, and harder too. You should rethink about the problem you
> are trying to solve.
>
> Said that, it is possibly to manually position things without using
> pack or grid, that is, use place for that. But.. reconsider what you
> are doing. Nevertheless, follows a sample that demonstrate what you
> seems to want right now:
>
>
> from Tkinter import Tk, Frame, Label
>
> WINDOWWIDTH = 500
> WINDOWHEIGHT = 500
>
> class App:
> def __init__ (self):
> #Create frame to contain all others
> self.display = Frame(width=WINDOWWIDTH, height=WINDOWHEIGHT)
> self.display.pack()
>
> #Create widgets
> self.createwidgets()
>
> def createwidgets(self):
> self.leftframe=Frame(self.display, width=WINDOWWIDTH / 3,
> height=WINDOWHEIGHT, bg='red')
> self.rightframe=Frame(self.display, width=2 * WINDOWWIDTH / 3,
> height=WINDOWHEIGHT, bg='blue')
> self.leftframe.pack(side="left", expand=True, fill="x")
> self.rightframe.pack(side="left", expand=True, fill="x")
>
> label = Label(self.rightframe, text='test')
> label.place(x=200, y=200)
>
>
> root = Tk()
> app = App()
> root.mainloop()
>
>
> It is possible that you are after paned windows, that is perfectly
> understandable then. For that, take a look at Tkinter.PanedWindow
>
> --
> -- Guilherme H. Polo Goncalves
>
More information about the Tkinter-discuss
mailing list