Удаление динамически созданных флажков в wxpython

Я новичок в Python и wxpython. Я попытался написать код, в котором я должен создавать флажки на основе пользовательского ввода Combobox. Я могу это сделать. Но когда я меняю выбор, старые флажки все еще там, и я не могу найти способ их уничтожить или обновить. Любая помощь будет высоко ценится. Вот мой код:

import wx
class Form1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        wx.EVT_COMBOBOX(self, 30, self.EvtComboBox)
        self.lblhear = wx.StaticText(self,-1,"APPLICATION",wx.Point(30, 295))
        self.lblhear3 = wx.StaticText(self, -1, "TASKS TO BE DONE", wx.Point(30, 370))
        self.sampleList = ['ABC', 'PQR']
        self.edithear=wx.ComboBox(self, 30, "",
            wx.Point(110, 290), wx.Size(95, -1),
            self.sampleList, wx.CB_DROPDOWN)
        self.Bind(wx.EVT_COMBOBOX, self.AppSelect, self.edithear)
    def AppSelect(self, event):
        if event.GetString() == "ABC":
            self.Application = 'ABC'
            self.cb_list = []
            act_list = ['Task1','Task2']
        elif event.GetString() == "PQR":
            self.Application = 'PQR'
            self.cb_list = []
            act_list = ['Task3','Task4']
        pos_y = 380
        id_cb = 100
        for i in act_list:
            pos_y += 20
            id_cb += 20
            self.cb = wx.CheckBox(self, id_cb, label=i, pos=(50, pos_y))
            self.cb.SetValue(False)
            self.cb_list.append(self.cb)
    def EvtComboBox(self, event):
        if event.GetId() == 30:
            self.Application = self.event.GetString()
app = wx.PySimpleApp()
frame = wx.Frame(None, size=(1200,800))
Form1(frame)
frame.Show(1)
app.MainLoop()

person Surjith    schedule 22.02.2017    source источник
comment
Я подозреваю, что ваш код не доходит до места, где вы создаете CheckBoxes. Попробуйте посмотреть вывод программы и удалить ошибки одну за другой. Тогда мы можем продолжить. Кроме того, у вас больше шансов получить ответ, если вы опубликуете минимальный пример своего кода.   -  person Petr Blahos    schedule 22.02.2017
comment
Привет Петр, Спасибо за изучение кода. Но я не уверен, что вы имели в виду, говоря «не дойти до места, где вы создаете CB». Я могу создать CB, но не могу удалить или уничтожить старые. Я отредактировал сценарий, как вы предложили.   -  person Surjith    schedule 22.02.2017
comment
Можете ли вы предоставить минимально воспроизводимый пример? Вы можете забыть перерисовать рамку после удаления флажка   -  person Andrey Sobolev    schedule 22.02.2017
comment
Привет Андрей, Спасибо. Я добавил пример Minimal, Complete & Veribility.   -  person Surjith    schedule 22.02.2017


Ответы (1)


Вы можете уничтожить существующие виджеты флажков, вызвав их метод Destroy. Возможно что-то вроде этого:

for cb in self.cb_list:
    cb.Destroy()
person RobinDunn    schedule 22.02.2017
comment
Привет, Робин! Большое спасибо, что заглянули в мой код. Я пробовал ваше предложение ранее, но безрезультатно. Проблема в том, что когда я навожу курсор на CheckBoxes, старое значение становится видимым. - person Surjith; 23.02.2017
comment
Surjith, если я добавлю именно эти строчки вверху вашего AppSelect, а также self.cb_list=[] где-нибудь в конструкторе, то работает. - person Petr Blahos; 23.02.2017
comment
Кстати говоря, если я могу предложить, обратите внимание на сайзеры в будущем. Абсолютное позиционирование виджетов работает, но когда вы сталкиваетесь с разными настройками DPI или размера шрифта, все может выглядеть странно. Например, в моей настройке я вижу только APPLICATIO, N закрывается полем со списком. - person Petr Blahos; 23.02.2017
comment
@ Петр Блахос, большое спасибо. Если я поставлю так, как вы предложили, это сработает. Я добавлю сайзеры в свои новые коды, так как это имеет больше смысла. - person Surjith; 23.02.2017
comment
@RobinDunn Я резервирую свою благодарность за вашу помощь. Твоего ответа не было даже в моих диких снах. - person Surjith; 23.02.2017
comment
@PetrBlahos Могу ли я узнать, есть ли способ вернуться к Application ABC и получить назначенные ему задачи? Потому что, когда я пытаюсь это сделать, это дает мне следующую ошибку. поднять PyDeadObjectError(self.attrStr % self._name) wx._core.PyDeadObjectError: C++ часть объекта CheckBox была удалена, доступ к атрибутам больше не разрешен. - person Surjith; 23.02.2017