Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #102104 > unrolled thread

Tkinter spacing

Started byKP <kai.peters@gmail.com>
First post2016-01-25 19:41 -0800
Last post2016-01-27 07:48 +0100
Articles 7 — 4 participants

Back to article view | Back to comp.lang.python


Contents

  Tkinter spacing KP <kai.peters@gmail.com> - 2016-01-25 19:41 -0800
    Re: Tkinter spacing Peter Otten <__peter__@web.de> - 2016-01-26 09:07 +0100
    Re: Tkinter spacing high5storage@gmail.com - 2016-01-26 07:55 -0800
      Re: Tkinter spacing Peter Otten <__peter__@web.de> - 2016-01-26 17:39 +0100
    Re: Tkinter spacing high5storage@gmail.com - 2016-01-26 14:48 -0800
      Re: Tkinter spacing Christian Gollwitzer <auriocus@gmx.de> - 2016-01-27 07:50 +0100
    Re: Tkinter spacing Christian Gollwitzer <auriocus@gmx.de> - 2016-01-27 07:48 +0100

#102104 — Tkinter spacing

FromKP <kai.peters@gmail.com>
Date2016-01-25 19:41 -0800
SubjectTkinter spacing
Message-ID<e8736485-c4d6-4868-8da1-64ada4767bc1@googlegroups.com>
If I want to have some space between, say, btn_last & btn_new, will I have to use a dummy label in between these two or is there a better way?

Thanks for any help, as always!




from tkinter import *
from tkinter import ttk

root = Tk()
root.geometry("822x600+100+100")
nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3, 10, 3))

btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons showing text only, this will be text units (= average characters?)
btn_prev   = ttk.Button(nav_bar, text='<',  width=4)  # for image buttons, it will be in pixels 
btn_next   = ttk.Button(nav_bar, text='>',  width=4)
btn_last   = ttk.Button(nav_bar, text='>|', width=4)
btn_new    = ttk.Button(nav_bar, text='New')
btn_edit   = ttk.Button(nav_bar, text='Edit')
btn_delete = ttk.Button(nav_bar, text='Delete')
btn_cancel = ttk.Button(nav_bar, text='Cancel')
btn_print  = ttk.Button(nav_bar, text='Print')
btn_help   = ttk.Button(nav_bar, text='Help')
btn_save   = ttk.Button(nav_bar, text='Save')
lbl_Recs   = ttk.Label(nav_bar,  text='Records')
lbl_RCount = ttk.Label(nav_bar,  text='0 ', width=10, borderwidth=2, relief='sunken', anchor='e')  # fake entry look

nav_bar.grid(column=0, row=0, columnspan=13)

btn_first.grid(column=0, row=0)
btn_prev.grid(column=1,  row=0)
btn_next.grid(column=2,  row=0)
btn_last.grid(column=3,  row=0)

btn_new.grid(column=4,    row=0)
btn_edit.grid(column=5,   row=0)
btn_delete.grid(column=6, row=0)
btn_cancel.grid(column=7, row=0)

lbl_Recs.grid(column=8,   row=0, padx=5)
lbl_RCount.grid(column=9, row=0, padx=5)
btn_print.grid(column=10, row=0)
btn_help.grid(column=11,  row=0)
btn_save.grid(column=12,  row=0)

root.mainloop()

[toc] | [next] | [standalone]


#102108

FromPeter Otten <__peter__@web.de>
Date2016-01-26 09:07 +0100
Message-ID<mailman.1.1453795699.2338.python-list@python.org>
In reply to#102104
KP wrote:

> If I want to have some space between, say, btn_last & btn_new, will I have
> to use a dummy label in between these two or is there a better way?
> 
> Thanks for any help, as always!

You could use nested frames with nonzero padding, e. g:

nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(0, 3))

nav_bar1 = ttk.Frame(nav_bar, padding=(5, 0))
nav_bar1.pack(side=LEFT)

btn_first  = ttk.Button(nav_bar1, text='|<', width=4)  
btn_first.grid(column=0, row=0)
...

nav_bar2 = ttk.Frame(nav_bar, padding=(5, 0))
nav_bar2.pack(side=LEFT)

btn_new    = ttk.Button(nav_bar2, text='New')
btn_new.grid(column=0, row=0)
...

