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 很陌生,并且得到了一个非常紧凑的调试代码,所以我不能首先动态更改它

4

2 回答 2

2

您可以根据文本的大小计算坐标,但您需要找出给定字体中文本的大小(以像素为单位)。这可以通过首先使用临时画布和 bbox 方法在 Tkinter 中完成。创建文本项并捕获 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 像素宽的框中。

于 2013-11-14T06:38:54.490 回答
1

您可以在 create_text 中传递“宽度”以避免溢出。

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)

您可以根据文本大小计算宽度或将其修复,然后如果长度超过它将被包裹并且不会有任何溢出。

于 2013-09-14T11:40:11.430 回答