Tkinter - отношение между типом шрифта и шириной - PullRequest
0 голосов
/ 06 декабря 2018

Я заранее извиняюсь, если мой вопрос дублируется, однако я не нашел ответа на этот вопрос.

Я изучаю Tkinter и пытаюсь понять связь между типом шрифта метки,его размер, ширина и длина строки в нем.

В частности, в чем моя проблема:

  • Я создал виджет: холст 800x640, на котором я хочуРазместите другие виджеты.
  • На этом холсте я хочу разместить ярлык с текстом, который имеет следующие атрибуты: font: Helvetica, размер шрифта: 20, text = "main application".Я хочу разместить этот виджет надписи в самом верхнем левом углу виджета (то есть в точке 0,0 относительно холста).Я хочу, чтобы ширина метки составляла 200, а это означает, что фон занимает почти 1/3 размера холста (после того, как мне удастся это сделать, я планирую добавить еще 2 метки).Я думаю, высота метки определяется размером шрифта в этом случае 20. Я поместил метку в координату y = 20, и эта координата, кажется, в порядке.

Я немного погуглил и обнаружил, что параметр ширины виджета надписи - это не фактическая ширина, а что-то, связанное со шрифтом и размером текста надписи: что-то вроде, если я правильно понял: еслиширина на 6 больше, чем метка будет достаточно широкой, чтобы содержать 6 символов, в моем случае это размер verdana 20. Но я не смог выяснить, какую ширину и какую координату х я должен дать своей метке, чтобы она начиналась в точке ххолста.Вот код, который я написал:

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 Ответ

0 голосов
/ 06 декабря 2018

Если вы хотите, чтобы верхний левый угол текста был в (0,0), вам не нужно настраивать координаты на основе ширины.Вы можете использовать опцию anchor при создании объекта canvas:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...