TkInter ListBox和.format的使用

时间:2013-06-26 01:09:59

标签: python string tkinter string.format

我正在使用此命令:

self.licenseBox.insert(END, "{:30}{:90}{:20}{:5}".format(item[0],
                                                    item[1], item[2], item[3]))

但.format会添加项目然后添加列宽。例如if item[0] = "foo",第一列为33宽,表示以下参数为3。

有什么解决方法吗?

2 个答案:

答案 0 :(得分:5)

  

但是.format会添加项目然后添加列宽。

format()没有这样的事情:

print "1234567890" * 2
print "{:4}{:4}{:4}{:4}".format('aaaa', 'bbbb', 'cccc', 'dddd')

--output:--
12345678901234567890
aaaabbbbccccdddd

输出的总宽度为16 = 4 x 4.

您应该明确指定对齐方式:

lb.insert(tk.END, "{:<5}-{:<2}".format(123, 9))

文档说:

'<'   Forces the field to be left-aligned within the available space 
      (this is the default for most objects).

我认为你可能会遇到的“大多数对象”语言。字符串,数字等具有__format__()方法,当您在它们上面调用format()方法时,它们被要求显示自己。看看这个:

print "{:4}".format("a")
print "{:4}".format(9)

--output:--
a   
   9

字符串和数字的理由有不同的默认值。所以我不会依赖默认值 - 而是显式,然后你会知道输出是如何被证明的。

话虽如此,我必须使用17作为最小字段宽度实际得到10:

import Tkinter as tk

root = 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()

使用该代码,我从第11列开始看到200.好的,该对齐问题与tkinter使用非固定宽度的默认字体有关,即所有字符都不占用相同的空间量。如果要尝试对齐列,则需要使用固定宽度的字体。尝试这样的事情:

import Tkinter as tk
import tkFont

root = 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()

答案 1 :(得分:1)

Windows

listbox = Listbox(master, width=60, font='consolas')

我在font='mono'工作的Linux上。