2013-06-26 154 views
2

我使用这个命令:Tkinter的ListBox和使用.format

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

但.format将增加那么项目的列宽。例如if item[0] = "foo",第一列的宽度为33,意味着以下参数为三。

任何解决方法?

回答

4

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

格式()做没有这样的事:

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

--output:-- 
123456789
aaaabbbbccccdddd 

输出的总宽度为16 = 4×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() 

与该代码,我看到200开始在塔11好吧,这对准问题必须做与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() 
+0

道歉遗漏,当我打印它的对齐是好的。当被添加到列表框时,就像我之前提到的那样...感谢您的回复。 – user2522202

+0

是的,我只是试着用Listbox试一试。我很久以前就记得这个问题。 – 7stud

+0

@ user2522202,当我明确指定对齐时,它会起作用 - 在post中的示例。 – 7stud