#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)