wxpython学习记录(一):一个简单的文件路径查找程序

windows自带的文件资源管理器搜索太慢。想起用os module可以很容易地找到文件路径,便觉得自己可以写一个简单的文件路径查询程序。而因为要实现GUI,开始学习wxpython.

初学,理解不够,技术也很粗糙。代码如下:

# -*- encoding:utf-8 -*-

import wx,time,os


class MyApp(wx.App):

    def OnInit(self):
        frame = MyFrame(parent=None, id=-1, title='File Path Searcher')
        frame.Show(True)
        return True


class MyFrame(wx.Frame):

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(700, 500),
                          style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)
        #size也是wx.Frame及子类的共有属性,表示控件面积 weight*height
        self.Center()
        #顶层窗口居屏幕正中

        #写panel(面板)
        self.panel = wx.Panel(self, -1)

        font = wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.LIGHT)
        #设置字体

        self.static_text1=wx.StaticText(self.panel,-1,
                                       u'请输入要查询的目标:文件的完整名称(包含扩展名)或名称的一部分(需连续)。'
                                       ,style=wx.TE_CENTER)
        #文本控件参数的style指 控件中每行文本居中
        self.static_text1.SetFont(font)
        self.static_text11 = wx.StaticText(self.panel, -1,
                                         u'也可以输入它们的列表。用空格隔开每个名称,即:name1 name2 ...'
                                         , style=wx.TE_CENTER)
        self.static_text11.SetFont(font)
        self.edit_text1 = wx.TextCtrl(self.panel,-1,size=(400,25))
        self.edit_text1.SetFont(font)

        self.static_text2 = wx.StaticText(self.panel, -1,
                                         u'由于个人本地磁盘有差异,请输入该文件可能位于的磁盘或磁盘列表。'
                                         , style=wx.TE_CENTER)
        self.static_text2.SetFont(font)
        self.static_text22 = wx.StaticText(self.panel, -1,
                                          u'比如只可能在C盘,只需输入一个大写字母C。列表形式同上。'
                                          , style=wx.TE_CENTER)
        self.static_text22.SetFont(font)
        self.edit_text2=wx.TextCtrl(self.panel,-1,size=(400,25))

        self.confirm_button = wx.Button(self.panel, -1, label=u'开始搜索',size=(100,40))

        self.static_text3 = wx.StaticText(self.panel, -1,
                                           u'单击开始搜索后稍等。结果(文件路径)会显示在下方文本框,每个查询目标的结果间会空一行。'
                                           , style=wx.TE_CENTER)
        self.static_text3.SetFont(font)
        self.res_text=wx.TextCtrl(self.panel,-1,size=(600,100),style=wx.TE_MULTILINE)
        v_box_sizer = wx.BoxSizer(wx.VERTICAL)
        #proportion=0表示竖向只占一行

        v_box_sizer.Add((-1, 10))

        v_box_sizer.Add(self.static_text1, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        #box_sizer.add的参数flag中wx.TE_CENTER表示控件在这一行的中心
        v_box_sizer.Add(self.static_text11, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        v_box_sizer.Add(self.edit_text1, proportion=0, flag=wx.TE_CENTER | wx.ALL,border=5)
        #传入wx.ALL,则在box容器中的该控件上下左右留出border=5的间隔(内边距)

        v_box_sizer.Add((-1, 10))
        #以空白的10个像素点作竖向的间隔

        h_box_sizer = wx.BoxSizer(wx.HORIZONTAL)
        # 加上运动进度条。由于过程进度难以准确,故象征性表示在进行中
        self.process_text = wx.StaticText(self.panel, -1, u"进度条在查询完成时瞬满。该程序一般不会卡住,请不用管提示未响应", style=wx.TE_CENTER)
        self.gauge = wx.Gauge(parent=self.panel, id=-1,range=10, size=(250, 25), style=wx.GA_HORIZONTAL)
        #进度条
        h_box_sizer.Add(self.process_text,proportion=0,flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
        h_box_sizer.Add(self.gauge,proportion=0,flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
        #两控件都要在横向box的中央,故挨在一起在中央
        v_box_sizer.Add(self.static_text2, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        v_box_sizer.Add(self.static_text22, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        v_box_sizer.Add(self.edit_text2, proportion=0, flag=wx.TE_CENTER | wx.ALL,border=5)

        v_box_sizer.Add(self.confirm_button, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        self.Bind(wx.EVT_BUTTON, self.onConfirm,self.confirm_button)
        # self.Bind(模式,method,触发机关),用于触发事件

        v_box_sizer.Add(self.static_text3, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)
        v_box_sizer.Add(self.res_text, proportion=0, flag=wx.TE_CENTER | wx.ALL, border=5)

        v_box_sizer.Add(h_box_sizer,proportion=0,flag=wx.TE_CENTER | wx.ALL, border=5)

        self.panel.SetSizer(v_box_sizer)
        #给panel设定上sizer,这样后sizer才生效

    def onConfirm(self,event):
        time.sleep(0.5)
        self.gauge.SetValue(2)
        #设置进度条的当前值
        self.res_text.Clear()
        #清空上次输出的内容
        
      '''下面是os module工作,查找文件路径''' filenames_list
=self.edit_text1.GetValue().split(' ') biggest_paths_list = [biggest_path + ':\\' for biggest_path in self.edit_text2.GetValue().split(' ')] paths_group = [] for filename_part in filenames_list: paths = [walk[0] + '\\' + filename for biggest_path in biggest_paths_list for walk in os.walk(biggest_path) for filename in walk[2] if filename.find(filename_part) != -1] # s.find('str')=-1指没找到 result_paths = [path.replace('\\', '/') for path in paths] #换'\\'为'/',以便直接复制路径来用 paths_group.append(result_paths) self.gauge.SetValue(7) for path_group in paths_group: self.res_text.AppendText('\n'.join(path_group)+'\n\n') self.gauge.SetValue(10) def main(): app = MyApp() app.MainLoop() if __name__ == '__main__': main()

效果:

虽然效率比不了市面上那些,但也比用windows自带的查找文件舒服了好几好几倍。

posted @ 2020-08-09 12:02  AlexisCAM  阅读(461)  评论(0)    收藏  举报