2016-07-01 13 views
0

我是新來的python,並試圖學習一些基本的代碼。我正在研究一些項目,我有下面的演示代碼。動態更新combobox 2與選擇combobox1 wxpython

,我不能在這個代碼修改的東西是__init__高清更新()它們鏈接到一些其他的代碼以及部分堂妹。

問題是當我在組合框1上選擇值爲'2'時,我在組合框2中將值設置爲'B100,B200,B300',但是如果在選擇值後選擇組合框1上的值'1' '2',我的組合框2上沒有任何更新的列表。如果需要,複製並粘貼IDE代碼。

#!/usr/bin/python 
#20_combobox.py 

import wx 
import wx.lib.inspection 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
    wx.Frame.__init__(self, *args, **kwargs) 

     self.p1 = wx.Panel(self) 
     lst = ['1','2','3'] 
     self.st = wx.ComboBox(self.p1, -1, choices = self.lst1(), style=wx.TE_PROCESS_ENTER) 
     self.st2 = wx.ComboBox(self.p1, -1, choices = self.lst2(), style=wx.TE_PROCESS_ENTER) 

     self.st.Bind(wx.EVT_COMBOBOX, self.update) 
     self.st2.Bind(wx.EVT_COMBOBOX, self.update) 


    def lst1(self): 
     lst=['1','2','3'] 
     return lst 

    def lst2(self): 
     lst =['A100','A200','A300','B100','B200','B300','C100','C200','C300','D100','D200','D300'] 
     dummyvar=[] 
     dummyvar1=[] 

     if self.st.GetStringSelection() == '1': 
      self.st2.Clear() 
      for number in lst: 
       if number.startswith('A'): 
       # if number.startswith('A'): 
        self.st2.Append(number) 
        self.st.Hide() 

     elif self.st.GetStringSelection() == '2': 
      self.st2.Clear() 
      for number in lst: 
       if number.startswith('B'): 
        self.st2.Append(number) 



     return lst 


    def update(self, event): 
     self.lst1a=self.lst1() 
     self.lst2a=self.lst2() 


class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, '20_combobox.py') 
     frame.Show() 
     self.SetTopWindow(frame) 
     return 1 

if __name__ == "__main__": 
    app = MyApp(0) 
# wx.lib.inspection.InspectionTool().Show() 
    app.MainLoop() 
+0

Python是一個學習非常好的語言,因爲它是非常具體的,(幾乎)總是當它告訴你非常有幫助的是什麼不喜歡。因此,就你的情況而言,當你首先選擇'2',然後'1'(實際上順序無關緊要,例如選擇'2'兩次給出完全相同的錯誤),你會不喜歡Python? – nepix32

+0

所以任何人都可以告訴我,我想如何使combobox-2依賴combobox-1? – ryuk

回答

0

不要混淆對象屬性和方法。 self.list1 != self.list1(),事實上Python第二次調用self.update時試圖告訴你一個錯誤。看一個例子與關注更清晰的分離:

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.p1 = wx.Panel(self) 
     self.lst1 = ['1','2','3'] 
     self.lst2 = self.get_lst2() 

     self.st = wx.ComboBox(self.p1, -1, choices = self.lst1, style=wx.TE_PROCESS_ENTER) 
     self.st2 = wx.ComboBox(self.p1, -1, choices = self.lst2, style=wx.TE_PROCESS_ENTER, pos=(-1,100), size=(100,-1)) 

     self.st.Bind(wx.EVT_COMBOBOX, self.update) 

    def get_lst2(self, selectn=None): 
     lst =['A100','A200','A300','B100','B200','B300','C100','C200','C300','D100','D200','D300'] 

     ret = [] 
     if selectn == '1': 
      for entry in lst: 
       if entry.startswith('A'): 
        ret.append(entry) 
     elif selectn == '2': 
      for entry in lst: 
       if entry.startswith('B'): 
        ret.append(entry) 
     else: 
      ret = lst 
     return ret 

    def update(self, event): 
     selectn = self.st.GetStringSelection() 
     self.lst2 = self.get_lst2(selectn) 
     self.st2.Clear() 
     for number in self.lst2: 
      self.st2.Append(number) 
     if selectn == '1': 
      self.st.Hide() 
+0

謝謝。欣賞它。 – ryuk