文章的名称是借用善用佳软的.Everything是windows的一个快速搜索工具. 基本上转移到Linux上来后,没有怎么用过. 一直在用Gnome-Do,感觉还可以. 这个程序只是用来练习wxPython用的,目前还只是一个很简单的版本. 当然,后端用的是mlocate, 这个在Linux查找原理与everything基本一样,不过命令行. 而我只是写了一个前端GUI而已.
以下是初步代码, 后续会一直完完善.
1 #/usr/bin/python 2 #-*-<coding=UTF-8>-*- 3 4 """ 5 本例为windows下everything程序的linux版本.后端基于locate实现. 6 """ 7 8 import wx 9 import os 10 import subprocess 11 12 class GuiMainFrame(wx.Frame): 13 14 def __init__(self): 15 wx.Frame.__init__(self,parent=None,id=-1,title="",pos=wx.DefaultPosition,size=wx.DefaultSize) 16 17 #添加面板. 18 panel = wx.Panel(self) 19 20 #创建菜单栏 21 menubar = wx.MenuBar() 22 23 #File menu 24 fileMenu = wx.Menu() 25 fileMenu.Append(-1,"&Open","") 26 menubar.Append(fileMenu,"&File") 27 28 #Edit menu 29 editMenu = wx.Menu() 30 editMenu.Append(-1,"&Copy","") 31 menubar.Append(editMenu,"&Edit") 32 33 #Help/About menu 34 helpMenu = wx.Menu() 35 helpMenu.Append(-1,"About","") 36 menubar.Append(helpMenu,"&Help") 37 38 #调用SetMenuBar,使其在框架中显示出来 39 self.SetMenuBar(menubar) 40 41 #在面板中添加查找输入框 42 #filterInput = wx.TextCtrl(panel,-1,"") 43 self.filter = wx.SearchCtrl(panel,style=wx.TE_PROCESS_ENTER) 44 self.filter.Bind(wx.EVT_TEXT_ENTER,self.DoSearch) 45 #self.filter.Bind(wx.EVT_TEXT,self.DoSearch) #这个会导致程序长时间无响应,所以还在找更有效率的方法. 46 47 #在面板中添加类型选择框 48 typeList=["all:*.*","document:*.doc,*.xls,*.ppt","audio:*.mp3","vedio:*.rmvb,*.mkv","application:*.exe"] 49 fileType = wx.ComboBox(panel,-1,"",choices=typeList) 50 51 #在面板中添加输出结果显示框 52 self.multiText = wx.TextCtrl(panel,-1,"",style=wx.TE_MULTILINE|wx.TE_PROCESS_ENTER) 53 self.multiText.SetMinSize((800,600)) 54 55 #添加状态栏,是否要加入到sizer中管理. 56 statusbar = self.CreateStatusBar() 57 58 #管理布局.创建两个sizer,主sizer管理filterSizer,结果显示框两个控件 59 #filterSizer管理查找输入框和类型选择框 60 mainSizer = wx.BoxSizer(wx.VERTICAL) 61 62 filterSizer = wx.GridSizer(rows=1,cols=2) 63 filterSizer.Add(self.filter,0,wx.EXPAND) 64 filterSizer.Add(fileType,0,wx.EXPAND) 65 66 #这句话导致文本框显示有空隙. 为什么不能这样用? menubar是否不需要添加进mainSizer 67 #mainSizer.Add(menubar) 68 mainSizer.Add(filterSizer,0,wx.EXPAND) 69 mainSizer.Add(self.multiText,2,wx.EXPAND|wx.ALL) 70 #frame中创建的statusbar,不需要添加到sizer中进行管理. 71 #mainSizer.Add(statusbar,0,wx.EXPAND) 72 73 #这个是关键之处,将sizer与frame关联起来. 74 panel.SetSizer(mainSizer) 75 mainSizer.Fit(self) 76 77 def DoSearch(self,event): 78 pattern = self.filter.GetValue() 79 print pattern 80 cmd = "/usr/bin/locate" 81 arg1 = "-i" 82 arg2 = "-d" 83 arg3 = "/var/lib/mlocate/mlocate.db" 84 arg4 = pattern 85 86 p1=subprocess.Popen([cmd,arg1,arg2,arg3,arg4],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 87 (stdoutdata,stderrdata) = p1.communicate() 88 #stdoutdata = "Just test" 89 self.multiText.SetValue(stdoutdata) 90 91 if __name__ == "__main__": 92 app = wx.PySimpleApp() 93 frame = GuiMainFrame() 94 frame.Show() 95 app.MainLoop()