Python. Заполнение полей Entry после нажатия CheckButton

Есть основное окно, куда по нажатию кнопки добавляется класс Frame. В нем размещены виджеты Entry и CheckButton. При нажатии на ChB происходит заполнение соответствующих полей Entry. Проблема в следующем: когда выбираю "Стандартный набор(5)", то заполняются 5 полей, но если я хочу одно из них убрать, то удаляются сразу все названия. Код прилагается:

from tkinter import Tk, Label, Button, filedialog, Checkbutton, \
    messagebox, Entry, END, Frame, RIDGE, IntVar, Toplevel

# Окно с информацией о количестве и названии шкафов
class InfoShk(Frame):

    def __init__(self, master, **kwargs):
        super().__init__(master, relief=RIDGE, bd=5, **kwargs)
        self.initUI()

    def initUI(self):
        self.var_1 = IntVar()
        self.cb_1 = Checkbutton(self, text="Уличный шкаф (1)", variable=self.var_1, command=self.check_shuns)
        self.cb_1.grid(column=0, row=0)

        self.var_stand = IntVar()
        self.cb_stand = Checkbutton(self, text="Стандартный набор (5)", variable=self.var_stand,
                                    command=self.check_sh)
        self.cb_stand.grid(column=1, row=0)
        self.vars = {}
        self.cbs = {}
        self.ents = {}
        self.names_shkafov = ["ШУВРУ", "ШУОС", "ШУАОС", "ШУОТ", "ШУНС", "ШУАСУ", "ШУАСУ2", "ШР"]
        self.standart_names = ['ШУВРУ-2.2-50А-1-1-0-0.УХЛ4-IP65',
                               'ШУОС-230В.УХЛ4-IP65',
                               'ШУАОС-230В.УХЛ4-IP65',
                               'ШУОТ-230В.УХЛ4-IP65',
                               'ШУНС-2.2-10А-3П01.УХЛ4-IP65',
                               'ШУАСУ-2.2-110А.УХЛ4-IP55',
                               'ШУАСУ-1-10А.УХЛ4-IP55',
                               'ШР-2.2-200А.УХЛ4-IP55']

        for name in self.names_shkafov:
            i = self.names_shkafov.index(name)
            Label(self, text=name).grid(column=0, row=i + 1, sticky="W")
            self.vars[name] = IntVar()
            self.cbs[name] = Checkbutton(self, text="", variable=self.vars[name], command=self.fill_name)
            self.cbs[name].grid(column=0, row=i + 1, columnspan=1, sticky="E")
            self.ents[name] = Entry(self, width=40)
            self.ents[name].grid(column=1, row=i + 1, sticky="W")


    # Заполнение названий шкафов набора Уличный шкаф
    def check_shuns(self):
        name = self.names_shkafov[4]
        if self.var_1.get():
            self.cbs[name].select()
            self.ents[name].insert(END, "ШУНС-2.2-25А-4П01.УХЛ1-IP65")
            self.ents[name].focus()
        else:
            self.cbs[name].deselect()
            self.ents[name].delete(0, END)

    # Заполнение названий шкафов набора Стандартный набор
    def check_sh(self):
        if self.var_stand.get():
            for i in range(5):
                name = self.names_shkafov[i]
                self.cbs[name].select()
                self.ents[name].insert(0, self.standart_names[i])
        else:
            for i in range(5):
                name = self.names_shkafov[i]
                self.cbs[name].deselect()
                self.ents[name].delete(0, END)

    # Заполнение названий шкафов при выборе
    def fill_name(self): # !!! Плохо работает - проверить!!!
        for name in self.names_shkafov:
            if self.vars[name].get() and not self.ents[name].get():
                self.cbs[name].select()
                self.ents[name].insert(0, self.standart_names[self.names_shkafov.index(name)])
            else:
                try:
                    self.cbs[name].deselect()
                    self.ents[name].delete(0, END)
                except IndexError:
                    pass


# Главное окно
class MainWindow(Tk):
    """Описание главного окна

    Описаны все элементы, расположенные на главном окне, а также функции,
    которые выполняются при нажатии кнопок."""
    def __init__(self):
        super().__init__()
        self.initUI()

    # Расположение кнопок, текста и т.д.
    def initUI(self):
        self.title("Размещение документации на сервере")
        self.geometry('800x500')
        # Информация о шкафах
        Button(self, text="Показать", cursor="hand2", command=self.show_info).place(x=350, y=10)

    # Открытие области заполнения названий шкафов
    def show_info(self):
        try:
            getattr(self, self.info_frame)
        except AttributeError:
            self.info_frame = InfoShk(self)
            self.info_frame.place(x=350, y=40)
        except TypeError:
            self.info_frame.place(x=350, y=40)
        self.q_frame = Button(self.info_frame, text="Спрятать", cursor="hand2", command=self.info_frame.place_forget)
        self.q_frame.grid(column=2, row=20)


