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

标签 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. 使用 tkFont 测量左侧字符串的长度(针对所使用的确切字体),如 here 中所述。

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

最后你会得到这样的结果:

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 tkinter as Tk
from tkinter import font as tkFont

关于Python 填充字符串以对齐 Tkinter ListBox 小部件中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009042/

相关文章:

python - Django Rest框架权限冲突

python - 在 Python 中创建空白图像(允许逐像素操作)

python - 在 Tkinter 应用程序关闭时执行任务

c# - 如何检测 N 列表列表框末尾的滚动?

vb.net - Visual Basic 列表框

python - 使用 Python,我如何像处理文件一样在内存中读取/写入数据?

python - 如何遍历 numpy 数组并删除异常?

python - 在Python中解析时间戳

python - 编译 tkinter 游戏

WPF Listbox - 空列表显示消息