动态调整Tkinter画布文本大小

3

我将针对Python Tkinter进行说明。我在使用像素坐标时,将文本与按钮内联显示。现在,我的文本字符串是动态更改的,但如果文本字符串太长,则会溢出。

因此,我想知道是否有办法根据文本长度来更改坐标。

例如:

canvas.create_text(20, 30, anchor=W, font="Purisa",
    text="Most relationships seem so transitory")

如果我使用像这样的东西
canvas.create_text(20+len(text), 30, anchor=W, font="Purisa",
    text="Most relationships seem so transitory")

我对tkinter非常陌生,需要调试的代码非常紧凑,因此我无法在第一时间动态更改它。


如果你使用类似的东西,那么会发生什么?另外,动态大小指的是什么,字符大小吗? - martineau
“根据文本长度改变坐标”是指在创建时还是移动文本后? - martineau
@martineau,实际上我想要固定宽度,这样在文本更改或某种情况下不会溢出,或者使宽度根据字符串长度动态扩展。Devc给出的答案有点接近。 - user2778992
2个回答

2

根据文本的大小,您可以计算出其坐标,但需要以像素为单位找出给定字体中文本的大小。在Tkinter中,可以首先使用一个临时画布和bbox方法来完成这项工作。创建文本项并捕获其ID,然后使用bbox方法获取其大小。

scratch = Canvas()
id = scratch.create_text((0, 0), text=text, <options>)
size = scratch.bbox(id)
# size is a tuple: (x1, y1, x2, y2)
# since x1 and y1 will be 0, x2 and y2 give the string width and height

根据结果计算x和y坐标,然后在实际画布上绘制。可能还有更有效的方法,但我还不知道。

或者您只想根据文本大小更改x位置,换句话说,使其右对齐。在Tkinter中,最简单的方法是使用“anchor=E”选项,并为x坐标给出文本区域的右边缘:

canvas.create_text(ButtonX - 10, 30, anchor=E, ...)

你还可以使用“width=200”等选项来将文本包装在一个宽度为200像素的框中,除了锚定和其他任何选项。

1
你可以在 create_text 中传入“width”以避免溢出。
width=Maximum line length. Lines longer than this value are wrapped. Default is 0 (no wrapping).

所以它会像这样:

这样

canvas.create_text(20, 30, anchor=W, font="Purisa",
     text="Most relationships seem so transitory", width=0)

你可以根据文本大小计算宽度或者固定宽度,如果长度过长就会自动换行,不会出现溢出。

它解决了我的问题,但我仍在寻找如何使坐标动态化。 - user2778992

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接