动态调整大小Tkinter画布文本

时间:2013-09-14 10:37:44

标签: python tkinter

我正在谈论特定于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的新手并且得到了一个非常紧凑的调试代码,因此我无法在第一时间动态更改它

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以在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)

你可以根据文字大小来计算宽度或者修复它,然后如果它长于它将被包裹并且不会有任何溢出。