我正在处理一个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。垂直偏移工作正常,但我无法弄清楚如何水平居中文本。
我开始尝试年龄((宽度/ 2) - (str长度/ 2)),但后来意识到每个字母不是1px。而anchor =“center”似乎只将文本的一半放在屏幕的左侧。
我是Python的新手(现在只有几天),所以如果我遗漏了一些明显的东西,那就是原因。
编辑:如果不明显,这个文本会改变,所以我不能只对偏移作出绝对的决定,它必须随着文本的改变
答案 0 :(得分:4)
我在浏览画布参考后想出来了。
有一种名为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)
希望我在寻找这个答案的时间会对以后的人有所帮助。
答案 1 :(得分:0)
您是否尝试过使用justify
参数?
center
通常与非文本对象一起使用。
答案 2 :(得分:0)
您可以使用.create_text()方法的第一部分设置文本的位置。 见http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/create_text.html
要将此位置视为窗口中心,请使用self.windowWidth / 2作为x cordinate
默认情况下,文本锚定在给定位置的中心。 (.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