Python填充字符串以对齐Tkinter ListBox小部件中的列

时间:2017-03-24 20:58:31

标签: python tkinter listbox string-formatting

好的,所以基本问题是: 我有一组我想要显示的字符串,后面是垂直对齐的相关数据,字符串集的长度可变。使用此处描述的方法:Python spacing and aligning strings产生的结果低于理想值。查看我努力的成果here。我推测字符的宽度并不像列表框中的字符那样固定,就像使用打印命令一样,这可以解释为什么我的列表框列没有对齐。

这是我目前正在使用的代码,它的粗略与另一个问题上显示的解决方案相比,但它确实正常运行,因为它用足够的空间填充数据,使每个数据长度相同。

stringlist=['thistext','thattext','somemoretext','txt','text with spaces']

tagnmlen=0
for tags in stringlist:
    if len(tags) > tagnmlen:
        tagnmlen=len(tags)

for text in stringlist:
    strg = text.ljust(tagnmlen) + ',' + "another bit of data"
    listbox.insert(END,strg)

我宁愿不将列表框的字体更改为具有一致间距的字体,而我也不要将多个列表框彼此相邻设置。

1 个答案:

答案 0 :(得分:1)

如果你想要做的是在一个列表框中对齐两列字符串,我建议如下:

  1. 使用tkFont 来衡量左侧字符串的长度(对于所使用的确切字体),如here所述

  2. 在左右字符串之间添加空格,以便右边的字符串始终从相同位置开始(实际上,此位置会因几个像素而变化,因为即使是“空格”字符也是如此几个像素宽)

  3. 最后你会得到这样的东西:

    screenshot

    代码(Python 2.x)

    import Tkinter as Tk
    import tkFont
    
    #Create a listbox
    master = Tk.Tk()
    listbox = Tk.Listbox(master, width=40, height=20)
    listbox.pack()
    
    # Dummy strings to align
    stringsLeft = ["short", "medium", "extra-------long", "short", "medium", "short"]
    stringsRight = ["one", "two", "three", "four", "five", "six"]
    
    # Get the listbox font
    listFont = tkFont.Font(font=listbox.cget("font"))
    
    # Define spacing between left and right strings in terms of single "space" length
    spaceLength = listFont.measure(" ")
    spacing = 12 * spaceLength
    
    # find longest string in the left strings
    leftLengths = [listFont.measure(s) for s in stringsLeft]
    longestLength = max(leftLengths)
    
    # combine left and righ strings with the right number of spaces in between
    for i in range(len(stringsLeft)):
        neededSpacing = longestLength + spacing - leftLengths[i]
        spacesToAdd = int(round(neededSpacing/spaceLength))
        listbox.insert(Tk.END, stringsLeft[i] + spacesToAdd * " " + stringsRight[i])
    
    Tk.mainloop()
    

    对于Python 3.x,将import语句替换为:

    import tkinter as Tk
    from tkinter import font as tkFont