【问题标题】:String alignment in TkinterTkinter 中的字符串对齐
【发布时间】:2017-02-20 04:13:53
【问题描述】:

我想要一个 Python 中的消息框,它显示连接的字符串文本。 我希望文本左对齐,但事实并非如此。 我试过ljust(){:<14} 等。但它仍然没有对齐。

好像是这样的:

代码片段如下,

for todo_item in resp.json()['SectorList']:
    sector_id +='Sector Id: {:<14}'.format(todo_item['SectorId']) + '\n'
    sector_name += 'Sector Name: {:<40}'.format(todo_item['SectorName']) + '\n'

在循环之后,我将这些文本添加到我的消息框中。

label_id = tkinter.Label(f, anchor = tkinter.W, text = sector_id)
label_name= tkinter.Label(f,anchor = tkinter.W, text = sector_name)

label_id.grid(row= 2, column = 1, sticky = tkinter.W)
label_name.grid(row= 2, column = 2, sticky = tkinter.W)

扇区 ID 部分很好,但扇区名称未左对齐。有什么想法吗?

【问题讨论】:

  • 这是非单位长度字体的问题。不是代码本身
  • 谢谢@Alan。您对如何解决非单位长度字体问题有任何想法,如何使其成为单位长度字体?
  • 我已经在下面发布了一个更完整的答案。

标签: python tkinter


【解决方案1】:

您的代码没有问题。

问题在于您使用的是非单位长度non-monospace 字体,其中字符占用的空间量不同。

这可以通过更改为monospace 字体来解决,例如consolas

import tkFont

my_font = tkFont.Font(family='Consolas', size=15, weight='bold')

# then plug in the font to your widget ...

所以在你的代码中它会是这样的

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font=('Consolas', 15))
label_name = tkinter.Label(f, anchor=tkinter.W, text=sector_name, font=('Consolas', 15))

【讨论】:

  • 非常好用!非常感谢。对于 python 3, import tkFont 不起作用。它需要导入 tkinter.font。但是没有它,如果我直接使用字体名称(不使用 tkFont.Font(Family='Consolas' bla bla))它就可以工作。再次感谢!
【解决方案2】:

依靠字体对齐是不好的做法;如前所述,它仅适用于等宽字体,但您真的想在整个应用程序中使用等宽字体进行对齐吗?我当然不会。如果您想稍后将Label 更改为Input 或其他内容怎么办?我们现在是否必须添加新的Labels 来对齐?

因此,在更改为等宽字体“有效”的同时,使用 Tk 为我们提供的工具是一种(更好的)方法。

例如,您可以将第一列中的Label()设置为固定宽度:

import tkinter

# Just some random strings of different sizes from my dictionary
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism',
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong']

root = tkinter.Tk()
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W)
for i in range(0, 10):
    label_id = tkinter.Label(root, width=30, anchor=tkinter.W, text='Sector %s' % i)
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i])

    label_id.grid(row=i+1, column=0, sticky=tkinter.W)
    label_name.grid(row=i+1, column=1, sticky=tkinter.W)

root.mainloop()

不过,还有更多方法可以做到这一点。例如,通过使用columnconfigure 设置宽度:

import tkinter

# Just some random strings of different sizes from my dictionary
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism',
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong']

root = tkinter.Tk()
root.columnconfigure(0, minsize=150)
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W)
for i in range(0, 10):
    label_id = tkinter.Label(root, anchor=tkinter.W, text='Sector %s' % i)
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i])

    label_id.grid(row=i+1, column=0, sticky=tkinter.W)
    label_name.grid(row=i+1, column=1, sticky=tkinter.W)

root.mainloop()

使用columnconfigure() 的优点是最小宽度与列的内容无关。因此,如果您稍后将 Label() 更改为其他内容,布局应该仍然有效,而且您可能更明显地想要为此列设置宽度。

【讨论】:

  • 我有一个使用 python2.66 的带有按钮网格的应用程序。当文本是字符时,宽度(如果我理解的话)以字符数给出,当使用图像时以像素数给出。字符不固定宽度时如何工作?
  • @Marichyasana Label 的宽度确实是文本单位;我不完全确定 Tk 在内部使用什么作为“文本单元”,但这并不重要一个“文本单元”是固定数量的像素,即使您使用比例字体。这个大小与字体大小成正比,可以认为是有用的(因为如果更改文本大小,间距会增加)...就像 CSS 中的em
  • 谢谢,这也很好用。并感谢您的解释和有用的信息。
【解决方案3】:

您需要一个固定宽度的字体才能使该方法起作用。

对于每个平台,TkInter 都提供标准字体,包括“TkFixedFont”。这应该对应于当前平台的体面(并且可用)固定宽度字体,因此以下是获得固定宽度字体的简单且可移植的方法:

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font='TkFixedFont')

【讨论】:

    猜你喜欢
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多