Виджеты не могут быть центрированы

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь создать здесь инструмент сигнализации, но, как новичок, у меня возникают некоторые трудности.Итак, один из них — выровнять пару моих виджетов по центру красной рамки (top_left_fr), но я не могу понять это. Любая помощь?

 import time
from tkinter import *
from time import strftime
    
def time():
    string = strftime('%H:%M:%S %p')
    lbl.config(text=string)
    lbl.after(1000, time)


window = Tk()
window.geometry("700x400")
window.resizable(False, False)
window.grid_columnconfigure(0, weight=1)

top_left_fr = Frame(window, bg="red", width=500, height=250)
top_left_fr.grid(row=0, column=0, sticky=W   E   N   S, columnspan=5)

left_bottom_fr = Frame(window, bg="blue", width=500, height=150, highlightthickness=1, highlightbackground="black")
left_bottom_fr.grid(row=0, column=0, sticky=W   E   S)

right_fr = Frame(window, bg="green", width=200, height=400, highlightthickness=1, highlightbackground="black")
right_fr.grid(row=0, column=1)

time_lbl = Label(top_left_fr, text="REAL TIME", font=('calibri', 20, 'bold'))
time_lbl.grid(row=0, column=0, pady=(10, 0))

add_but = Button(top_left_fr, text="Αdd")
add_but.grid(row=3, column=3)

lbl = Label(top_left_fr, font=('calibri', 20, 'bold'),
            background='black',
            foreground='white')

lbl.grid(row=1, column=2, pady=10)
time()
window.mainloop()
  

Комментарии:

1. Отступ в вашем коде нарушен. Не могли бы вы это исправить?

2. Я думаю, теперь все в порядке. Извините, кстати!

3. Все еще есть проблема с форматированием. Кроме того, вы сказали: «один из них — выровнять пару моих виджетов» — что означает «пара»? Какие виджеты конкретно вы хотите центрировать, и хотите ли вы, чтобы они были центрированы по горизонтали, вертикали или обоим?

4. Поэтому я хочу, чтобы метка time_lbl была центрирована по горизонтали в первой строке, метка lbl должна быть центрирована по горизонтали во второй строке, а кнопка add_but должна быть центрирована по горизонтали в третьей строке. Эти действия должны происходить в красной рамке top_left_fr

Ответ №1:

Решением, требующим наименьшего количества кода, было бы использовать pack вместо grid . По умолчанию pack виджет будет центрироваться по той стороне, на которой он был размещен.

Вам также нужно настроить красную рамку так, чтобы она не перекрывала зеленую рамку, удалив columnspan ее при добавлении этой рамки.

 top_left_fr.grid(row=0, column=0, sticky=W   E   N   S)
...
time_lbl.pack(side="top", fill="x")
lbl.pack(side="top", fill="x")
add_but.pack(side="top", fill="x")
  

Если вы хотите использовать grid , вам нужно убедиться, что столбец, содержащий виджеты, настроен на расширение, чтобы заполнить любое дополнительное пространство. По умолчанию grid виджеты будут центрироваться в выделенном пространстве. Как pack и в случае, вам нужно удалить columnspan при добавлении красной рамки.

 top_left_fr.grid(row=0, column=0, sticky=W   E   N   S)
top_left_fr.grid_columnconfigure(0, weight=1)
...
time_lbl.grid(row=0, column=0)
lbl.grid(row=1, column=0)
add_but.grid(row=2, column=0)