【问题标题】:tkinter tab width incorrecttkinter 制表符宽度不正确
【发布时间】:2022-11-22 23:29:41
【问题描述】:

当使用 create_text 方法在画布上创建文本时,选项卡的宽度不是它应有的宽度,如 font.measure 所示。

import tkinter as tk
from tkinter.font import Font

root = tk.Tk()

canvas = tk.Canvas(root, width=300, height=300)
canvas.pack()

font = Font(family='Arial', size=12)

s1 = "a\tb"
s2 = "a    c"
print("Width:", s1, font.measure(s1))  # Width: a        b 30
print("Width:", s2, font.measure(s2))  # Width: a    c 33

canvas.create_text(10, 10, text=s1, font=font, anchor="nw")
canvas.create_text(10, 50, text=s2, font=font, anchor="nw")

root.mainloop()

font.measure的结果提示带空格的行要长一点,但是显示的是:

显示制表符的宽度明显大于空格。使用不同的字体会导致标签大小不同,但测量结果仍然不准确。没有制表符的文本的测量宽度是正确的。

如何获得正确的制表符宽度?这是一个错误吗?

【问题讨论】:

  • 这真的取决于标签字符被处理。它可以转换为距离画布中的像素(我说或许), 但在控制台中打印时的字符数。

标签: python tkinter canvas fonts


【解决方案1】:

您突出显示的问题是由于 Canvas 文本对象没有 tabs 属性。

也许有人知道如何解决这个问题,但通常在显示表格时会使用一个 tk.Text 对象,它具有 fonttabs 属性。

所以最简单的解决方案是制作一个tk.Text对象T,定义字体和制表符, 将您的消息插入 T,然后将 T 插入 Canvas 窗口 W。

像这样的东西。

import tkinter as tk
from tkinter import font

app = tk.Tk()

fixed = 1 # test Arial & Courier New
FONT = font.Font(family = ["arial", "courier new"][fixed], size = 12)
wide = 4 * FONT.measure(0)
high = FONT.metrics("linespace")
dent = (wide, tk.LEFT)

canvas = tk.Canvas(app)
canvas.grid(sticky =tk.NSEW)

s1, s2 = "a	b
", "a   c"

T = tk.Text(
    canvas,
    background = "SystemButtonFace",
    relief = tk.FLAT,
    font = FONT,
    tabs = dent,
    width = 20,
    height = 3,
    highlightthickness = 0,
    borderwidth = 0)

W = canvas.create_window(wide, high, window = T, anchor = tk.NW)

T.insert("1.0", s1)
T.insert("insert", s2)

app.mainloop()

【讨论】:

  • 谢谢,我仍然不确定选项卡的宽度是多少。在这个例子中好像是30,和dent的第一个元素不一样。不过,能够更改制表符宽度还是不错的。
【解决方案2】:

这会有帮助吗?在第 12 行,我刚刚添加了

s2 = "a	c"

结果:

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多