Может ли радиокнопка управлять несколькими переменными? - PullRequest
0 голосов
/ 10 апреля 2020

Я пишу программу-календарь с использованием модуля tkinter и, щелкая каждый день в сетке, выведите дату текущего дня (месяц / день / год). Тем не менее, я также хочу добавить еще один раздел внизу, который будет показывать, какой сегодня год. Например:

[screenshot of desired output

Например, 1 января 2020 года будет первым днем ​​года, 20 марта будет 80-м днем ​​года и др. c. Я хочу, чтобы мои переключатели могли контролировать обе эти переменные, дату в виде строки и день года в виде целого числа. Это возможно?

strDate = StringVar()
labelDate = Label(frameDay, textvariable=strDate, width=28, 
                  font=("Consolas", "15", "bold")).grid(row=1, column=1)

# Creating the calendar grid
while day <= self.returnMaxDay():
    currentDay = Date(self.month, day, self.year)
    radDay = Radiobutton(frameCalendar, text=str(day), 
                         font=("Consolas", "15", "bold"), indicatoron=0, width=4, height=1, 
                         variable=strDate, value=str(currentDay.returnDayName()) + ", " 
                                                 + str(currentDay.returnMonthName()) + " "
                                                 + str(day) + ", " + str(currentDay.year))
    radDay.grid(row=row, column=weekDay)
    day += 1
    weekDay += 1

    if weekDay == 7:
        row += 1
        weekDay = 0

labelDayOfYear = Label(window, text=str(self.dayOfYear()), font=("Consolas", "20")).pack()

1 Ответ

0 голосов
/ 10 апреля 2020

Это простой пример, который использует 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()

enter image description here


Кстати: Я использую datetime для генерации дат и try/except для обнаружения ошибки, когда дата неверна.

Я также использую strftime для форматирования даты - см. Больше на странице strftime.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...