Может ли кто-нибудь объяснить и помочь мне понять, как форматирование виджетов работает в Tkinter

Я просто возился с Tkinter, пытаясь создать базовую систему ввода имени. Мне трудно понять несколько вещей:

  • Почему независимо от того, где я пытаюсь разместить метку, она всегда остается в верхнем левом углу? Как мне получить его, чтобы я мог «свободно размещать» метку вокруг окна, а не просто оставаться в этом фиксированном положении?
  • У меня есть базовое понимание:

    root.grid_rowconfigure(0, weight=1)
    
    root.grid_columnconfigure(0, weight=1)
    

Однако что означают разные параметры и что на самом деле делает их изменение для программы.

  • Есть ли способ поместить текст в верхнюю центральную часть окна и убедиться, что он остается там, вроде бита заголовка в реальном окне. Я понимаю, что этого можно добиться с помощью отступов, но отступы не позволяют тексту оставаться в центре, если размер окна изменен.

Было бы здорово, если бы кто-нибудь объяснил мне это или хотя бы одно. Спасибо :)

    from tkinter import *

    fname = open("fname.txt", "a")


    root = Tk()
    root.title("First Name")
    root.geometry("500x300")

    main_frame = Frame(root, bg="#CECECE", width=490, height=245)

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)

    main_frame.grid(row=0, sticky="nsew")

    firstName = Label(main_frame, text="First Name")
    firstName.grid(column=2, row=2)

    root.mainloop()

person BenjieSS    schedule 06.05.2020    source источник
comment
Взгляните на Менеджер геометрии Tkinter Grid   -  person figbeam    schedule 06.05.2020


Ответы (2)


На вашем месте я бы не использовал .grid(). Вместо этого используйте .place(). Вы можете разместить виджет практически в любом месте экрана с помощью этого менеджера геометрии, и у него есть дополнительное преимущество, заключающееся в уменьшении масштаба при уменьшении экрана. Например:

button1 = Button()
button1.place(relx = 0.5, rely = 0.5, anchor = "center")

Это поместит кнопку в середину экрана, независимо от того, насколько сильно вы уменьшите экран.

Подробнее об менеджере геометрии места.

Надеюсь, это поможет!

Кроме того, пакет и сетка не могут работать вместе в одном и том же мастере, потому что программа всегда будет пытаться найти решение, которое работает для обоих менеджеров геометрии. Убедитесь, что если вы используете сетку, то придерживайтесь ее.

person 10 Rep    schedule 06.05.2020
comment
@BryanOakley Вот что я имел в виду, когда сказал то же окно. Я имел в виду того же мастера! - person 10 Rep; 06.05.2020
comment
Лично я считаю совет использовать place плохим советом для новичка. Это часто требует больше работы и приводит к менее отзывчивому пользовательскому интерфейсу. - person Bryan Oakley; 06.05.2020
comment
@BryanOakley Я тоже так думаю, но ОП не говорит, что он новичок, поэтому я решил опубликовать это. - person 10 Rep; 06.05.2020

Почему независимо от того, где я пытаюсь разместить метку, она всегда остается в верхнем левом углу?

Это потому, что пустые строки и пустые столбцы имеют нулевой размер.

Как мне получить его, чтобы я мог «свободно размещать» метку вокруг окна, а не просто оставаться в этом фиксированном положении?

Чтобы «свободно расположить» виджет, вы можете использовать place. Он превосходно позволяет размещать виджеты именно там, где вы хотите. Недостатком является то, что вы должны выполнять все вычисления и заботиться о том, что происходит при изменении размеров окон, изменении шрифтов и т. д. place хорош для абсолютного позиционирования (и даже относительного позиционирования), но обычно это приводит к тому, что вам приходится сделать больше работы и получить менее отзывчивый пользовательский интерфейс.

У меня есть базовое понимание root.grid_rowconfigure(0, weight=1) ... Однако, что означают разные параметры и что на самом деле делает их изменение для программы.

Первый параметр — это номер строки или столбца, который необходимо настроить. Параметр weight — это относительное число, которое сообщает tkinter, как выделить дополнительное пространство относительно других строк и столбцов. Если есть нераспределенное пространство, оно будет распределено между строками и столбцами с ненулевым весом.

Например, если один столбец имеет вес 2, а другой — 1, столбец с весом 2 получит в два раза больше дополнительного пространства. То же самое верно, если веса были 20 и 10 или 2000 и 1000.

Есть ли способ поместить текст в центр верхней части окна и убедиться, что он остается там?

Есть несколько способов, но ответ для того, чтобы сделать это только с одной меткой во всем окне, будет другим с меткой вверху и другими вещами ниже. С сеткой вы должны учитывать поведение всех строк и столбцов. В вашем вопросе нет заголовка, поэтому трудно дать конкретный совет.

person Bryan Oakley    schedule 06.05.2020
comment
Спасибо за это, действительно проясняет ситуацию :). Просто вопрос по моему первому вопросу. Как мне правильно отформатировать окно с помощью «сетки». Скажем, например, я хотел получить метку или запись в центре окна, но оставить остальную часть окна пустой. Как мне получить его, чтобы я мог разместить виджет в строке или столбце, который я хочу. Я понимаю, что пустые строки и столбцы имеют нулевой размер, теперь спасибо за прояснение этого вопроса, но есть ли способ просто разместить виджеты на экране там, где я хочу, с помощью сетки? Я относительно новичок в tkinter - забыл упомянуть в своем исходном посте. - person BenjieSS; 11.05.2020