Tkinter - 如何水平居中画布文本?

5

我正在为一个UI类中的函数工作,它是一个配置窗口,显示程序的标志,并在底部更新文本,告诉您正在加载什么等等。目前为止,我有:

    self.window = "config"
    self.windowWidth = 340
    self.windowHeight = 270
    infoText = "Configuring Kh..."
    self.root = tk.Tk()
    self.root.geometry("%dx%d+400+400" % (self.windowWidth, self.windowHeight))
    self.root.title("Kh Control v1.1 starting...")
    logo = tk.PhotoImage(file="KhLogo.gif")
    mainPanel = tk.Canvas(self.root, width=self.windowWidth, height=self.windowHeight)
    mainPanel.image = logo
    mainPanel.pack()
    mainPanel.create_image(0, 0, image=logo, anchor="nw")
    mainPanel.create_text(0,200, text=infoText, anchor="nw", fill="yellow")
    return

我希望infoText中的文本水平居中并垂直向下偏移约200px。垂直偏移量没问题,但我无法弄清如何使文本水平居中。
一开始我试着用老旧的 ((width / 2) - (str length / 2)) 方法,但后来意识到每个字母的宽度不止1像素。 anchor = "center"似乎只能将一半的文本移到屏幕左侧。
由于我才刚接触Python(才几天),如果我忽略了一些显而易见的东西,请谅解。
注:如未明确指出,这段文本将发生变化,因此我不能仅仅对偏移量做出绝对决策,它必须随着文本的变化而变化。
4个回答

10

在查阅画布参考资料后,我找到了解决方法。

画布有一个名为bbox的方法,返回一个元组,其中包含项目占用区域的(x1, y1, x2, y2)坐标。我获取这些坐标,编写了一个函数来查找其像素长度,将其除以2并从窗口宽度中减去。然后我使用canvas.move使用函数返回的数字来更改x偏移量。

    def findXCenter(self, canvas, item):
      coords = canvas.bbox(item)
      xOffset = (self.windowWidth / 2) - ((coords[2] - coords[0]) / 2)
      return xOffset

主要部分在这里:

    textID = mainPanel.create_text(0,0, text=infoText, anchor="nw", fill="yellow")
    xOffset = self.findXCenter(mainPanel, textID)
    mainPanel.move(textID, xOffset, 0)

希望我花费数小时查找答案的经历能够帮助日后有需要的人。


1
是的,你的答案可以工作,但更简单的方法是删除你的代码中的 anchor="nw" 属性,因为默认值是 anchor="center"。使用后者,你只需要传递你想要作为文本中心的坐标,而无需进行任何额外的计算。 - josch

2

我回家后会尝试。这是一个画布对象,不是文本对象,所以我不确定它是否具有对齐参数。我选择了Canvas create text,因为它可以让文本拥有透明背景。 - linus72982
1
我尝试了一下,它只是在锚点上进行居中对齐,因此显示的只是文本的右下象限,位于屏幕的左上角。 - linus72982

0

您可以使用.create_text()方法的第一部分来设置文本的位置。 请参见http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/create_text.html

为了使该位置水平居中于窗口,请使用self.windowWidth / 2作为x坐标

默认情况下,文本以给定位置为中心进行定位。 (.create_text将默认为anchor="CENTER")

您还需要删除anchor="nw",因为这会使您的文本显示在给定位置的下方和右侧

因此,您的更新代码应该是这样的。

self.window = "config"
self.windowWidth = 340
self.windowHeight = 270
infoText = "Configuring Kh..."
self.root = tk.Tk()
self.root.geometry("%dx%d+400+400" % (self.windowWidth, self.windowHeight))
self.root.title("Kh Control v1.1 starting...")
logo = tk.PhotoImage(file="KhLogo.gif")
mainPanel = tk.Canvas(self.root, width=self.windowWidth, height=self.windowHeight)
mainPanel.image = logo
mainPanel.pack()
mainPanel.create_image(0, 0, image=logo, anchor="nw")
mainPanel.create_text(self.windowWidth/2,200, text=infoText, fill="yellow")
return

0

您可以使用anchor="center"方法来对齐在画布内使用canvas.create_text方法创建的文本。

尝试以下示例代码:

from tkinter import *

root = Tk()

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

text = canvas.create_text(200, 150, text="Hello World!", anchor="center")

root.mainloop()

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