Python:根据*实际*长度填充字符串

4
在Python中,根据字符数轻松地使用空格填充字符串。例如:
print "aaa".ljust(10) + "end"
print "www".ljust(10) + "end"

输出结果如下:
aaa       end
www       end

这段文字在任何字符大小相等的显示屏上看起来都非常好。但是当我在Tkinter程序中输出这两个字符串时,它们不会对齐,因为在任何Tkinter字体中,字符'a'和'w'的长度不同。

我该如何在Tkinter中对齐字符串?

我的代码:

from Tkinter import *

STANDARD_FONT = ("David",14)

TO = "TO"
SUBJECT = "SUBJECT"
DATE = "DATE"

content = [
    {TO:'Frye', SUBJECT:'Water Pipe Replacement Cost', DATE:'July 9'},
    {TO:'George', SUBJECT:'Fw: Cell phone reimbursement', DATE:'July 9'},
    {TO:'George, Tim', SUBJECT:'Travel', DATE:'July 10'},
    {TO:'Sandy, Jim', SUBJECT:'Fw: Welcome to WOW! - News', DATE:'July 10'},
    {TO:'Sandy, Jim', SUBJECT:'Re: Present from paulette', DATE:'July 10'},
    {TO:'George, Tim, Sandy, Jim', SUBJECT:'Voices Across Alaska: State Budget Priorities', DATE:'July 10'},
    {TO:'Frye', SUBJECT:'FW: Confirmation of the Novemberl 5th discussion', DATE:'July 10'},
    {TO:'Jim', SUBJECT:'Re: Happy Thanksgiving!', DATE:'July 11'}
]

def makeWindow () :
    global nameVar, phoneVar, select
    win = Tk()

    frame1 = Frame(win)
    frame1.pack()

    frame2 = Frame(win)       # Row of buttons
    frame2.pack()

    frame3 = Frame(win)       # select of names
    frame3.pack()
    scroll = Scrollbar(frame3, orient=VERTICAL)
    select = Listbox(frame3, yscrollcommand=scroll.set, height=17, width=100, font=STANDARD_FONT)
    scroll.config (command=select.yview)
    scroll.pack(side=RIGHT, fill=Y)
    select.pack(side=LEFT,  fill=BOTH, expand=1)
    return win

def format_mail_str(mail):
    to = "To: " + mail[TO]
    subject = mail[SUBJECT]
    date = mail[DATE]
    spacing = " " * 5

    return to.ljust(40) + spacing + subject.ljust(30) + spacing + date.ljust(15)


def setSelect () :
    select.delete(0,END)
    for mail in content:
        select.insert (END, format_mail_str(mail))

win = makeWindow()
setSelect ()
win.mainloop()

我希望所有行中的主题和日期都对齐。

5
在GUI或者网页浏览器中对齐文字通常指将文字放置在实际的列中,而不是仅依靠文字间的空白来对齐任何内容。 - Martijn Pieters
1
我所知道的大多数GUI系统,如果能够显示非固定宽度的字体,也都有一种方法可以告诉您字符串的实际长度(例如以像素为单位)。 - tom10
8
重新开放。不要使用空格来对齐文本,而是使用单独的文本标签。 - Martijn Pieters
你是如何在Tkinter中显示这些字符串的?是在多行Text字段中,还是在多个堆叠的Entry小部件中,或者是在Canvas上? - tobias_k
你说的“在滚动条中”是什么意思?你不能直接向滚动条添加文本,对吧?文本实际上包含在哪种小部件中?请展示一些代码! - tobias_k
显示剩余6条评论
2个回答

2
在Windows上,这段代码可以精确地对齐“end”:
import tkinter

root = tkinter.Tk()
displaytext1 = "aaa".ljust(10) + "end"
displaytext2 = "www".ljust(10) + "end"
tkinter.Label(root, text=displaytext1, font = "Courier").pack()
tkinter.Label(root, text=displaytext2, font = "Courier").pack()

root.mainloop()

检查 platform.system() 的值,并根据操作系统使用其他固定宽度字体。


不错的回答,但你应该强调“固定宽度字体”这个关键词。 - Eric Levieil

2
我不打算回答你所问的问题,但我会提出一个解决方案来解决你的问题。你想要的是几列。在tkinter中有一个小部件可以实现,它叫做树形视图。例如,请参见:http://www.tkdocs.com/tutorial/tree.html。我通常推荐使用
show='headings'

在Treeview构造函数中使用“option”选项,当您想要一个列表(而不是树形结构)时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接