wxPython控件学习之wx.ComboBox

 wx.Combobox由一个编辑框和列表组成。它可以显示为带有可编辑或只读文本框的静态列表,也可以显示为带下拉列表的文本区域,或者是不带文本框的下拉列表。一个wx.Combobox只允许单选。wx.Combobox的选择项从0开始编号。如果你需要定制wx.Combobox,可以参照wx.ComboCtrl,wx.OwnerDrawnComboBox,wx.ComboPopup和即将可用的wx.BitmapComBox等控件。

1. Style 样式

wx.CB_SIMPLE  创建一个带列表显示的combobox.只支持windows

wx.CB_DROPDOWN 创建一个带下拉列表的combobox

wx.CB_READONLY 同wx.CB_DROPDOWN,但只有被当做combobox选择项的字符串才能被选定,不在选择列表中的字符串无法将无法填入控件中的文本框。

wx.CB_SORT 列表项按字母序排序

wx.TE_PROCES_ENTER 此样式下控件会产生事件wx.EVT_COMMAND_TEXT_ENTER(否则按下Enter键要么被控件内部处理,要么被用于控件导航)。仅支持windows。

2. 事件

EVT_COMBOBOX(id,func) //当列表中的一个项被选择时,处理wx.EVT_COMMAND_COMBOBOX_SELECTED事件。注意到调用GetValue返回的是选择后的值。

EVT_TEXT(id,func) //当combobox文本改变时,处理wx.EVT_COMMAND_TEXT_UPDATED事件

EVT_TEXT_ENTER(id,func) //当在combobox中按下回车键时,处理wx.EVT_TEXT_ENTER事件。

 

 

# -*- coding: UTF-8 -*-

#-------------------------------------------------------------------------------
# Name:        模块1
# Purpose:
#
# Author:      ankier
#
# Created:     10/10/2012
# Copyright:   (c) ankier 2012
# Licence:     <your licence>
#-------------------------------------------------------------------------------

import wx

class ComboBoxFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Combo Box Example', size=(350, 300))
        panel = wx.Panel(self, -1)
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five','six', 'seven', 'eight']

        flexSizer = wx.FlexGridSizer(4,4,6,6)
        flexSizer.AddGrowableCol(1)
        flexSizer.AddGrowableCol(3)

        #定义普通样式的comboBox, 接受键盘输入,但不会改变Item
        commonLable = wx.StaticText(panel, -1, "普通样式")
        commonComboBox = wx.ComboBox(panel, -1, value = "zero", choices = sampleList, style = wx.CB_DROPDOWN)

        #定义简单样式的ComboBox,
        simpleLable = wx.StaticText(panel, -1, "简单样式:")
        simpleComboBox = wx.ComboBox(panel, -1, value =  "zero", choices = sampleList, style = wx.CB_SIMPLE)

        #定义只读样式的ComboBox,
        readonlyLable = wx.StaticText(panel, -1, "只读样式:")
        readonlyComboBox = wx.ComboBox(panel, -1, value =  "zero", choices = sampleList, style = wx.CB_READONLY)

        #定义二级联动下拉列表
        cityDict = {'安徽':["合肥", "淮南"], "江苏":["苏州","南京"]}

        #定义第一级菜单
        proviceLable = wx.StaticText(panel, -1, "省份:")
        proviceComboBox = wx.ComboBox(panel, -1, value =  cityDict.keys()[0], choices = cityDict.keys(), style = wx.CB_READONLY)
        #定义第二级菜单
        cityLable = wx.StaticText(panel, -1, "城市:")
        cityComboBox = wx.ComboBox(panel, -1, value =  cityDict[cityDict.keys()[0]][0], choices = cityDict[cityDict.keys()[0]], style = wx.CB_READONLY)

        flexSizer.AddMany([
                            (commonLable, 0, wx.SHAPED|wx.ALIGN_RIGHT), (commonComboBox, 1, wx.EXPAND), (simpleLable, 0, wx.SHAPED|wx.ALIGN_RIGHT),(simpleComboBox, 1, wx.EXPAND)
                            ,(readonlyLable, 0, wx.SHAPED|wx.ALIGN_RIGHT), (readonlyComboBox, 1, wx.EXPAND),(wx.Size(6,6), 0, wx.SHAPED|wx.ALIGN_RIGHT), (wx.Size(6,6), 1, wx.EXPAND)
                            ,(proviceLable, 0, wx.SHAPED|wx.ALIGN_RIGHT), (proviceComboBox, 1, wx.EXPAND),(wx.Size(6,6), 0, wx.SHAPED|wx.ALIGN_RIGHT), (wx.Size(6,6), 1, wx.EXPAND)
                            ,(cityLable, 0, wx.SHAPED|wx.ALIGN_RIGHT), (cityComboBox, 1, wx.EXPAND),(wx.Size(6,6), 0, wx.SHAPED|wx.ALIGN_RIGHT), (wx.Size(6,6), 1, wx.EXPAND)
                            ])

        panel.SetSizerAndFit(flexSizer)


        #定义 一级下拉列表切换时,刷新二级菜单项的响应事件
        self.__ProvinceComboBox = proviceComboBox
        self.__SecityDict = cityDict
        self.__CityComboBox= cityComboBox
        panel.Bind(wx.EVT_COMBOBOX,  self.__OnComboBoxSelected, proviceComboBox,)

    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 main():
    app = wx.PySimpleApp()
    ComboBoxFrame().Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

 

posted on 2012-10-10 21:14  |残阳|露  阅读(10504)  评论(0编辑  收藏  举报

导航