Сброс поля ввода даты и повторный выбор всех контрольных кнопок в tkinter после нажатия кнопки

#python #python-3.x #tkinter #checkbox

#python #python-3.x #tkinter #флажок

Вопрос:

Я создал несколько флажков, используя цикл for. Здесь для простоты их всего 5, но на самом деле их до 100. Теперь я хочу, чтобы при нажатии кнопки «отправить», наряду с выполнением функции, связанной с кнопкой, в поле ввода даты снова отображалась начальная дата, т. е. системная дата, а также все снятые флажки должны быть установлены снова, я имею в виду, что все должно стать таким, каким было до нажатия кнопки. Я попытался добавить все флажки в список и сопоставил функцию lambda x: x.select() в списке, но это не сработало. Итак, что теперь может быть лучшим решением для этого?

 from tkinter import *
from tkcalendar import DateEntry
import tkinter.messagebox as tkm

def submit_attendance():
    tkm.showinfo('Success', 'Attendance is taken.')

root = Tk()

frame = Frame(root)
frame.pack()

enterDate_Label = Label(frame, text = 'Select Date : ').pack()
    
Date_Entry = DateEntry(frame, date_pattern = 'dd/mm/yyyy').pack()

note_Label = Label(frame, text = 'Note: Uncheck the boxes for absentees').pack()

text = Text(frame, cursor = 'arrow')
text.pack()

students = [{'Reg': '2018-MC-01', 'Name': 'Hussain Ahmed'},
            {'Reg': '2018-MC-02', 'Name': 'Kamran Akmal'},
            {'Reg': '2018-MC-03', 'Name': 'Virat Kohli'},
            {'Reg': '2018-MC-04', 'Name': 'Abdul Ghani'},
            {'Reg': '2018-MC-05', 'Name': 'Hafiz Faizan Shahid'}]

varis = []
for std in students:
    reg = std['Reg']
    name = std['Name']
    var = StringVar()
    cb = Checkbutton(text, text = f"{reg}t{name}", variable = var, offvalue = f"{reg}t{name}")
    cb.select()
    text.window_create('end', window=cb)
    text.insert('end', 'n')
    varis.append(var)

Button(frame, text='Submit'.upper(), command = submit_attendance).pack()

mainloop()
  

Ответ №1:

Вам просто нужно вызвать set каждую из переменных в varis .

 def submit_attendance():
    ...
    for var in varis:
        var.set(1)
  

Что касается ввода даты, сначала вам нужно создать его и разложить в два этапа, что, как правило, в любом случае является наилучшей практикой:

 Date_Entry = DateEntry(frame, date_pattern = 'dd/mm/yyyy')
Date_Entry.pack()
  

Затем вы можете использовать метод set_date на Date_Entry , чтобы установить его на любую дату / время, которые вы хотите.

 Date_Entry.set_date(<whatever date you want>)
  

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

1. Но запись даты уже создана. Я просто хотел вернуть дату по умолчанию после того, как пользователь изменит дату и нажмет отправить. Вы имеете в виду, что решение состоит в том, чтобы снова создать и упаковать запись даты?

2. Нет, в моем ответе точно сказано, что делать: вызовите set_date метод для ввода даты ( Date_entry.set_date(...) )