Everything:速度最快的文件名搜索工具(Linux版本)

文章的名称是借用善用佳软的.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()

你可能感兴趣的:(linux)