> from tkinter import *
> from tkinter import ttk
> 
> root = Tk()
> root.geometry("822x600+100+100")
> nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3,
> 10, 3))
> 
> btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons
> showing text only, this will be text units (= average characters?)
> btn_prev   = ttk.Button(nav_bar, text='<',  width=4)  # for image buttons,
> it will be in pixels
> btn_next   = ttk.Button(nav_bar, text='>',  width=4)
> btn_last   = ttk.Button(nav_bar, text='>|', width=4)
> btn_new    = ttk.Button(nav_bar, text='New')
> btn_edit   = ttk.Button(nav_bar, text='Edit')
> btn_delete = ttk.Button(nav_bar, text='Delete')
> btn_cancel = ttk.Button(nav_bar, text='Cancel')
> btn_print  = ttk.Button(nav_bar, text='Print')
> btn_help   = ttk.Button(nav_bar, text='Help')
> btn_save   = ttk.Button(nav_bar, text='Save')
> lbl_Recs   = ttk.Label(nav_bar,  text='Records')
> lbl_RCount = ttk.Label(nav_bar,  text='0 ', width=10, borderwidth=2,
> relief='sunken', anchor='e')  # fake entry look
> 
> nav_bar.grid(column=0, row=0, columnspan=13)
> 
> btn_first.grid(column=0, row=0)
> btn_prev.grid(column=1,  row=0)
> btn_next.grid(column=2,  row=0)
> btn_last.grid(column=3,  row=0)
> 
> btn_new.grid(column=4,    row=0)
> btn_edit.grid(column=5,   row=0)
> btn_delete.grid(column=6, row=0)
> btn_cancel.grid(column=7, row=0)
> 
> lbl_Recs.grid(column=8,   row=0, padx=5)
> lbl_RCount.grid(column=9, row=0, padx=5)
> btn_print.grid(column=10, row=0)
> btn_help.grid(column=11,  row=0)
> btn_save.grid(column=12,  row=0)
> 
> root.mainloop()

[toc] | [prev] | [next] | [standalone]


#102127

Fromhigh5storage@gmail.com
Date2016-01-26 07:55 -0800
Message-ID<9ce727b5-db2d-41a1-ab51-e32f8ec614c8@googlegroups.com>
In reply to#102104
On Monday, January 25, 2016 at 7:41:57 PM UTC-8, KP wrote:
> If I want to have some space between, say, btn_last & btn_new, will I have to use a dummy label in between these two or is there a better way?
> 
> Thanks for any help, as always!
> 
> 
> 
> 
> from tkinter import *
> from tkinter import ttk
> 
> root = Tk()
> root.geometry("822x600+100+100")
> nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3, 10, 3))
> 
> btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons showing text only, this will be text units (= average characters?)
> btn_prev   = ttk.Button(nav_bar, text='<',  width=4)  # for image buttons, it will be in pixels 
> btn_next   = ttk.Button(nav_bar, text='>',  width=4)
> btn_last   = ttk.Button(nav_bar, text='>|', width=4)
> btn_new    = ttk.Button(nav_bar, text='New')
> btn_edit   = ttk.Button(nav_bar, text='Edit')
> btn_delete = ttk.Button(nav_bar, text='Delete')
> btn_cancel = ttk.Button(nav_bar, text='Cancel')
> btn_print  = ttk.Button(nav_bar, text='Print')
> btn_help   = ttk.Button(nav_bar, text='Help')
> btn_save   = ttk.Button(nav_bar, text='Save')
> lbl_Recs   = ttk.Label(nav_bar,  text='Records')
> lbl_RCount = ttk.Label(nav_bar,  text='0 ', width=10, borderwidth=2, relief='sunken', anchor='e')  # fake entry look
> 
> nav_bar.grid(column=0, row=0, columnspan=13)
> 
> btn_first.grid(column=0, row=0)
> btn_prev.grid(column=1,  row=0)
> btn_next.grid(column=2,  row=0)
> btn_last.grid(column=3,  row=0)
> 
> btn_new.grid(column=4,    row=0)
> btn_edit.grid(column=5,   row=0)
> btn_delete.grid(column=6, row=0)
> btn_cancel.grid(column=7, row=0)
> 
> lbl_Recs.grid(column=8,   row=0, padx=5)
> lbl_RCount.grid(column=9, row=0, padx=5)
> btn_print.grid(column=10, row=0)
> btn_help.grid(column=11,  row=0)
> btn_save.grid(column=12,  row=0)
> 
> root.mainloop()

