Как уничтожить комбо-боксы, если они доступны в python gui? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть функция, которая на основе счетчика генерирует выпадающие списки. Я хочу уничтожить любой комбинированный список, который уже доступен, когда меняется моя переменная count. Для этого я использовал winfo_exists ... но каждый раз выдает ошибку атрибута. Пожалуйста, помогите мне с этим.

Вот код этой функции:

def create(event):
        count = combo.current()
        print ("count")
        print(count)

        for i in range(1,count+2):

            if (create_combo[i].winfo_exists()):
                create_combo[i].destroy()


        for i in range (1,count+2):

            create = tk.StringVar()

            create_combo[i]= ttk.Combobox(new_window_2,width = 15,textvariable = create, values = sheets)
            #create_combo.set("Sheet " + str(i))
            create_combo[i].grid(column = i, row =4, padx=10,pady=10)

Ответы [ 3 ]

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

Из вашего поста:

for i in range(1,count+2):
    if (create_combo[i].winfo_exists()):
        create_combo[i].destroy()

И ошибка:

AttributeError: 'str' object has no attribute 'winfo_exists'

Я могу сделать вывод, что: create_combo должен быть список, полный строки (вместо Combobox widget).

Вы можете добавить print(create_combo) перед первым для l oop, чтобы проверить значение в create_combo. Это должен быть список, полный строки.


И похоже, что вашей проблемы здесь нет, вам следует проверить способ создания create_combo.


. Предположим, что create_combo = ['a', 'b', ' c ']. Итак, я создаю три комбинированных списка create_combo [0 ... 2]. Таким образом, название комбо-боксов (виджетов): a, b, c.

Нет, вы не могли бы.

Если вы действительно хотите получить список создаваемых вами комбо-боксов , вы должны использовать:

create_combo = []
for i in range(3):
    t = ttk.Combobox(xxxxx)
    t.grid(xxxxxx)
    create_combo.append(t) # append it to your create_combo

И затем вы можете использовать:

for i in create_combo:
    if i.winfo_exists(): # i should be a widget,not string
        xxxxxxx # your job
0 голосов
/ 16 апреля 2020

Если вы хотите sh уничтожить виджет Python, будь то флажок в вашем случае, используйте следующий код.

Намного проще удалять и показывать виджеты, используя метод .grid!

Ваш код:

create_combo[i].destroy()

Я предполагаю (как Я могу видеть далее файл кода), что вы использовали метод сетки. В этом случае я просто изменил бы код на:

create_combo[i].grid_forget()

Надеюсь, это поможет!

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

Для удаления виджетов, созданных в l oop, их можно удалить, используя метод, доступный по этой ссылке Python Tkinter: удаление виджетов, созданных с помощью a для l oop

Это сработало для меня ... Я не понимаю, почему winfo_exists не работал. В любом случае, спасибо !!

list_of_owner_widgets = []
 def create(event):
        count = combo.current()
        print(count)

        for widget in list_of_owner_widgets:
            widget.destroy()

        for i in range (1,count+2):

            create = tk.StringVar()
            create_combo[i]= ttk.Combobox(new_window_2,width = 15,textvariable = create, values = sheets)
            list_of_owner_widgets.append(create_combo[i])
            create_combo[i].grid(column = i, row =4, padx=10,pady=10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...