好的,所以基本问题是: 我有一组我想要显示的字符串,后面是垂直对齐的相关数据,字符串集的长度可变。使用此处描述的方法: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)
我宁愿不将列表框的字体更改为具有一致间距的字体,而我也不要将多个列表框彼此相邻设置。
答案 0 :(得分:1)
如果你想要做的是在一个列表框中对齐两列字符串,我建议如下:
使用tkFont 来衡量左侧字符串的长度(对于所使用的确切字体),如here所述
在左右字符串之间添加空格,以便右边的字符串始终从相同位置开始(实际上,此位置会因几个像素而变化,因为即使是“空格”字符也是如此几个像素宽)
最后你会得到这样的东西:
代码(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