Значение Checkbutton по умолчанию

Надо чтобы галочки были пустыми

import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
from tkinter import *
from tkinter.ttk import *


class App(tk.Frame):

    def __init__(self, master, headings=tuple(), rows=tuple()):
        tk.Frame.__init__(self, master)
        notebook = ttk.Notebook(master)
        notebook.pack()



        # Вкладки
        frame1 = ttk.Frame(notebook)
        frame3 = ttk.Frame(notebook)
        frame2 = ttk.Frame(notebook)
        notebook.add(frame1, text='Данные абитуриента')
        notebook.add(frame2, text='Приоритетность факторов')
        notebook.add(frame3, text='Вузы')

        var = IntVar()
        var00 = BooleanVar()
        var00.set(False)
        var01 = BooleanVar()
        var01.set(False)
        var2 = ""
        # Данные абитуриента
        self.msg03 = Label(frame1, text="Фамилия и имя")
        self.msg03.grid(column=0, row=1)
        self.msg0 = Entry(frame1, textvariable=var2, width=20)
        self.msg0.grid(column=4, row=1)

        self.msg00 = Checkbutton(frame1, text="Общежитие", var=var00)
        self.msg00.grid(column=0, row=2, sticky=W)
        self.msg01 = Checkbutton(frame1, text="Олимпиада", variable=var01)
        self.msg01.grid(column=0, row=3, sticky=W)
        self.msg02 = Label(frame1, text="Престижность")
        self.msg02.grid(column=0, row=4, sticky=W)
        self.button1 = Radiobutton(frame1, text='1', variable=var, value=1)
        self.button1.grid(column=1, row=4, sticky=W)
        self.button2 = Radiobutton(frame1, text='2', variable=var, value=2)
        self.button2.grid(column=2, row=4, sticky=W)
        self.button3 = Radiobutton(frame1, text='3', variable=var, value=3)
        self.button3.grid(column=3, row=4, sticky=W)

        message_button = Button(text="Далее ->", style='TButton')
        message_button.place(relx=.9, rely=.9, anchor="c")
        # Приоритетность факторов
        self.msg1 = Label(frame2, text="Скоро здесь что-то будет :)")
        self.msg1.grid(column=0, row=0)
        # Вузы
        self.msg2 = Label(frame3, text="Таблица вузов")
        self.msg2.grid(column=0, row=0)

        table = ttk.Treeview(frame3, show="headings", selectmode="browse")
        table["columns"] = headings
        table["displaycolumns"] = headings

        for head in headings:
            table.heading(head, frame3, text=head, anchor=CENTER)
            table.column(head, frame3, anchor=CENTER, width=100)
        scrolltable_x = Scrollbar(frame3, orient='horizontal', command=table.xview)
        table.configure(xscrollcommand=scrolltable_x.set)

        for row in rows:
            table.insert('', END, values=tuple(row))

        scrolltable_y = Scrollbar(frame3, command=table.yview)
        table.configure(yscrollcommand=scrolltable_y.set)


root = Tk()
root.minsize(500, 400)
root.maxsize(500, 400)
root.title("Автоподбор ВУЗа")
app = App(root)
root.mainloop()

как сделать, чтобы галочки были пустыми после запуска программы? надо вот так


Ответы (1 шт):

Автор решения: insolor

Нужно сохранить эти переменные как поля объекта (либо как глобальные переменные), т.к. похоже, что сборщик мусора уничтожает объекты в этих переменных после выхода из функции.

# Все привязываемые переменные сохраняем как атрибуты объекта App
self.var = IntVar()
self.var.set(1)  # Для переключателя указываем значение по умолчанию
# Для BooleanVar значение по умолчанию False, поэтому не обязательно его устанавливать специально
self.var00 = BooleanVar()
self.var01 = BooleanVar()
self.var2 = StringVar()  # <-- переменная привязываемая через textvariable должна быть StringVar, а не просто строковым значением

# Данные абитуриента
self.msg03 = Label(frame1, text="Фамилия и имя")
self.msg03.grid(column=0, row=1)
self.msg0 = Entry(frame1, textvariable=self.var2, width=20)
self.msg0.grid(column=4, row=1)

self.msg00 = Checkbutton(frame1, text="Общежитие", variable=self.var00)
self.msg00.grid(column=0, row=2, sticky=W)
self.msg01 = Checkbutton(frame1, text="Олимпиада", variable=self.var01)
self.msg01.grid(column=0, row=3, sticky=W)

self.msg02 = Label(frame1, text="Престижность")
self.msg02.grid(column=0, row=4, sticky=W)
self.button1 = Radiobutton(frame1, text='1', variable=self.var, value=1)
self.button1.grid(column=1, row=4, sticky=W)
self.button2 = Radiobutton(frame1, text='2', variable=self.var, value=2)
self.button2.grid(column=2, row=4, sticky=W)
self.button3 = Radiobutton(frame1, text='3', variable=self.var, value=3)
self.button3.grid(column=3, row=4, sticky=W)

Скриншот до изменений ("затененный" или зачеркнутый чекбокс или переключатель обозначает неопределенное/промежуточное значение):

введите сюда описание изображения

После изменений:

введите сюда описание изображения

→ Ссылка