Hmm - this only gives me an empty window (no errors). 
What puzzles me that every book/site on tkinter strongly warns of mixing pack and grid managers...

Any ideas?

[toc] | [prev] | [next] | [standalone]


#102132

FromPeter Otten <__peter__@web.de>
Date2016-01-26 17:39 +0100
Message-ID<mailman.20.1453826400.2338.python-list@python.org>
In reply to#102127
high5storage@gmail.com wrote:

>> from tkinter import *
>> from tkinter import ttk
>> 
>> root = Tk()
>> root.geometry("822x600+100+100")
>> nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3,
>> 10, 3))
>> 
>> btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons
>> root.mainloop()
> 
> Hmm - this only gives me an empty window (no errors).

That's strange. 

If you ran the script in Idle, try again from the commandline.

> What puzzles me that every book/site on tkinter strongly warns of mixing
> pack and grid managers...

You can mix pack and grid for one window, but you have to pick one layout 
manager per parent widget:

top = Toplevel(root)

panel = Frame(top)
panel.pack(...) 
# we picked pack() and now have to use it for all
# children of top
canvas = Canvas(top, ...)
canvas.pack(...) # must use pack() again

# we are free to pick a layout for panel
ok = Button(panel)
ok.grid(...)
# we picked grid() and now have to use it for all 
# children of panel
cancel = Button(panel)
cancel.grid(...) # must use grid()

[toc] | [prev] | [next] | [standalone]


#102139

Fromhigh5storage@gmail.com
Date2016-01-26 14:48 -0800
Message-ID<b9776059-d644-45ef-a95f-f57017ccaa4d@googlegroups.com>
In reply to#102104
On Monday, January 25, 2016 at 7:41:57 PM UTC-8, KP wrote:
> If I want to have some space between, say, btn_last & btn_new, will I have to use a dummy label in between these two or is there a better way?
> 
> Thanks for any help, as always!
> 
> 
> 
> 
> from tkinter import *
> from tkinter import ttk
> 
> root = Tk()
> root.geometry("822x600+100+100")
> nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3, 10, 3))
> 
> btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons showing text only, this will be text units (= average characters?)
> btn_prev   = ttk.Button(nav_bar, text='<',  width=4)  # for image buttons, it will be in pixels 
> btn_next   = ttk.Button(nav_bar, text='>',  width=4)
> btn_last   = ttk.Button(nav_bar, text='>|', width=4)
> btn_new    = ttk.Button(nav_bar, text='New')
> btn_edit   = ttk.Button(nav_bar, text='Edit')
> btn_delete = ttk.Button(nav_bar, text='Delete')
> btn_cancel = ttk.Button(nav_bar, text='Cancel')
> btn_print  = ttk.Button(nav_bar, text='Print')
> btn_help   = ttk.Button(nav_bar, text='Help')
> btn_save   = ttk.Button(nav_bar, text='Save')
> lbl_Recs   = ttk.Label(nav_bar,  text='Records')
> lbl_RCount = ttk.Label(nav_bar,  text='0 ', width=10, borderwidth=2, relief='sunken', anchor='e')  # fake entry look
> 
> nav_bar.grid(column=0, row=0, columnspan=13)
> 
> btn_first.grid(column=0, row=0)
> btn_prev.grid(column=1,  row=0)
> btn_next.grid(column=2,  row=0)
> btn_last.grid(column=3,  row=0)
> 
> btn_new.grid(column=4,    row=0)
> btn_edit.grid(column=5,   row=0)
> btn_delete.grid(column=6, row=0)
> btn_cancel.grid(column=7, row=0)
> 
> lbl_Recs.grid(column=8,   row=0, padx=5)
> lbl_RCount.grid(column=9, row=0, padx=5)
> btn_print.grid(column=10, row=0)
> btn_help.grid(column=11,  row=0)
> btn_save.grid(column=12,  row=0)
> 
> root.mainloop()

Ah - that clears it up. Thanks for your help!

[toc] | [prev] | [next] | [standalone]


#102145

