Tkinter-字体类型和宽度之间的关系

时间:2018-12-06 15:22:35

标签: python tkinter

如果我的问题重复,我事先表示歉意,但是我没有找到这个问题的答案。

我正在学习Tkinter,正在努力理解标签的字体类型,大小,宽度和字符串长度之间的关系。

具体来说,我的问题是:

  • 我创建了一个小部件:800x640的画布,我想在其上放置其他 小部件。
  • 在此画布上,我想放置一个标签,其中包含以下内容: 属性:字体:Helvetica,字体大小:20,文本=“主应用程序”。我想要 将此标签小部件放置在该标签的最左上角 小部件(表示相对于画布的0,0点)。我要标签 宽度为200,表示背景几乎占据了画布的1/3 大小(在我设法执行此操作后,我还计划再添加2个标签)。我猜 在这种情况下,标签的高度取决于字体大小。20 将标签放置在坐标y = 20处,这个坐标似乎还可以。

我做了一些谷歌搜索,发现标签小部件的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,现在一切都清楚了。谢谢。

1 个答案:

答案 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)