通过选择 combobox1 wxpython 动态更新 combobox 2
dynamically update combobox 2 with selection of combobox1 wxpython
我是 python 的新手,正在尝试学习一些基本代码。我正在做一些项目,下面有演示代码。
我无法在此代码中更改的唯一内容是 __init__ 和 def update() 部分,因为它们也链接到其他一些代码。
问题是当我在 combobox-1 上 select 值为 '2' 时,我在 combobox-2 中得到的值为 'B100,B200,B300' 但如果我 select 值为 '1'在 combobox-1 上 selecting 值“2”后,我的 combobox-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()
不要混淆对象属性和方法。 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()
我是 python 的新手,正在尝试学习一些基本代码。我正在做一些项目,下面有演示代码。
我无法在此代码中更改的唯一内容是 __init__ 和 def update() 部分,因为它们也链接到其他一些代码。
问题是当我在 combobox-1 上 select 值为 '2' 时,我在 combobox-2 中得到的值为 'B100,B200,B300' 但如果我 select 值为 '1'在 combobox-1 上 selecting 值“2”后,我的 combobox-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()
不要混淆对象属性和方法。 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()