TkInter ListBox and use of .format
But .format will add the item then the column width.
format() does no such thing:
print "1234567890" * 2print "{:4}{:4}{:4}{:4}".format('aaaa', 'bbbb', 'cccc', 'dddd')--output:--12345678901234567890aaaabbbbccccdddd
The total width of the output is 16 = 4 x 4.
You should explicitly specify the alignment:
lb.insert(tk.END, "{:<5}-{:<2}".format(123, 9))
The docs say:
'<' Forces the field to be left-aligned within the available space (this is the default for most objects).
That 'most objects' language is what I think you may be running afoul of. Strings, numbers, etc. have a __format__()
method that is called when they are asked to display themselves when you call the format() method on them. Check this out:
print "{:4}".format("a")print "{:4}".format(9)--output:--a 9
Strings and numbers have different defaults for their justification. So I would not rely on the defaults--be explicit instead, and then you will know how the output will be justified.
Having said that, I have to use 17 for the min field width to actually get 10:
import Tkinter as tkroot = tk.Tk()root.geometry("1000x200")lb = tk.Listbox(root, width=150)lb.insert("1", "{:4}{:4}".format("a", "b") )lb.insert(tk.END, "1234567890" * 4)lb.insert(tk.END, "{:<17}{:<10}".format(100, 200) )lb.pack()root.mainloop()
With that code, I see 200 starting in column 11. Okay, that alignment problem has to do with tkinter using a default font that is not fixed width, i.e. all characters do not occupy the same amount of space. If you are trying to align columns, you need to use a fixed width font. Try something like this:
import Tkinter as tkimport tkFontroot = tk.Tk()my_font = tkFont.Font(family="Monaco", size=12) #Must come after the previous line.root.geometry("1000x200")lb = tk.Listbox(root, width=150, font=my_font)lb.insert("1", "{:4}{:4}".format("a", "b") )lb.insert(tk.END, "1234567890" * 4)lb.insert(tk.END, "{:>10}{:>10}".format(100, 200) )lb.pack()root.mainloop()
Windows
listbox = Listbox(master, width=60, font='consolas')
I am on linux, where font='mono'
works.