wxpython comboBox 自动完成提示功能
2015-09-08 00:00
639 查看
摘要
最近在使用python做一个桌面应用,使用到了ComboBox这个控件,但是对于这个控件的想法是能够实现类似于百度搜索框的功能,输入相应的搜索内容,能够显示下拉列表,下拉列表中显示相关的提示信息。google了半天有的功能只有自动补充完成,并不能够达到显示下拉列表的形式,一旦遇到多个联想词的时候就会有些问题。所以自己研究了下,在其原先的基础上稍微修改了下代码实现了这个功能。下面来看看代码吧正文
# -*- coding: utf-8 -*- import wx class PromptingComboBox(wx.ComboBox) : def __init__(self, parent, value, choices=[], style=0, **par): wx.ComboBox.__init__(self, parent, wx.ID_ANY, value, style=style|wx.CB_DROPDOWN, choices=choices, **par) self.choices = choices #分别绑定多个事件,文本内容变化,字符输入 self.Bind(wx.EVT_TEXT, self.EvtText) self.Bind(wx.EVT_CHAR, self.EvtChar) self.Bind(wx.EVT_COMBOBOX, self.EvtCombobox) self.ignoreEvtText = False def EvtCombobox(self, event): self.ignoreEvtText = True event.Skip() def EvtChar(self, event): #这里需要注意一点事,回车键如果不过滤掉的话,EvtText会类似于进入死循环,这里还不太清楚到底是为什么 if event.GetKeyCode() == 8: self.ignoreEvtText = True event.Skip() def EvtText(self, event): currentText = event.GetString() #这里先判断内容是否为空,如果为空的话,需要让下拉菜单隐藏起来 if currentText=='': self.SetItems(self.choices) self.Dismiss() if self.ignoreEvtText: self.ignoreEvtText = False return currentText = event.GetString() found = False choiceTemp = [] for choice in self.choices : if choice.startswith(currentText): self.ignoreEvtText = True found = True choiceTemp.append(choice) #进行文本匹配后,如果存在的话,就将combobox的内容置为匹配到的列表,再弹出下拉菜单 if found: print choiceTemp[0] self.SetItems(choiceTemp) self.Popup() self.SetValue(currentText) self.SetInsertionPoint(len(currentText)) self.ignoreEvtText = False if not found: self.Dismiss() self.SetInsertionPoint(len(currentText)) event.Skip() class TrialPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, wx.ID_ANY) choices = [u'中国', u'中文', u'中美', 'aunt', 'uncle', 'grandson', 'granddaughter'] cb = PromptingComboBox(self, "", choices, style=wx.CB_DROPDOWN) def derivedRelatives(self, relative): return [relative, 'step' + relative, relative + '-in-law'] if __name__ == '__main__': app = wx.App() frame = wx.Frame (None, -1, 'Demo PromptingComboBox Control', size=(400, 200)) TrialPanel(frame) frame.Show() app.MainLoop()
以上就是全部的代码了。但是每输入一次就会闪烁一下,这还是有点小问题。
相关文章推荐
- 自动化测试-python脚本语言
- 零基础学python-12.3 for循环
- 零基础学python-12.3 for循环
- 零基础学python-12.2 关键字pass,else,break,continue
- 零基础学python-12.2 关键字pass,else,break,continue
- Python调用打印机参考例子
- 零基础学python-12.1 while循环
- 零基础学python-12.1 while循环
- python图像化Tkinter
- python的真值
- Python 里 immutable和hashable的概念
- Python学习----面向对象编程
- Python 读取csv的某行
- Python 读取csv的某列
- Python 根据索引提取列表的一部分
- 《机器学习实战》笔记之五——Logistic回归
- Python打开文件时的几种模式比较
- Python iter
- 快速排序Python实现
- Windows下安装Python3的numpy、matplotlib、scipy包