def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_frmMain() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.btnSelDir, QtCore.SIGNAL("clicked()"), self.SelDir_Btn_Clicked) QtCore.QObject.connect(self.ui.btnOpenFile, QtCore.SIGNAL("clicked()"), self.OpenFile_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecode, QtCore.SIGNAL("clicked()"), self.Decode_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecodeAll, QtCore.SIGNAL("clicked()"), self.DecodeAll_Btn_Clicked) self.ui.txtSavePath.setText(QtCore.QDir.currentPath()) self.fileList = [] self.thread = Worker() self.connect(self.thread, QtCore.SIGNAL('WorkerDone(int)'), self.WorkerDone) self.connect(self.thread, QtCore.SIGNAL('started()'), self.WorkerStarted) self.connect(self.thread, QtCore.SIGNAL('finished()'), self.WorkerFinished) self.connect(self.thread, QtCore.SIGNAL("terminated()"), self.WorkerFinished)
def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_frmMain() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.btnSelDir, QtCore.SIGNAL("clicked()"), self.SelDir_Btn_Clicked) QtCore.QObject.connect(self.ui.btnOpenFile, QtCore.SIGNAL("clicked()"), self.OpenFile_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecode, QtCore.SIGNAL("clicked()"), self.Decode_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecodeAll, QtCore.SIGNAL("clicked()"), self.DecodeAll_Btn_Clicked) self.ui.txtSavePath.setText(QtCore.QDir.currentPath()) self.fileList = [] self.thread = Worker() self.connect(self.thread, QtCore.SIGNAL("WorkerDone(int)"), self.WorkerDone) self.connect(self.thread, QtCore.SIGNAL("started()"), self.WorkerStarted) self.connect(self.thread, QtCore.SIGNAL("finished()"), self.WorkerFinished) self.connect(self.thread, QtCore.SIGNAL("terminated()"), self.WorkerFinished)
class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_frmMain() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.btnSelDir, QtCore.SIGNAL("clicked()"), self.SelDir_Btn_Clicked) QtCore.QObject.connect(self.ui.btnOpenFile, QtCore.SIGNAL("clicked()"), self.OpenFile_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecode, QtCore.SIGNAL("clicked()"), self.Decode_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecodeAll, QtCore.SIGNAL("clicked()"), self.DecodeAll_Btn_Clicked) self.ui.txtSavePath.setText(QtCore.QDir.currentPath()) self.fileList = [] self.thread = Worker() self.connect(self.thread, QtCore.SIGNAL("WorkerDone(int)"), self.WorkerDone) self.connect(self.thread, QtCore.SIGNAL("started()"), self.WorkerStarted) self.connect(self.thread, QtCore.SIGNAL("finished()"), self.WorkerFinished) self.connect(self.thread, QtCore.SIGNAL("terminated()"), self.WorkerFinished) def WorkerDone(self, n): self.MsgBox(u"提示", u"解密成功!") self.ui.btnDecode.setEnabled(True) self.ui.btnDecodeAll.setEnabled(True) def WorkerStarted(self): print u"后台线程开始运行" def WorkerFinished(self): print u"后台线程运行结束!" # “选择目录”按钮单击 def SelDir_Btn_Clicked(self): fileDlg = QtGui.QFileDialog(self, u"选择目录", QtCore.QDir.currentPath()) savePath = fileDlg.getExistingDirectory() savePath = unicode(savePath) if os.path.isdir(savePath): self.ui.txtSavePath.setText(savePath) # “打开文件”按钮单击 def OpenFile_Btn_Clicked(self): fileName = QtGui.QFileDialog.getOpenFileName( self, u"打开文件", QtCore.QDir.currentPath(), u"PKG资源包(*.pkg);;所有文件(*.*)" ) fileName = unicode(fileName) if os.path.isfile(fileName): self.ui.txtSrcFile.setText(fileName) self.ReadPkgFile(fileName) self.ShowFileList() # 读取Pkg资源包内的文件列表 def ReadPkgFile(self, fileName): self.fileList = [] f = open(fileName, "rb") self.pkgFileHeader = f.read(4) # 文件标识(64 00 00 00) self.pkgFileHeader, = struct.unpack("l", self.pkgFileHeader) if self.pkgFileHeader == 0x64: print '"', fileName, '"', " is pkg file!" else: print '"', fileName, '"', " is not pkg file!" f.close() return self.fileCount = f.read(4) self.fileCount, = struct.unpack("l", self.fileCount) print u"文件总数:", self.fileCount self.fileListPos = f.read(4) self.fileListPos, = struct.unpack("l", self.fileListPos) print u"文件列表区的偏移地址:", self.fileListPos self.fileListSize = f.read(4) self.fileListSize, = struct.unpack("l", self.fileListSize) print u"文件列表区的大小:", self.fileListSize f.seek(self.fileListPos) for i in range(0, self.fileCount): self.fileList.append([]) self.tmpFileNameLen = f.read(2) # 文件名称字符串长度 self.tmpFileNameLen, = struct.unpack("H", self.tmpFileNameLen) self.tmpFileName = f.read(self.tmpFileNameLen) # 带相对路径的文件名称 self.fileList[i].append(self.tmpFileName) f.read(4) # 识别标志(00 00 00 00) self.tmpFileStartOffset = f.read(4) # 文件起始偏移地址 self.tmpFileStartOffset, = struct.unpack("l", self.tmpFileStartOffset) self.fileList[i].append(self.tmpFileStartOffset) self.tmpFileOriginSize = f.read(4) # 原始文件大小 self.tmpFileOriginSize, = struct.unpack("l", self.tmpFileOriginSize) self.fileList[i].append(self.tmpFileOriginSize) self.tmpFileSize = f.read(4) # 文件大小 self.tmpFileSize, = struct.unpack("l", self.tmpFileSize) self.fileList[i].append(self.tmpFileSize) f.close() # 显示文件列表 def ShowFileList(self): self.ui.lstFileList.clear() if len(self.fileList) <= 0: return for item in self.fileList: self.ui.lstFileList.addItem(item[0]) # “解密”按钮单击 def Decode_Btn_Clicked(self): if self.ui.lstFileList.count() <= 0: self.MsgBox(u"提示", u"文件列表为空!") return if len(self.ui.lstFileList.selectedItems()) <= 0: self.MsgBox(u"提示", u"未选中文件!") return savePath = unicode(self.ui.txtSavePath.text()) pkgFileName = unicode(self.ui.txtSrcFile.text()) if not os.path.isfile(pkgFileName): self.MsgBox(u"提示", u"PKG资源包不存在!") return self.ui.btnDecode.setEnabled(False) self.ui.btnDecodeAll.setEnabled(False) index = [] for i in range(0, self.ui.lstFileList.count()): if self.ui.lstFileList.isItemSelected(self.ui.lstFileList.item(i)): index.append(i) self.thread.savePath = savePath self.thread.pkgFileName = pkgFileName self.thread.Decode(self.fileList, index) # “全部解密”按钮单击 def DecodeAll_Btn_Clicked(self): if self.ui.lstFileList.count() <= 0: self.MsgBox(u"提示", u"文件列表为空!") return savePath = unicode(self.ui.txtSavePath.text()) pkgFileName = unicode(self.ui.txtSrcFile.text()) if not os.path.isfile(pkgFileName): self.MsgBox(u"提示", u"PKG资源包不存在!") return self.ui.btnDecode.setEnabled(False) self.ui.btnDecodeAll.setEnabled(False) index = [] for i in range(0, self.ui.lstFileList.count()): index.append(i) self.thread.savePath = savePath self.thread.pkgFileName = pkgFileName self.thread.Decode(self.fileList, index) # 自定义消息框 def MsgBox(self, title, msg): msgbox = QtGui.QMessageBox(self) msgbox.setFont(QtGui.QFont("Tahoma", 9)) msgbox.setWindowTitle(title) msgbox.setText(msg) msgbox.setIcon(QtGui.QMessageBox.Information) msgbox.addButton(u"确定", QtGui.QMessageBox.AcceptRole) msgbox.exec_()
class MainForm(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.ui = Ui_frmMain() self.ui.setupUi(self) QtCore.QObject.connect(self.ui.btnSelDir, QtCore.SIGNAL("clicked()"), self.SelDir_Btn_Clicked) QtCore.QObject.connect(self.ui.btnOpenFile, QtCore.SIGNAL("clicked()"), self.OpenFile_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecode, QtCore.SIGNAL("clicked()"), self.Decode_Btn_Clicked) QtCore.QObject.connect(self.ui.btnDecodeAll, QtCore.SIGNAL("clicked()"), self.DecodeAll_Btn_Clicked) self.ui.txtSavePath.setText(QtCore.QDir.currentPath()) self.fileList = [] self.thread = Worker() self.connect(self.thread, QtCore.SIGNAL('WorkerDone(int)'), self.WorkerDone) self.connect(self.thread, QtCore.SIGNAL('started()'), self.WorkerStarted) self.connect(self.thread, QtCore.SIGNAL('finished()'), self.WorkerFinished) self.connect(self.thread, QtCore.SIGNAL("terminated()"), self.WorkerFinished) def WorkerDone(self, n): self.MsgBox(u'提示', u'解密成功!') self.ui.btnDecode.setEnabled(True) self.ui.btnDecodeAll.setEnabled(True) def WorkerStarted(self): print u'后台线程开始运行' def WorkerFinished(self): print u'后台线程运行结束!' # “选择目录”按钮单击 def SelDir_Btn_Clicked(self): fileDlg = QtGui.QFileDialog(self, u'选择目录', QtCore.QDir.currentPath()) savePath = fileDlg.getExistingDirectory() savePath = unicode(savePath) if os.path.isdir(savePath): self.ui.txtSavePath.setText(savePath) # “打开文件”按钮单击 def OpenFile_Btn_Clicked(self): fileName = QtGui.QFileDialog.getOpenFileName( self, u'打开文件', QtCore.QDir.currentPath(), u'PKG资源包(*.pkg);;所有文件(*.*)') fileName = unicode(fileName) if os.path.isfile(fileName): self.ui.txtSrcFile.setText(fileName) self.ReadPkgFile(fileName) self.ShowFileList() # 读取Pkg资源包内的文件列表 def ReadPkgFile(self, fileName): self.fileList = [] f = open(fileName, 'rb') self.pkgFileHeader = f.read(4) # 文件标识(64 00 00 00) self.pkgFileHeader, = struct.unpack('l', self.pkgFileHeader) if self.pkgFileHeader == 0x64: print '\"', fileName, '\"', ' is pkg file!' else: print '\"', fileName, '\"', ' is not pkg file!' f.close() return self.fileCount = f.read(4) self.fileCount, = struct.unpack('l', self.fileCount) print u'文件总数:', self.fileCount self.fileListPos = f.read(4) self.fileListPos, = struct.unpack('l', self.fileListPos) print u'文件列表区的偏移地址:', self.fileListPos self.fileListSize = f.read(4) self.fileListSize, = struct.unpack('l', self.fileListSize) print u'文件列表区的大小:', self.fileListSize f.seek(self.fileListPos) for i in range(0, self.fileCount): self.fileList.append([]) self.tmpFileNameLen = f.read(2) # 文件名称字符串长度 self.tmpFileNameLen, = struct.unpack('H', self.tmpFileNameLen) self.tmpFileName = f.read(self.tmpFileNameLen) # 带相对路径的文件名称 self.fileList[i].append(self.tmpFileName) f.read(4) # 识别标志(00 00 00 00) self.tmpFileStartOffset = f.read(4) # 文件起始偏移地址 self.tmpFileStartOffset, = struct.unpack('l', self.tmpFileStartOffset) self.fileList[i].append(self.tmpFileStartOffset) self.tmpFileOriginSize = f.read(4) # 原始文件大小 self.tmpFileOriginSize, = struct.unpack('l', self.tmpFileOriginSize) self.fileList[i].append(self.tmpFileOriginSize) self.tmpFileSize = f.read(4) # 文件大小 self.tmpFileSize, = struct.unpack('l', self.tmpFileSize) self.fileList[i].append(self.tmpFileSize) f.close() # 显示文件列表 def ShowFileList(self): self.ui.lstFileList.clear() if len(self.fileList) <= 0: return for item in self.fileList: self.ui.lstFileList.addItem(item[0]) # “解密”按钮单击 def Decode_Btn_Clicked(self): if self.ui.lstFileList.count() <= 0: self.MsgBox(u'提示', u'文件列表为空!') return if len(self.ui.lstFileList.selectedItems()) <= 0: self.MsgBox(u'提示', u'未选中文件!') return savePath = unicode(self.ui.txtSavePath.text()) pkgFileName = unicode(self.ui.txtSrcFile.text()) if not os.path.isfile(pkgFileName): self.MsgBox(u'提示', u'PKG资源包不存在!') return self.ui.btnDecode.setEnabled(False) self.ui.btnDecodeAll.setEnabled(False) index = [] for i in range(0, self.ui.lstFileList.count()): if self.ui.lstFileList.isItemSelected(self.ui.lstFileList.item(i)): index.append(i) self.thread.savePath = savePath self.thread.pkgFileName = pkgFileName self.thread.Decode(self.fileList, index) # “全部解密”按钮单击 def DecodeAll_Btn_Clicked(self): if self.ui.lstFileList.count() <= 0: self.MsgBox(u'提示', u'文件列表为空!') return savePath = unicode(self.ui.txtSavePath.text()) pkgFileName = unicode(self.ui.txtSrcFile.text()) if not os.path.isfile(pkgFileName): self.MsgBox(u'提示', u'PKG资源包不存在!') return self.ui.btnDecode.setEnabled(False) self.ui.btnDecodeAll.setEnabled(False) index = [] for i in range(0, self.ui.lstFileList.count()): index.append(i) self.thread.savePath = savePath self.thread.pkgFileName = pkgFileName self.thread.Decode(self.fileList, index) # 自定义消息框 def MsgBox(self, title, msg): msgbox = QtGui.QMessageBox(self) msgbox.setFont(QtGui.QFont('Tahoma', 9)) msgbox.setWindowTitle(title) msgbox.setText(msg) msgbox.setIcon(QtGui.QMessageBox.Information) msgbox.addButton(u'确定', QtGui.QMessageBox.AcceptRole) msgbox.exec_()