2017-02-22 34 views
0

我是Python和wxpython的新手。我試圖編寫一個代碼,其中我必須根據Combobox的用戶輸入創建複選框。我能夠做到。但是當我改變選擇時,舊的複選框仍然存在,我無法找到銷燬它們或刷新的方法。任何幫助將不勝感激。 這裏是我的代碼:在wxpython中刪除動態創建的複選框

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() 
+0

我懷疑你的代碼沒有到達你創建CheckBox的地方。嘗試觀看節目輸出並逐個刪除錯誤。然後我們可以繼續。另外,如果您發佈代碼的最小示例,則您有更好的回答機會。 –

+0

嗨,彼得,感謝您的代碼。但我不確定,你的意思是'沒有達到你創建CB的地方'。我能夠創建CB,但只能刪除或破壞舊版本。按照您的建議編輯了腳本。 – Surjith

+0

你能提供[mcve]嗎?您可能忘記刪除複選框後重新畫框 –

回答

1

你可以通過調用其Destroy方法破壞現有的複選框部件。也許是這樣的:

for cb in self.cb_list: 
    cb.Destroy() 
+0

您好羅賓,非常感謝您瀏覽我的代碼。我早些時候嘗試了您的建議,但無濟於事。問題是當我將光標移動到CheckBoxes上時,舊值變得可見。 – Surjith

+0

Surjith,如果我在你的AppSelect的頂部添加這些行,並且還將self.cb_list = []添加到構造函數的某處,它就可以工作。 –

+0

在一個不相干的筆記上,如果我可能會建議,請在將來查看sizers。這些小工具的絕對定位工作,但是當你遇到不同的DPI或字體大小設置,事情可能開始看起來很奇怪。例如在我的設置中,我只看到APPLICATIO,N被組合框覆蓋。 –