文章的名稱是借用善用佳軟的.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 os10 import subprocess11 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 menu24 fileMenu = wx.Menu()25 fileMenu.Append(-1,"&Open","")26 menubar.Append(fileMenu,"&File")27 28 #Edit menu29 editMenu = wx.Menu()30 editMenu.Append(-1,"&Copy","")31 menubar.Append(editMenu,"&Edit")32 33 #Help/About menu34 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是否不需要添加進mainSizer67 #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 pattern80 cmd = "/usr/bin/locate"81 arg1 = "-i"82 arg2 = "-d"83 arg3 = "/var/lib/mlocate/mlocate.db"84 arg4 = pattern85 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()