如果我的问题重复,我事先表示歉意,但是我没有找到这个问题的答案。
我正在学习Tkinter,正在努力理解标签的字体类型,大小,宽度和字符串长度之间的关系。
具体来说,我的问题是:
我做了一些谷歌搜索,发现标签小部件的width参数不是实际宽度,而是与标签文本的字体和大小有关的东西:类似于我正确理解的内容:如果宽度为6标签将足够宽,以包含6个字符,在我的情况下是verdana大小20。但是我无法弄清楚应该给标签赋予的宽度和x坐标,因此它始于画布的x点。这是我编写的代码:
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox
from tkinter import Menu
# Define the application class where we will implement our widgets
class Application(Frame):
def __init__(self, master):
super(Application, self).__init__(master)
# CANVAS COLOUR DEFAULTS TO THE COLOUR OF THE WORKING WINDOW
canvas = Canvas(master, width=800, height = 640, bg="gray") # IF YOU DO .PACK() HERE IT WILL RETURN NONE AND THEN YOU WILL HAVE PROBLEMS BECAUSE .PACK() RETURNS A 'NONE' TYPE OBJECT
canvas.place(relx=0.5, rely=0.5, anchor=CENTER)
# The 'menu' of the application. The selection labels
main_application_label = Label(master, text="main_application", font=("Helvetica", 20))
main_application_window = canvas.create_window(103,20, window=main_application_label)
main_application = Tk()
main_application.title("main_application")
app = Application(main_application)
app_width = 800
app_height = 640
screen_width = main_application.winfo_screenwidth()
screen_height = main_application.winfo_screenheight()
x_coord = (screen_width/2) - (app_width/2)
y_coord = (screen_height/2) - (app_height/2)
main_application.geometry("%dx%d+%d+%d" % (app_width, app_height, x_coord, y_coord))
main_application.mainloop()
我设法以某种方式在0,0点附近获得标签(通过提供更多的值直到我弄对了),但是标签的实际宽度不是200像素(约为画布的1/3)。请帮助我理解我应该给width参数提供什么值,以便标签的背景是画布大小的1/3,并在可能的情况下说明字符字体和width参数之间的关系,以便无论任何小部件,无论文本大小如何,都可以这样做长度。感谢您阅读我的帖子!
编辑:我想做的是在画布上放置3个小部件(在这种情况下为标签,但没有关系)。我不明白'anchor'选项的作用,这使我感到困惑,因为我一直希望将小部件的中心始终放置在给定的坐标上,但是当我更改锚点时,小部件的中心位置正在更改那让我感到困惑。感谢@Bryan Oakley,现在一切都清楚了。谢谢。
答案 0 :(得分:1)
如果希望文本的左上角位于(0,0),则不必根据宽度调整坐标。创建画布对象时,可以使用anchor
选项:
main_application_window = canvas.create_window(0, 0, anchor="nw",
window=main_application_label)
如果您确实需要计算字符串的实际大小,则可以创建一个Font
对象,然后使用measure
方法查找给定字体中字符串的实际宽度。 / p>
from tkinter.font import Font
font = Font(family="Helvetica", size=20)
string_width = font.measure("main_application")
string_height = font.metrics("linespace")
这为您提供了呈现字符串的大小。如果您使用的是标签小部件,则还需要考虑该小部件所使用的填充和边框数量。
在画布上创建项目时,可以指定宽度和高度。例如,这使小部件宽200像素:
main_application_window = canvas.create_window(0, 0, anchor="nw", width=200,
window=main_application_label, width=400)