FromChristian Gollwitzer <auriocus@gmx.de>
Date2016-01-27 07:50 +0100
Message-ID<n89p5m$vo3$2@dont-email.me>
In reply to#102139
Am 26.01.16 um 23:48 schrieb high5storage@gmail.com:
> On Monday, January 25, 2016 at 7:41:57 PM UTC-8, KP wrote:
> > [fullquote snipped]
> Ah - that clears it up. Thanks for your help!

It is totally unclear what you reply to. PLease cite what you refer to, 
and shorten your citation for clarity.

	Christian

[toc] | [prev] | [next] | [standalone]


#102144

FromChristian Gollwitzer <auriocus@gmx.de>
Date2016-01-27 07:48 +0100
Message-ID<n89p39$vo3$1@dont-email.me>
In reply to#102104
Am 26.01.16 um 04:41 schrieb KP:
> If I want to have some space between, say, btn_last & btn_new, will
> I  have to use a dummy label in between these two or is there a better way?

If you just want to put space there, you can use the pad options of 
grid, just like you do for lbl_Recs. Specifically, if you want to put it 
on one side only, you'd do:

	btn_new.grid(column=4, row=0, padx="20 0")

which does 20px of space to the left of btn_new. Besides that, I have a 
few comments (I assume you are new to Tkinter and/or GUI programming in 
general)

> from tkinter import *
> from tkinter import ttk
>
> root = Tk()

> root.geometry("822x600+100+100")

This is very bad. The grid geometry manager calculates the needed space 
automatically. Your code fails, if you use a different ttk theme, or a 
different font size. For instance, on my OSX computer, the window is cut 
off at the right side at the Print button. Delete this line. As soon as 
you fill the bottom with content, the window will look reasonanble.

> nav_bar = ttk.Frame(root, borderwidth=2, relief='ridge', padding=(10, 3, 10, 3))
>
> btn_first  = ttk.Button(nav_bar, text='|<', width=4)  # for buttons showing text only, this will be text units (= average characters?)
> btn_prev   = ttk.Button(nav_bar, text='<',  width=4)  # for image buttons, it will be in pixels
> btn_next   = ttk.Button(nav_bar, text='>',  width=4)
> btn_last   = ttk.Button(nav_bar, text='>|', width=4)

If you want these buttons to look like a real Toolbur, there is a ttk 
widget class for that. Try:


btn_first  = ttk.Button(nav_bar, text='|<', style="Toolbutton")
btn_prev   = ttk.Button(nav_bar, text='<',  style="Toolbutton")
btn_next   = ttk.Button(nav_bar, text='>',  style="Toolbutton")
btn_last   = ttk.Button(nav_bar, text='>|', style="Toolbutton")


Also note that I left off the manual width. Probably you wwant to use 
images in the end, and if these all have the same size, which is usual 
for an icon set (32x32 or 48x48, e.g.) then the size of all the buttons 
will look good. You shouldn't have to set size values manually.

> btn_new    = ttk.Button(nav_bar, text='New')
> btn_edit   = ttk.Button(nav_bar, text='Edit')
> btn_delete = ttk.Button(nav_bar, text='Delete')
> btn_cancel = ttk.Button(nav_bar, text='Cancel')
> btn_print  = ttk.Button(nav_bar, text='Print')
> btn_help   = ttk.Button(nav_bar, text='Help')
> btn_save   = ttk.Button(nav_bar, text='Save')
> lbl_Recs   = ttk.Label(nav_bar,  text='Records')


> lbl_RCount = ttk.Label(nav_bar,  text='0 ', width=10, borderwidth=2, relief='sunken', anchor='e')  # fake entry look

This will also look correct only with some themes. Maybe you want a 
readonly or disabled entry? You can do this like

sometkvar=Tk.StringVar()
lbl_RCount = ttk.Entry(nav_bar,  textvariable=sometkvar, width=10, 
state='readonly')
sometkvar.set('0 ')



> nav_bar.grid(column=0, row=0, columnspan=13)

There is no need to give the nav_bar a columnspan. So far you have no 
elements in the main frame besides the nav_bar. Columnspan=13 would mean 
that the navbar should be the same size as 13 columns below it. You 
don't tell it the number of children (your buttons) here. So for the 
moment just

	nav_bar.grid(column=0, row=0)

HTH,

	Christian

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.python


csiph-web