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自带的查找文件舒服了好几好几倍。

浙公网安备 33010602011771号