Это простой пример, который использует command=
в Radiobutton
для запуска функции, которая изменяет текст на три Labels
.
Обычно command=
ожидают имя функции без ()
и аргументов, поэтому я использую lambda
для предоставления функции с аргументами.
command=lambda d=current_day:on_click(d))
Я также использую d=current_day
для создания новой переменной d
для каждой функции. Без d=current_day
все функции будут использовать ссылку на одну и ту же переменную current_day
, а все функции будут использовать одно и то же (последнее) значение в current_day
.
import tkinter as tk
import datetime
# --- functions ---
def on_click(value):
print(value)
label_date['text'] = value.strftime('%a, %b %d, %Y')
label_day['text'] = value.strftime('Day: %d')
label_weekday['text'] = value.strftime('Weekday: %a')
# --- main ---
root = tk.Tk()
radiobutton_var = tk.StringVar()
year = 2020
month = 4
row = 0
for day in range(1, 32):
try:
current_day = datetime.datetime(year, month, day)
date_str = current_day.strftime('%a, %m %d, %Y')
weekday = current_day.weekday()
radiobutton_day = tk.Radiobutton(root,
text=str(day),
indicatoron=0,
variable=radiobutton_var,
value=date_str,
#value=day,
command=lambda x=current_day:on_click(x))
radiobutton_day.grid(row=row, column=weekday, sticky='we')
if weekday == 6:
row += 1
radiobutton_day['bg'] = '#faa'
except ValueError as ex:
print(ex)
break
label_date = tk.Label(root, text='?')
label_date.grid(row=10, columnspan=10)
label_day = tk.Label(root, text='Day: ?')
label_day.grid(row=11, columnspan=10)
label_weekday = tk.Label(root, text='Weekday: ?')
label_weekday.grid(row=12, columnspan=10)
root.mainloop()
Кстати: Я использую datetime
для генерации дат и try/except
для обнаружения ошибки, когда дата неверна.
Я также использую strftime
для форматирования даты - см. Больше на странице strftime.org