def main():
    window = MainWindow()
    window.mainloop()


if __name__ == '__main__':
    main()`

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

Автор решения: Сергей Кох

Пробросил в функцию def fill_name(self) - name, убрал цикл, вроде заработало.

from tkinter import Tk, Label, Button, filedialog, Checkbutton, \
    messagebox, Entry, END, Frame, RIDGE, IntVar, Toplevel
from functools import partial

# Окно с информацией о количестве и названии шкафов
class InfoShk(Frame):

    def __init__(self, master, **kwargs):
        super().__init__(master, relief=RIDGE, bd=5, **kwargs)
        self.initUI()

    def initUI(self):
        self.var_1 = IntVar()
        self.cb_1 = Checkbutton(self, text="Уличный шкаф (1)", variable=self.var_1, command=self.check_shuns)
        self.cb_1.grid(column=0, row=0)

        self.var_stand = IntVar()
        self.cb_stand = Checkbutton(self, text="Стандартный набор (5)", variable=self.var_stand,
                                    command=self.check_sh)
        self.cb_stand.grid(column=1, row=0)
        self.vars = {}
        self.cbs = {}
        self.ents = {}
        self.names_shkafov = ["ШУВРУ", "ШУОС", "ШУАОС", "ШУОТ", "ШУНС", "ШУАСУ", "ШУАСУ2", "ШР"]
        self.standart_names = ['ШУВРУ-2.2-50А-1-1-0-0.УХЛ4-IP65',
                               'ШУОС-230В.УХЛ4-IP65',
                               'ШУАОС-230В.УХЛ4-IP65',
                               'ШУОТ-230В.УХЛ4-IP65',
                               'ШУНС-2.2-10А-3П01.УХЛ4-IP65',
                               'ШУАСУ-2.2-110А.УХЛ4-IP55',
                               'ШУАСУ-1-10А.УХЛ4-IP55',
                               'ШР-2.2-200А.УХЛ4-IP55']

        for name in self.names_shkafov:
            i = self.names_shkafov.index(name)
            Label(self, text=name).grid(column=0, row=i + 1, sticky="W")
            self.vars[name] = IntVar()
            self.cbs[name] = Checkbutton(self, text="", variable=self.vars[name], command=partial(self.fill_name, name))
            self.cbs[name].grid(column=0, row=i + 1, columnspan=1, sticky="E")
            self.ents[name] = Entry(self, width=40)
            self.ents[name].grid(column=1, row=i + 1, sticky="W")


    # Заполнение названий шкафов набора Уличный шкаф
    def check_shuns(self):
        name = self.names_shkafov[4]
        if self.var_1.get():
            self.cbs[name].select()
            self.ents[name].insert(END, "ШУНС-2.2-25А-4П01.УХЛ1-IP65")
            self.ents[name].focus()
        else:
            self.cbs[name].deselect()
            self.ents[name].delete(0, END)

    # Заполнение названий шкафов набора Стандартный набор
    def check_sh(self):
        if self.var_stand.get():
            for i in range(5):
                name = self.names_shkafov[i]
                self.cbs[name].select()
                self.ents[name].insert(0, self.standart_names[i])
        else:
            for i in range(5):
                name = self.names_shkafov[i]
                self.cbs[name].deselect()
                self.ents[name].delete(0, END)

    # Заполнение названий шкафов при выборе
    def fill_name(self, name): # !!! Плохо работает - проверить!!!
        # for name in self.names_shkafov:
        if self.vars[name].get() and not self.ents[name].get():
            self.cbs[name].select()
            self.ents[name].insert(0, self.standart_names[self.names_shkafov.index(name)])
        else:
            try:
                self.cbs[name].deselect()
                self.ents[name].delete(0, END)
            except IndexError:
                pass


# Главное окно
class MainWindow(Tk):
    """Описание главного окна

    Описаны все элементы, расположенные на главном окне, а также функции,
    которые выполняются при нажатии кнопок."""
    def __init__(self):
        super().__init__()
        self.initUI()

    # Расположение кнопок, текста и т.д.
    def initUI(self):
        self.title("Размещение документации на сервере")
        self.geometry('800x500')
        # Информация о шкафах
        Button(self, text="Показать", cursor="hand2", command=self.show_info).place(x=350, y=10)

    # Открытие области заполнения названий шкафов
    def show_info(self):
        try:
            getattr(self, self.info_frame)
        except AttributeError:
            self.info_frame = InfoShk(self)
            self.info_frame.place(x=350, y=40)
        except TypeError:
            self.info_frame.place(x=350, y=40)
        self.q_frame = Button(self.info_frame, text="Спрятать", cursor="hand2", command=self.info_frame.place_forget)
        self.q_frame.grid(column=2, row=20)


def main():
    window = MainWindow()
    window.mainloop()


if __name__ == '__main__':
    main()

Теперь эта функция работает для каждого Checkbutton индивидуально.

→ Ссылка