def slot_clicked(self, control): if control.objectName() == r'pushButton_src': self.data['path_src'] = QtWidgets.QFileDialog.getExistingDirectory( self, "选取源文件夹", self.data['path_src']) # 起始路径 # print(self.data['path_src']) self.flush() elif control.objectName() == r'pushButton_dec': self.data['path_dec'] = QtWidgets.QFileDialog.getExistingDirectory( self, "选取保存文件夹", self.data['path_dec']) # 起始路径 # print(self.data['path_dec']) self.label_path_dec.setText( '%s %d个' % (Utils.getSubStr(self.data['path_dec']), 0)) self.listWidget_dec_files.clear() elif control.objectName() == r'pushButton_flush': self.flush() else: reply = QtWidgets.QMessageBox.question(self, '警告', '改名过程不可逆,\n你确认要更改吗?', QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No) if reply == QtWidgets.QMessageBox.Yes: self.go() else: pass
def flush(self): self.listWidget_src_files.clear() self.files.clear() self.matched_files.clear() count = 0 cur_dir = self.data['path_src'] if os.path.isdir(cur_dir): list_files = os.listdir(cur_dir) # 列出文件夹下所有的目录与文件 for each in list_files: path = os.path.join(cur_dir, each) # 构造完整路径 # 判断路径是否是一个文件目录或者文件 # 如果是文件目录,继续递归 if os.path.isdir(path): # _files.extend(list_all_files(path)) continue if os.path.isfile(path): self.files.append(each) count += 1 item = QtWidgets.QListWidgetItem(each) item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) if self.data['text_mask'] != '' and re.search( r'.*%s.*' % self.data['text_mask'], each): item.setBackground(QtGui.QColor('lightblue')) self.matched_files.append(each) self.listWidget_src_files.addItem(item) path = Utils.getSubStr(self.data['path_src']) self.label_path_src.setText( f'{path} 共{count} 匹配{len(self.matched_files)}')
def init_ui(self): font = QtGui.QFont('NSimSun') font.setPointSize(15) font.setWeight(50) self.listWidget_src_files.setFont(font) self.listWidget_dec_files.setFont(font) self.lineEdit_mask.setPlaceholderText('掩码为空时,可以复制所有文件,但不能覆盖') self.lineEdit_fake.setPlaceholderText('选择覆盖时,只在源目录操作') self.lineEdit_mask.setAlignment(QtCore.Qt.AlignCenter) self.lineEdit_fake.setAlignment(QtCore.Qt.AlignCenter) qss1 = 'QListWidget { outline: none; border:1px solid gray; color: black;}' \ 'QListWidget::Item { width: 50px; height: 30px;}' \ 'QListWidget::Item:hover { background: #4CAF50; color: white; }' \ 'QListWidget::item:selected { background: #e7e7e7; color: #f44336; }' \ 'QListWidget::item:selected:!active { background: lightgreen}' qss2 = "QListWidget{border:1px solid gray; color:black; }" \ "QListWidget::Item{padding-top:20px; padding-bottom:4px; }" \ "QListWidget::Item:hover{background:skyblue; }" \ "QListWidget::item:selected{background:lightgray; color:red; }" \ "QListWidget::item:selected:!active{border-width:0px; background:lightgreen; }" self.listWidget_src_files.setStyleSheet(qss1) self.listWidget_dec_files.setStyleSheet(qss1) # self.listWidget_src_files.setViewMode(QtWidgets.QListView.ListMode) # 设置为列表显示模式 # self.listWidget_src_files.setFlow(QtWidgets.QListView.LeftToRight) # 设置列表从左往右排列 # self.listWidget_src_files.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) # self.listWidget_src_files.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) # 屏蔽水平与垂直的滑动条 # self.listWidget_src_files.setHorizontalScrollMode(QtWidgets.QListWidget.ScrollPerPixel) # 像素滚动 # QtWidgets.QScroller.grabGesture(self.listWidget_src_files, QtWidgets.QScroller.LeftMouseButtonGesture) # 鼠标左键拖动 self.label_path_src.setText('%s' % Utils.getSubStr(self.data['path_src'])) self.label_path_dec.setText('%s' % Utils.getSubStr(self.data['path_dec'])) self.lineEdit_mask.setText('%s' % self.data['text_mask']) self.lineEdit_fake.setText('%s' % self.data['text_fake']) self.checkBox.setChecked(self.data['enabled_cover']) self.lineEdit_mask.setAcceptDrops(True) self.lineEdit_mask.setDragEnabled(True) self.lineEdit_fake.setAcceptDrops(True) self.lineEdit_fake.setDragEnabled(True) # self.listWidget_src_files.setAcceptDrops(True) self.listWidget_src_files.setDragEnabled(True) # self.listWidget_dec_files.setAcceptDrops(True) self.listWidget_dec_files.setDragEnabled(True) self.flush()
def flushDir(self): dir_path = self.data_path['dir_src'] if not dir_path: AnimWin('没有源目录') return tmp = Utils.getSubStr(dir_path, 10) # print(tmp) self.label_src.setText(u'源文件目录:' + tmp) self.files_all.clear() self.listWidget_src.clear() self.checked = False self.files_all = Utils.files_in_dir(dir_path, ['.doc', '.docx']) if not self.files_all: return Utils.sort_nicely(self.files_all) for each in self.files_all: item = QtWidgets.QListWidgetItem(each) self.listWidget_src.addItem(item) self.statusbar.showMessage(f'总文件:{len(self.files_all)} 选中:0', 0)
def slot_tools(self, action): try: # action = QtWidgets.QAction() text = action.text() # print(text) if text == '刷新': self.flushDir() if text == '打开': # fname = tkinter.filedialog.askdirectory() # print(fname) # return # dialog = QtWidgets.QFileDialog(self) # # dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptOpen) # # dialog.setDirectory(self.data_path['dir_src']) # dialog.setFileMode(QtWidgets.QFileDialog.Directory) # # dialog.setOption(QtWidgets.QFileDialog.ShowDirsOnly, True) # dialog.setViewMode(QtWidgets.QFileDialog.List) # # dir_path = dialog.getExistingDirectory() dir_path = QtWidgets.QFileDialog.getExistingDirectory( self, "选取源文件夹", self.data_path['dir_src'], QtWidgets.QFileDialog.ShowDirsOnly) # 起始路径 if dir_path: self.data_path['dir_src'] = dir_path self.flushDir() elif text == '保存': dir_path = QtWidgets.QFileDialog.getExistingDirectory( self, "选取保存目录", self.data_path['dir_dst']) # 起始路径 if dir_path: self.data_path['dir_dst'] = dir_path tmp = Utils.getSubStr(dir_path, 10) self.label_dst.setText(u'源文件目录:' + tmp) elif text == 'word 文件合并': '''合并word文档''' self.files_src.clear() self.files_dst.clear() self.listWidget_dst.clear() self.files_src = set([ item.text() for item in self.listWidget_src.selectedItems() ]) if len(self.files_src) <= 0: AnimWin(' 请选择需要转换的文件!', self) return path_all = [] for each in self.files_src: # print(each) ps = os.path.join(self.data_path['dir_src'], each) # 构造完整路径 path_all.append(ps) pd = os.path.join(self.data_path['dir_dst'], r'merged.doc') # 构造完整路径 # print(path_all) Utils.mergewords(path_all, pd) self.fun_callback(r'merged.doc') elif text == 'word 转 pdf': if not self.data_path['dir_src']: AnimWin(' 请选择源文件所在目录!', self) return if not self.data_path['dir_dst']: AnimWin(' 请选择保存文件的目录!', self) return if not self.files_all: AnimWin(' 未发现源文件!', self) return self.files_src.clear() self.files_dst.clear() self.listWidget_dst.clear() self.files_src = set([ item.text() for item in self.listWidget_src.selectedItems() ]) if len(self.files_src) <= 0: AnimWin(' 请选择需要转换的文件!', self) return # print("-----start-----") # start = timeit.default_timer() # cpu_num = Utils.GetCpuInfo()[0] # pool = multiprocessing.Pool(cpu_num) # for each in self.files_src: # # results = pool.apply_async(self.test, (i,)) # args = (each, self.data_path['dir_src'], self.data_path['dir_dst']) # pool.apply_async(self.fun_process, args, callback=self.fun_callback) # pool.close() # pool.join() # elapsed = (timeit.default_timer() - start) # print("-----end-----") # print(f'用时:{elapsed}秒') print("-----start-----") start = timeit.default_timer() for each in self.files_src: # print(each) ret = self.fun_process(each, self.data_path['dir_src'], self.data_path['dir_dst']) self.fun_callback(ret) elapsed = (timeit.default_timer() - start) print("-----end-----") print(f'用时:{elapsed}秒') except Exception as e: print(e)
def go(self): if self.data['path_src'] == '' or not self.files: spirit = AnimWin("未找到目录或文件", self, 18) return try: self.listWidget_dec_files.clear() count = 0 if self.data['enabled_cover']: # 覆盖 if not self.matched_files: AnimWin("未匹配到合适的文件", self, 18) return for each in self.matched_files: new_name = each.replace(self.data['text_mask'], self.data['text_fake']) path_src = self.data['path_src'] + '/' + each path_dec = self.data['path_src'] + '/' + new_name path_src = path_src.replace('/', '\\\\') path_dec = path_dec.replace('/', '\\\\') print(path_src) os.rename(path_src, path_dec) self.listWidget_dec_files.addItem(new_name) count += 1 self.label_path_dec.setText( '%s %d个' % (Utils.getSubStr(self.data['path_src']), count)) else: # 复制 if self.data['path_dec'] == '': AnimWin("保存目录不能为空", self, 18) # QtWidgets.QSystemTrayIcon.showMessage() return if self.data['text_mask'] == '': # 全部复制 for each in self.files: path_src = self.data['path_src'] + '/' + each path_dec = self.data['path_dec'] + '/' + each path_src = path_src.replace('/', '\\\\') path_dec = path_dec.replace('/', '\\\\') '''必须加双引号把路径括起来,才能解决路径里有空格的问题。中文也可''' os.popen('copy "%s" "%s"' % (path_src, path_dec)) self.listWidget_dec_files.addItem(each) count += 1 else: for each in self.matched_files: new_name = each.replace(self.data['text_mask'], self.data['text_fake']) path_src = self.data['path_src'] + '/' + each path_dec = self.data['path_dec'] + '/' + new_name path_src = path_src.replace('/', '\\\\') path_dec = path_dec.replace('/', '\\\\') print(path_src) order = 'copy "%s" "%s"' % (path_src, path_dec) os.system(order) print(order) self.listWidget_dec_files.addItem(new_name) count += 1 self.label_path_dec.setText( '%s %d个' % (Utils.getSubStr(self.data['path_dec']), count)) except Exception as e: print(e) finally: pass