import wx import wx.xrc import os import threading import thread import logging import re import time import csv import subprocess import codecs import sys # 统一使用utf-8格式 default_encoding = 'utf-8' if sys.getdefaultencoding() != default_encoding: reload(sys) sys.setdefaultencoding(default_encoding) CMD_ADBINSTALL = "adb install " CMD_MONKEY = "adb shell monkey -p " CMD_UNINSTALL = "adb uninstall " ADB_GET_SERIALNO = "adb get-serialno" # 设备ID VERSION = 1.9 #版本号 LOG_FILE_NAME = "TOP_APK.logs" #logcat日志文件 dict={} #字典 data =[] #数组 tup=() #元组 dictnew={} #修改后的名称对应 class topapkThread(threading.Thread): def __init__(self, filepath, listname, len, window,dictnew): # 文件路径, 名称 ,index,self threading.Thread.__init__(self) self.listname = listname self.len = len self.window = window self.filepath = filepath self.timeToQuit = threading.Event() self.timeToQuit.clear() self.index = 0 self.listapkback = [] self.dictnew = dictnew def stop(self): logging.debug("thread stop") print "stop thread" self.timeToQuit.set() #获取apk的列表 def getpackagenemlist(self): logging.debug('list package get') self.listapkpre = [] m = os.popen('adb shell pm list package ').read() # 安装APK之前得到package的所有包名 del self.listapkpre[:] # 清空列表 strlist = m.split('\n') logging.debug(u'添加到list中') for value in strlist: self.listapkpre.append(value) # 添加到list中 for indexapk in self.listapkpre: print 'apk pre--->' + indexapk # 列表中的文件 print 'apklistpre allcount--> %d' % len(self.listapkpre) self.apkcount =len(self.listapkpre) def run(self): self.getpackagenemlist() #获取package的列表 while (self.index < self.len): if len(self.listapkback) == 0: print 'No compare' else: # retD = list(set(self.listapkpre).difference(set(self.listapkback))) retD =list(set(self.listapkpre)^set(self.listapkback)) print u"新安装的APK is: %s " % retD logging.debug(u"新安装的APK is: %s " % retD) logging.debug('Install apk end ') # 字符串分割 print retD[0] packstring = retD[0] print u"PackageName全名 ----> %s" % packstring logging.debug(u'安装成功的package,并进行分离') u1, u2 = packstring.split(':') print "name --> %s" % u1 print "package-->%s" % u2 print self.dictnew[str(self.listname[self.index])] message = str(u2) + ' monkey test start \n ' print message logging.debug(message) wx.CallAfter(self.window.UpdateCtrlText, message) # --ignore-crashes cmd_monkey = "adb shell monkey -p " + str(u2)+ " -v --throttle 100 3000" print cmd_monkey outputline = os.popen(cmd_monkey).read() logging.debug(u'在mongkey测试结果中找一个是crash, 另外一个是finish') print outputline #1 crash pattern1 = re.compile(r'crash', re.IGNORECASE) result1 = pattern1.findall(outputline) print u'crash result-------->' + str(result1) if len(result1): logging.debug('crash result-->'+outputline) # # crash 日志文件log日志 # if len(result1) > 0: logging.debug('logcat already create,go home') dt = time.strftime('%Y-%m-%d-%H-%M-%S') logfilename = "Monkey_log_" + dt inpu = open(os.getcwd() + "/" + logfilename + ".log", 'w') inpu.write(str(u2) + " 执行Monkey时间发生crash,日志:") inpu.writelines(outputline) inpu.close() message = "\nHave Crash" wx.CallAfter(self.window.UpdateCtrlText, message) #3 判断是否结束了 pattern_finish = re.compile(r'Monkey finished', re.IGNORECASE) monkey_finish = pattern_finish.findall(outputline) # print u'monkey 执行日志--->' + outputline if len(monkey_finish): msg4 = u"SUCC" print u'monkey 测试成功' else: msg4 = u"FAIL" print u'monkey 测试失败' print 'monkey test end' logging.debug(str(u2)+" monkey test end ") wx.CallAfter(self.window.UpdateCtrlText, str(u2) + ' monkey test end \n') wx.CallAfter(self.window.UpdateCtrlText, str(u2) + ' uninstall apk start \n') # 3卸载 print 'uninstall apk start' cmd_uninstall = CMD_UNINSTALL + str(u2) print cmd_uninstall logging.debug(str(u2)+' uninstall apk start') #unin = os.popen(cmd_uninstall).read() unin = os.system(cmd_uninstall) print 'unistall result %d' %unin if unin == 0: msg6 = 'SUCC' print 'uninstall apk success' # if len(uninstallresultf): else: msg6 = "FAIL" print 'uninstall apk fail' self.listapkpre.append(value) # 添加到list中 print 'uninstall apk end' logging.debug(u2+ ' uninstall apk end') wx.CallAfter(self.window.UpdateCtrlText, u2 + ' uninstall apk finished \n') # 更新UI,msg信息中包含 apkName ,packagename,install ,monkey,unistall,other msg1 ,msg2,msg3,msg4 msg2 = sucname msg3 = 'SUCC' wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg6) time.sleep(10) # ----准备安装----------------- print u"准备安装 " + str(self.listname[self.index]) print "self.index-->"+str(self.index) print u'对应apk的名称-->'+self.dictnew[str(self.listname[self.index])] logging.debug(u'准备安装:'+self.dictnew[str(self.listname[self.index])]) print "filepath--->" + self.filepath msg1 = self.listname[self.index] cmd_shell = CMD_ADBINSTALL + self.filepath + '\\' + self.listname[self.index] # instres = os.popen(cmd_shell).read() instres =os.system(cmd_shell) logging.debug('instress result--->%d' %instres) if instres == 0: print u"安装成功" del self.listapkback[:] # 清空列表 ms = " Install apk success \n" wx.CallAfter(self.window.UpdateCtrlText, ms) #安装成功的apk name sucname = self.dictnew[str(self.listname[self.index])] print sucname logging.debug('first apk has install finished ,and wait next ') #成功之后才有更新后的列表 ,失败是咩有更新列表的 n = os.popen('adb shell pm list package').read() # 安装APK之后得到package的所有包名 strlist1 = n.split('\n') for value in strlist1: self.listapkback.append(value) # 更新列表后,得到apk的列表 for indexapk in self.listapkback: print u'安装成功后apk列表--->' + indexapk print 'apklistback count %d' % len(self.listapkback) #比较原来和更新后的apk列表 retDiff =list(set(self.listapkpre)^set(self.listapkback)) if len(retDiff) ==0 : print u"安装系统了自带的apk了" #执行策略 ,这里直接跳过,更新到列表中,安装卸载,monkey都不执行, 直接绿灯通过 logging.debug("this apk is already exist") msg2 =sucname msg3 ='SUCC' msg4 ='SUCC' msg6 ='SUCC' wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg6) #清空 listapkback del self.listapkback[:] else: print u"安装失败" logging.debug('install fail') msf = " Install apk failure \n" wx.CallAfter(self.window.UpdateCtrlText, msf) msg1 = self.listname[self.index] # msg2 = str(self.listname[self.index]) msg2 = self.dictnew[str(self.listname[self.index])] msg3 = 'FAIL' msg4 = 'FAIL' msg5 = 'FAIL' logging.error('install apk failed or has already install') wx.CallAfter(self.window.UpListCtrl, msg1, msg2, msg3, msg4, msg5) #更新UI界面 time.sleep(10) #清空列表 del self.listapkback[:] # print "执行安装 " + str(self.listname[self.index]) print 'self.index --->%d',self.index self.index += 1 # 等待30S print "wait 10" self.timeToQuit.wait(20) # 继续执行 print "go on" if self.timeToQuit.isSet(): print u"手动停止线程运行" logging.debug('handler stop ') wx.CallAfter(self.window.UpdateCtrlText, 'handler stop \n') break else: print u"执行完成---over " logging.debug('thread finish') wx.CallAfter(self.window.UpdateCtrlText, 'thread finish') wx.CallAfter(self.window.ThreadFinished, self) ########################################################################### ## Class MyFrame1 ########################################################################### class MyFrame1(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title=u"TOP_APK_7.0", pos=wx.DefaultPosition, size=wx.Size(1200, 750), style=wx.CLOSE_BOX | wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) # self.icon = wx.Icon('rocket.ico', wx.BITMAP_TYPE_ICO) # title 图标 # self.SetIcon(self.icon) self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) self.INITMENU() self.m_splitter2 = wx.SplitterWindow(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.SP_3D) self.m_splitter2.SetSashGravity(0.2) self.m_splitter2.Bind(wx.EVT_IDLE, self.m_splitter2OnIdle) self.m_splitter2.SetMinimumPaneSize(20) self.initpanel() # parment self.threads = [] # 线程池 self.ischose = False # 是否选择了应用程序 self.filepath = "" #文件路径 self.id_index = 0 self.isConnect = False #手机是否连接 self.count = 0 #gauage 计数 self.isGauage = False #进度条是否执行 self.BTNBIND() self.INITSTATUBAR() self.logcat() logging.debug('top-apk loggingg') #2S后调用连接手机 wx.FutureCall(2000,self.call,'call adb shell',name = 'get device') def call(self,*args, **kwargs): if self.connectDevice(): print u'连接成功' logging.debug('connect device success') else: description ='当前连接失败,20S将重新连接' aboutdialog = wx.AboutDialogInfo() aboutdialog.SetDescription(description.decode('utf-8')) wx.AboutBox(aboutdialog) def initpanel(self): bSizer7 = wx.BoxSizer(wx.HORIZONTAL) self.m_panel1 = wx.Panel(self.m_splitter2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) bSizer121 = wx.BoxSizer(wx.VERTICAL) bSizer10 = wx.BoxSizer(wx.HORIZONTAL) sbSizer2 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel1, wx.ID_ANY, u"APK路径"), wx.HORIZONTAL) self.m_staticText5 = wx.StaticText(sbSizer2.GetStaticBox(), wx.ID_ANY, u"APK文件夹", wx.DefaultPosition, wx.DefaultSize, 0) self.m_staticText5.Wrap(-1) sbSizer2.Add(self.m_staticText5, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.m_textCtrl1 = wx.TextCtrl(sbSizer2.GetStaticBox(), wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0) sbSizer2.Add(self.m_textCtrl1, 1, wx.ALL, 5) self.m_button1 = wx.Button(sbSizer2.GetStaticBox(), wx.ID_ANY, u"...", wx.DefaultPosition, wx.DefaultSize, 0) sbSizer2.Add(self.m_button1, 0, wx.ALL, 5) bSizer10.Add(sbSizer2, 1, wx.EXPAND, 5) bSizer121.Add(bSizer10, 0, wx.EXPAND, 5) m_checkList2Choices = [] self.m_checkList2 = wx.CheckListBox(self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_checkList2Choices, 0) bSizer121.Add(self.m_checkList2, 1, wx.ALL | wx.ALIGN_CENTER_HORIZONTAL | wx.EXPAND, 5) m_radioBox3Choices = [u"全选", u"全不选"] self.m_radioBox3 = wx.RadioBox(self.m_panel1, wx.ID_ANY, u"选择类型", wx.DefaultPosition, wx.DefaultSize, m_radioBox3Choices, 1, wx.RA_SPECIFY_ROWS) self.m_radioBox3.SetSelection(1) bSizer121.Add(self.m_radioBox3, 0, wx.ALL | wx.EXPAND | wx.ALIGN_RIGHT, 5) bSizer14 = wx.BoxSizer(wx.HORIZONTAL) self.m_button7 = wx.Button(self.m_panel1, wx.ID_ANY, u"确定", wx.DefaultPosition, wx.DefaultSize, 0) bSizer14.Add(self.m_button7, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.m_button8 = wx.Button(self.m_panel1, wx.ID_ANY, u"取消", wx.DefaultPosition, wx.DefaultSize, 0) bSizer14.Add(self.m_button8, 0, wx.ALL | wx.EXPAND | wx.ALIGN_BOTTOM, 5) bSizer121.Add(bSizer14, 0, wx.ALIGN_CENTER_HORIZONTAL, 5) self.m_panel1.SetSizer(bSizer121) self.m_panel1.Layout() bSizer121.Fit(self.m_panel1) self.m_panel2 = wx.Panel(self.m_splitter2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL) bSizer131 = wx.BoxSizer(wx.VERTICAL) bSizer11 = wx.BoxSizer(wx.VERTICAL) sbSizer3 = wx.StaticBoxSizer(wx.StaticBox(self.m_panel2, wx.ID_ANY, u"结果输出"), wx.VERTICAL) self.m_listCtrl1 = wx.ListCtrl(sbSizer3.GetStaticBox(), wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LC_HRULES | wx.LC_REPORT | wx.LC_VRULES) self.m_listCtrl1.InsertColumn(0, "Id", width=100) self.m_listCtrl1.InsertColumn(1, "ApkId", width=100) self.m_listCtrl1.InsertColumn(2, "ApkName", width=150) self.m_listCtrl1.InsertColumn(3, "Install", width=100) self.m_listCtrl1.InsertColumn(4, "Monkey", width=100) self.m_listCtrl1.InsertColumn(5, "Uninstall", width=100) self.m_listCtrl1.DeleteAllItems() sbSizer3.Add(self.m_listCtrl1, 1, wx.ALL | wx.EXPAND, 5) bSizer11.Add(sbSizer3, 1, wx.EXPAND, 5) self.m_staticline1 = wx.StaticLine(self.m_panel2, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) bSizer11.Add(self.m_staticline1, 0, wx.EXPAND | wx.ALL, 5) self.m_textCtrl3 = wx.TextCtrl(self.m_panel2, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, wx.TE_MULTILINE) bSizer11.Add(self.m_textCtrl3, 1, wx.ALL | wx.EXPAND, 5) self.m_gauge2 = wx.Gauge(self.m_panel2, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL) self.m_gauge2.SetBezelFace(3) self.m_gauge2.SetShadowWidth(3) # bSizer11.Add(self.m_gauge2, 0, wx.ALL | wx.EXPAND, 5) bSizer131.Add(bSizer11, 6, wx.EXPAND, 5) bSizer12 = wx.BoxSizer(wx.HORIZONTAL) self.m_startBtn = wx.Button(self.m_panel2, wx.ID_ANY, u"开始", wx.DefaultPosition, wx.DefaultSize, 0) bSizer12.Add(self.m_startBtn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) self.m_stopbtn = wx.Button(self.m_panel2, wx.ID_ANY, u"停止", wx.DefaultPosition, wx.DefaultSize, 0) bSizer12.Add(self.m_stopbtn, 0, wx.ALL | wx.ALIGN_CENTER_VERTICAL, 5) bSizer131.Add(bSizer12, 0, wx.ALIGN_CENTER_HORIZONTAL, 5) self.m_panel2.SetSizer(bSizer131) self.m_panel2.Layout() bSizer131.Fit(self.m_panel2) self.m_splitter2.SplitVertically(self.m_panel1, self.m_panel2, 304) bSizer7.Add(self.m_splitter2, 20, wx.EXPAND, 10) self.SetSizer(bSizer7) self.Layout() self.Centre(wx.BOTH) #进度条 def OnGauge(self): self.count =self.count+1 time.sleep(1) if self.count>=99: self.count = 0 self.m_gauge2.SetValue(self.count) # menu菜单 def INITMENU(self): self.m_menubar1 = wx.MenuBar(0) self.m_menu1 = wx.Menu() self.m_menuItem1 = wx.MenuItem(self.m_menu1, wx.ID_ANY, u"退出", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu1.AppendItem(self.m_menuItem1) self.m_menubar1.Append(self.m_menu1, u" 文件 ") self.m_menu2 = wx.Menu() self.m_menuItem4 = wx.MenuItem(self.m_menu2, wx.ID_ANY, u"更改APK名称", wx.EmptyString, wx.ITEM_NORMAL) self.m_menuItem5 = wx.MenuItem(self.m_menu2, wx.ID_ANY, u"导出结果", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu2.AppendItem(self.m_menuItem5) self.m_menu2.AppendItem(self.m_menuItem4) self.m_menubar1.Append(self.m_menu2, u" 配置 ") self.m_menu4 = wx.Menu() self.m_menuItem3 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"关于", wx.EmptyString, wx.ITEM_NORMAL) # self.m_menuItem6 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"使用说明", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu4.AppendItem(self.m_menuItem3) # self.m_menu4.AppendItem(self.m_menuItem6) self.m_menubar1.Append(self.m_menu4, u" 帮助 ") self.m_menu5 = wx.Menu() self.m_menuItem6 = wx.MenuItem(self.m_menu4, wx.ID_ANY, u"使用说明", wx.EmptyString, wx.ITEM_NORMAL) self.m_menu5.AppendItem(self.m_menuItem6) self.m_menubar1.Append(self.m_menu5, u" 使用说明 ") self.SetMenuBar(self.m_menubar1) #按键的绑定 def BTNBIND(self): # Connect Events self.Bind(wx.EVT_CLOSE, self.OnWindowClose) self.Bind(wx.EVT_MENU, self.OnClose, id=self.m_menuItem1.GetId()) self.Bind(wx.EVT_MENU, self.Export, id=self.m_menuItem5.GetId()) self.Bind(wx.EVT_MENU, self.OnAbout, id=self.m_menuItem3.GetId()) self.Bind(wx.EVT_MENU, self.ReName, id=self.m_menuItem4.GetId()) self.Bind(wx.EVT_MENU, self.Usage, id=self.m_menuItem6.GetId()) self.m_button1.Bind(wx.EVT_BUTTON, self.OnOpen) self.m_button7.Bind(wx.EVT_BUTTON, self.OnSave) self.m_button8.Bind(wx.EVT_BUTTON, self.OnCancle) self.m_startBtn.Bind(wx.EVT_BUTTON, self.OnStart) self.m_stopbtn.Bind(wx.EVT_BUTTON, self.OnStop) self.m_stopbtn.Disable() self.m_radioBox3.Bind(wx.EVT_RADIOBOX, self.OnRadioBoxChose) # self.m_checkList2.Bind(wx.EVT_CHECKLISTBOX, self.OnCheckList) #状态栏 def INITSTATUBAR(self): self.m_statusBar1 = self.CreateStatusBar(2, wx.ST_SIZEGRIP, wx.ID_ANY) # 将状态栏分割为3个区域,比例为1:2:3 self.m_statusBar1.SetFieldsCount(4) self.m_statusBar1.SetStatusWidths([-1, -1, -1,-1]) # everage # 创建定时器 self.timer = wx.Timer(self) # 创建定时器,在OnTimer1中启动 self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer) # 状态栏手机连接状态和当前时间 self.timer.Start(20000) # 启动执行一次 self.timer3 = wx.Timer(self) # 当前时间计时器 self.Bind(wx.EVT_TIMER, self.dataTime, self.timer3) self.timer3.Start(1000) # 启动执行一次 self.SetStatusText("Phone State : "+u'等待连接...', 0) self.SetStatusText('Monkey_log:'+os.getcwd(), 2) # crash 日志文件 self.SetStatusText('LogCat: '+os.getcwd()+'\\', 3) # crash 日志文件 def logcat(self): logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename='Log_'+time.strftime('%Y-%m-%d-%H-%M-%S')+'.log', filemode='w') def connectDevice(self): '''''检查设备是否连接成功,如果成功返回True,否则返回False''' try: # '''获取设备列表信息,并用"\r\n"拆分''' deviceinfo =subprocess.check_output('adb devices').split('\r\n') print deviceinfo if deviceinfo[1]=='': print 'wait for devices...' return False else: print 'device info <--->',deviceinfo[1] self.devicename = deviceinfo[1] return True except Exception, e: print 'device connect fail:',e # Virtual event handlers, overide them in your derived class def OnTimer(self, event): # 状态栏手机连接状态 # phoneName = os.popen(ADB_GET_SERIALNO).read() if self.connectDevice(): try: # #设备名称 self.deviceInfo= subprocess.check_output('adb devices -l ') print 'self.deviceinfo-->\n',self.deviceInfo deviceName=re.findall(r'device product:(.*) model',self.deviceInfo,re.S)[0] print deviceName # sysInfo= subprocess.check_output('adb shell cat /system/build.prop',shell=True) # print sysInfo #获取安卓版本号 androidVersion=re.findall("version.release=(\d\.\d)*",sysInfo , re.S)[0] print androidVersion self.isConnect = True self.SetStatusText("Phone State : " +deviceName+"_"+androidVersion+ u" 已连接", 0) # self.SetStatusText(u"Phone State : 连接", 0) logging.debug('phone state already connect') except Exception,e: print u"异常-->", e else: self.SetStatusText(u"Phone State : 未连接,等待连接...", 0) logging.debug('phone disconnect') self.isConnect = False self.m_startBtn.Enable() self.m_stopbtn.Disable() # pass # 显示时间 def dataTime(self, event): t = time.localtime(time.time()) StrIMSt = "Time :" + time.strftime(" %I:%M:%S", t) self.SetStatusText(StrIMSt, 1) # 显示时间 # 更新listctrl def UpListCtrl(self, msg1, msg2, msg3, msg4, msg5): # pass line = "%s" % self.id_index self.m_listCtrl1.InsertStringItem(self.id_index, line) #id self.m_listCtrl1.SetStringItem(self.id_index, 1, msg1) #name self.m_listCtrl1.SetStringItem(self.id_index, 2, msg2) #pkagename self.m_listCtrl1.SetStringItem(self.id_index, 3, msg3) #install self.m_listCtrl1.SetStringItem(self.id_index, 4, msg4) #monkey self.m_listCtrl1.SetStringItem(self.id_index, 5, msg5) #uninstall self.id_index += 1 tup =(self.id_index,msg1,msg2,msg3,msg4,msg5) data.append(tup) print msg1,msg2,msg3,msg4,msg5 #更新文本信息 def UpdateCtrlText(self, message): self.m_textCtrl3.AppendText(message) #关闭 def OnClose(self, event): logging.debug('oclose') self.Destroy() #导出数据 def Export(self,event): logging.debug('Export result') print 'Export result' with open("OutResult.csv",'w') as csvfile: csvfile.write(codecs.BOM_UTF8) writer = csv.writer(csvfile,lineterminator='\n') #先写入columns_name writer.writerow(['ID','APK_ID','APK_Name','Install_Result','Monkey_Result','Uninstall_Result']) for item in data: logging.debug(item) print item #写入多行用writerows writer.writerow(item) def Usage(self,event): print '使用说明' logging.debug("Usage") description = """使用说明(严格按照步骤执行): 1.点击配置,更改文件名称" 2.选择APK文件夹,全选,点击确定,最后点击开始执行 3.执行完成后,点击配置,选择导出结果,输出OutResult.csv""" info = wx.AboutDialogInfo() info.SetDescription(description.decode('utf-8')) wx.AboutBox(info) #重命名文件 def ReName(self,event): print u'rename' logging.debug('rename') """ Create and show the Open FileDialog """ cdlg = wx.DirDialog(self, u"选择重命名的文件夹", style=wx.DD_DEFAULT_STYLE) if cdlg.ShowModal() == wx.ID_OK: print cdlg.GetPath() self.remepath =cdlg.GetPath() renamelist = os.listdir(cdlg.GetPath()) renamelist.sort() self.renamesave =[] #修改名字之前 ,apk名称,保存名称列表 i = 0 for self.rename_index in renamelist: print "apk name-->"+self.rename_index oldname = str(self.rename_index) logging.debug('add apkname in list') self.renamesave.append(oldname) # 重命名 os.rename(cdlg.GetPath()+"\\"+oldname,cdlg.GetPath()+"\\"+str(i)+".apk") dict[oldname]=str(i)+".apk" i =i+1 for self.d_index in self.renamesave: # logging.debug(u'字典对应 %s %s' %d_index %dict[d_index]) print '原名:'+self.d_index.decode('utf-8')+"<--->"+"改名:"+ dict[self.d_index] # 添加到新的字典中 dictnew[dict[self.d_index]] =(self.d_index).decode('utf-8') logging.debug("新字典结果:%s" %dictnew) print dictnew logging.debug(u"写入到csv文件中") self.createDictCSV("DictFile.csv",dict) cdlg.Destroy() # 功能:将一个字典写入到csv文件中 def createDictCSV(self,fileName="", dataDict={}): with open(fileName, "wb") as csvFile: logging.debug(u"具体写入文件中") csvFile.write(codecs.BOM_UTF8) csvWriter = csv.writer(csvFile) for k,v in dataDict.iteritems(): csvWriter.writerow([k,v]) csvFile.close() # 关于 def OnAbout(self, event): description = """The tool is made for better execution of android automaiton ,the code is python and the current version is """ + str( VERSION) + """ and will be updatad slowly,if there is a problem is exuecution ,contact me ,My name is Toby """ info = wx.AboutDialogInfo() info.SetVersion(str(VERSION)) info.SetDescription(description) info.AddDeveloper('JUNWANG He,Email: [email protected]') wx.AboutBox(info) # 打开 def OnOpen(self, event): dlg = wx.DirDialog(self, u"选择文件夹", style=wx.DD_DEFAULT_STYLE) if dlg.ShowModal() == wx.ID_OK: print dlg.GetPath() self.filepath = dlg.GetPath() print "filepath -->%s" % self.filepath # 文件路径 logging.debug("filepath -->%s" % self.filepath) self.m_textCtrl3.AppendText(u"APK文件路径--->%s" % self.filepath + "\n") self.m_textCtrl1.SetValue(dlg.GetPath()) l = os.listdir(dlg.GetPath()) #获取文件夹下的文件,并进行排序 l.sort() print l print u"文件列表长度%d" % len(l) self.filelen = len(l) self.listname = [] #apk的名称 self.m_checkList2.Clear() # 清空列表中的文件 for index in l: self.m_checkList2.Append(index) # 文件填充到单选列表中 print index self.listname.append(index) # #添加到listname[]中 # print self.m_checkList1.GetSelection() for n in self.listname: print "listname-->" + n self.splitname = n print n.split('.')[0] print self.splitname self.m_button7.Enable() dlg.Destroy() def ThreadFinished(self, thread): # 停止线程执行 print '移除线程' self.threads.remove(thread) self.m_startBtn.Enable() self.m_stopbtn.Disable() self.isGauage =False # 保存 def OnSave(self, event): self.ischose = True # 是否选择了应用程序 print "Set ischose =true" self.m_textCtrl3.AppendText("OnSave\n") # 取消 def OnCancle(self, event): # event.Skip() self.ischose = False # 是否选择了应用程序 print "Set ischose =fale" self.m_textCtrl3.AppendText("取消保存\n") # 开始按钮 def OnStart(self, event): logging.debug('onstart clicked') if self.ischose and (self.filepath != "") and self.isConnect: # 文件路径 文件列表名称 列表文件大小 thread = topapkThread(self.filepath, self.listname, self.filelen, self,dictnew) self.threads.append(thread) thread.start() print 'All Select' self.m_startBtn.Disable() self.m_stopbtn.Enable() self.isGauage = True if self.isGauage: self.OnGauge() else: dlg = wx.MessageDialog(None, u"没有选择要执行的apk或者是手机未连接,请检测", u"标题信息", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: print u'没有选择,或是手机未连接' self.m_startBtn.Enable() self.m_stopbtn.Disable() dlg.Destroy() #停止按钮 def OnStop(self, event): self.m_startBtn.Enable() self.m_stopbtn.Disable() self.topapk_StopThread() self.m_textCtrl3.AppendText(u'手动停止\n') self.isGauage =False def topapk_StopThread(self): # 线程停止 while self.threads: thread = self.threads[0] # print "thread is -->"+thread thread.stop() self.threads.remove(thread) #分割线 def m_splitter2OnIdle(self, event): self.m_splitter2.SetSashPosition(343) self.m_splitter2.Unbind(wx.EVT_IDLE) # 选择框 def OnRadioBoxChose(self, event): rb = self.m_radioBox3.GetSelection() print rb if rb == 0: self.filecount = self.m_checkList2.GetCount() self.findcheck = self.m_checkList2.GetChecked() print "全部选择 " + str(self.filecount) + "\nfindcheck --" + str(len(self.findcheck)) # 全选 for n in range(self.filecount): self.m_checkList2.Check(n, check=True) else: print "全不选" for n in range(self.filecount): self.m_checkList2.Check(n, check=False) def OnCheckList(self, event): index = self.m_checkList2.GetSelection() print "onChecklist---->index %d" % index #关闭窗口 def OnWindowClose(self, event): self.Destroy() if __name__ == '__main__': app = wx.App() MyFrame1(None).Show() app.MainLoop()