首页 文章

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

提问于
浏览
0

如果我的问题是重复的话,我会提前道歉但是我没有找到这个问题的答案 .

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

具体来说,我的问题是:

  • 我创建了一个小部件:一个800x640画布,我想放置其他小部件 .

  • 在这个画布上我想放置一个标签,其中包含一些具有以下属性的文本:font:Helvetica,font size:20,text = "main application" . 我想将这个标签小部件放在小部件的最左上角(意味着相对于画布的点0,0) . 我希望标签的宽度为200,这意味着它的尺寸为's background to take almost 1/3 of the canvas'(在我设法完成之后,我计划再添加2个标签) . 我猜标签的高度是由字体大小决定的 . 在这种情况下,我将标签放在y = 20的坐标上,这个坐标似乎没问题 .

我做了一些googleing并发现标签小部件的宽度参数不是实际的宽度,而是与标签文本的字体和大小有关的东西:如果我理解正确的话:如果宽度是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) . 请帮助我理解我应该给出的宽度参数的值,以便我的标签的背景是画布大小的1/3,如果可能的话,解释字符字体和宽度参数之间的关系,这样我就可以为任何小部件做到这一点,无论它们的文本是什么长度 . 感谢您阅读我的帖子!

编辑:我想要做的是在画布上放置3个小部件(在这种情况下标签,但无关紧要) . 我不明白'锚'选项的作用,这让我感到困惑,因为我希望窗口小部件的中心始终放在给定的坐标上但是当我改变锚时,窗口小部件中心的位置正在改变那令我困惑 . 感谢@Bryan Oakley,这一切都很清楚 . 谢谢 .

1 回答

  • 1

    如果希望文本的左上角为(0,0),则不必根据宽度调整坐标 . 您可以在创建画布对象时使用 anchor 选项:

    main_application_window = canvas.create_window(0, 0, anchor="nw",
                                                   window=main_application_label)
    

    如果确实需要计算字符串的实际大小,可以创建 Font 对象,然后使用 measure 方法查找给定字体中字符串的实际宽度 .

    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)
    

相关问题