TkInter ListBox and use of .format TkInter ListBox and use of .format tkinter tkinter

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.