用python实现省市县多级嵌套下拉列表
# -*- coding: UTF-8 -*- import wx class ComboBoxFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, 'Combo Box Example', size=(1300, 750)) panel = wx.Panel(self, -1) dict1 = { u'甘肃': [u'张掖', u'武威'], u'江苏': [u'南通', u'南京'] } dict2 = { u'张掖': [u'高台', u'肃南'], u'武威': [u'古浪', u'民勤'], u'南通': [u'海门县', u'海安县'], u'南京': [u'玄武区', u'朱雀区'] } proviceLable = wx.StaticText(panel, -1, "省份:", pos=(80, 60)) # 省份的静态说明文本框 proviceComboBox = wx.ComboBox(panel, -1, value=list(dict1.keys())[0], choices=list(dict1.keys()), style=wx.CB_READONLY, pos=(170, 55)) # 省份的下拉文本框 cityLable = wx.StaticText(panel, -1, "市区:", pos=(80, 120)) # 市区~ shiquComboBox = wx.ComboBox(panel, -1, value=dict1[list(dict1.keys())[0]][0], choices=dict1[list(dict1.keys())[0]], style=wx.CB_READONLY, pos=(170, 115)) # 市区~ value1 = dict1[list(dict1.keys())[0]][0] # 这个变量用于得到省份字典的第一个key值所对应的value值,主要用于对县级下拉列表的初始化 xianquLable = wx.StaticText(panel, -1, "县区:", pos=(80,180)) # 县区~ xianquComboBox = wx.ComboBox(panel, -1, value=dict2[value1][0], choices=dict2[value1], style=wx.CB_READONLY, pos=(170, 175)) # 县区~ # 定义一级列表被点击时响应二级列表和三级列表的刷新事件 self.__ProvinceComboBox = proviceComboBox self.__SecityDict = dict1 self.__CityComboBox = shiquComboBox panel.Bind(wx.EVT_COMBOBOX, self.__OnComboBoxSelected1, proviceComboBox, ) # 定义二级列表被点击时响应三级列表的刷新事件 self.__SecityDict1 = dict2 self._XianquCombobox = xianquComboBox panel.Bind(wx.EVT_COMBOBOX, self.__OnComboBoxSelected2, shiquComboBox, ) # 定义三级列表被点击时响应的事件 panel.Bind(wx.EVT_COMBOBOX, self.__OnComboBoxSelected3, xianquComboBox, ) def __OnComboBoxSelected(self, event): currentProvinceIndex = self.__ProvinceComboBox.GetSelection() if wx.NOT_FOUND == currentProvinceIndex: return value = self.__ProvinceComboBox.GetItems()[currentProvinceIndex] # 注意中文在List dict 等存储时候, utf-8 格式不一致问题 value = value.encode('utf-8') cityList = self.__SecityDict[value] self.__CityComboBox.SetItems(cityList) self.__CityComboBox.SetValue(cityList[0]) def __OnComboBoxSelected1(self, event): # 省份列表点击的响应函数 currentProvinceIndex1 = self.__ProvinceComboBox.GetSelection() print currentProvinceIndex1 if wx.NOT_FOUND == currentProvinceIndex1: return value1 = self.__ProvinceComboBox.GetItems()[currentProvinceIndex1] print self.__SecityDict[value1] cityList = self.__SecityDict[value1] self.__CityComboBox.SetItems(cityList) self.__CityComboBox.SetValue(cityList[0]) self.__OnComboBoxSelected2(self) def __OnComboBoxSelected2(self, event): # 市区列表点击的响应函数 currentShiquIndex = self.__CityComboBox.GetSelection() if wx.NOT_FOUND == currentShiquIndex: return value = self.__CityComboBox.GetItems()[currentShiquIndex] cityList = self.__SecityDict1[value] self._XianquCombobox.SetItems(cityList) self._XianquCombobox.SetValue(cityList[0]) def __OnComboBoxSelected3(self, event): # 响应县区下拉文本框点击的响应函数 currentXianquIndex = self._XianquCombobox.GetSelection() value = self._XianquCombobox.GetItems()[currentXianquIndex] self._cityname = value def main(): app = wx.PySimpleApp() ComboBoxFrame().Show() app.MainLoop() if __name__ == '__main__': main()