【问题标题】:Tkinter -- how to horizontally center canvas text?Tkinter - 如何水平居中画布文本?
【发布时间】:2015-04-29 12:35:50
【问题描述】:

我正在处理作为配置窗口的 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 中的文本水平居中并垂直向下偏移约 200 像素。垂直偏移效果很好,但我不知道如何将文本水平居中。

我从尝试旧的 ((width / 2) - (str length / 2)) 开始,但后来意识到每个字母都不是 1px。而且 anchor = "center" 似乎只将一半的文本放在屏幕左侧。

我对 Python 很陌生(现在才几天),所以如果我遗漏了一些明显的东西,那就是原因。

编辑:如果不是很明显,这个文本会改变,所以我不能只对偏移量做出绝对决定,它必须随着文本而改变

【问题讨论】:

    标签: python tkinter tkinter-canvas


    【解决方案1】:

    您是否尝试过使用justify 参数? center 通常用于非文本对象。

    https://stackoverflow.com/a/15016161/3900967 可能会提供一些见解。

    【讨论】:

    • 我回家后试试。这是一个画布对象,而不是文本对象,所以我不确定它是否有 justify 参数。我选择了画布创建文本,因为它允许文本上的透明背景。
    • 我试过了,它只是在 nw 的锚上居中对齐,所以显示的只是屏幕左上角文本的右下象限。
    【解决方案2】:

    我在翻阅画布参考后发现了这一点。

    有一个名为 bbox 的画布方法,它返回一个包含 (x1, y1, x2, y2) 项目占用区域的元组。我得到了这些坐标,绘制了一个函数来找到它的 px 长度,将它除以 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)
    

    希望我搜索这个答案的时间能在以后对某人有所帮助。

    【讨论】:

    • 是的,您的答案会起作用,但更简单的方法是删除代码的anchor="nw" 属性,因为默认值为anchor="center"。使用后者,您只需传递您想要作为文本中心的坐标,而无需任何额外的计算。
    【解决方案3】:

    您可以使用 .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
    

    【讨论】:

      猜你喜欢
      • 2019-07-26
      • 2022-01-06
      • 2014-03-31
      • 1970-01-01
      • 2016-02-21
      • 2011-03-29
      • 2019-08-05
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多