前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python做个界面小工具这么简单,你确定不学一下!

Python做个界面小工具这么简单,你确定不学一下!

作者头像
DataCharm
发布2021-02-22 15:19:44
1.6K0
发布2021-02-22 15:19:44
举报
文章被收录于专栏:数据 学术 商业 新闻

对于一些常用的 Python 脚本,如果我们想把它打包给其他人使用,不用安装Python环境而直接使用。这时候就涉及到界面编程,让普通用户也能用上是多么酷的事情。本次利用Qt Desiger工具可视化设计做了一个word转pf的小工具,手把手教你完成一个具有完整项目结构的小项目,接下来你也可以根据需要给自己的小脚本添加拓展界面啦!

还增加了一个简单的计价功能,当然,在此基础上可以拓展字数统计、加水印等功能,也可以把Microsoft Word中PDF工具功能一一实现。

1、开发工具配置

1、安装独立的项目环境,全局环境存在版本冲突,不方便项目迁移;且打包可减少不必要的模块,需要创建虚拟环境隔离。

2、pipenv工具可以创建虚拟环境并且将需要的插件模块版本记录下来

3、安装pipenv工具:pip install pipenv;本次项目需要准备安装的包有:PyQt5、pyqt5-tools、pywin32、PyPDF2。

2、创建项目目录

代码语言:javascript
复制
1)、创建目录
mkdir myProjectfile (linux、window通用,当然也可以手动建一个文件夹命名)
2)进入目录
cd myProjectfile (也可以直接打开建立的文件夹路径cmd命令进入)
3)配置虚拟环境路径
linux: export PIPENV_VENV_IN_PROJECT=1
window: set PIPENV_VENV_IN_PROJECT=1 (注意项目不能在C盘,如果此处没有设置,默认虚拟环境路径在C盘下)
4)创建虚拟环境
pipenv install 
5)激化环境
pipenv shell
6)安装需要的包
pipenv install PyQt5/pyqt5-tools/pywin32/PyPDF2

3、项目文件夹结构

项目组织设计采用UI界面和逻辑代码分离的结构。

一、窗体可视化设计

本次主要设计实现一个子窗体word转pdf的代码实现。先设计好可视化操作界面,直接在QT designer中进行可视化界面设计主窗体文件和Word转PDF窗体文件,保存在ui界面文件夹中,然后利用pyuic5转化为可视化界面的py文件,将其拷贝上一级目录,如有修改记得覆盖更新。具体uic.bat脚本内容如下:

代码语言:javascript
复制
pyuic5 -o ui_mainWindow.py  mainWindow.ui
pyuic5 -o ui_transformWindow.py  transformWindow.ui

二、功能模块的编写

本次在项目子目录tools中自定义封装三个模块:1、common模块,完成文件夹路径读取相关操作,同时可对文件排序规则定义;2、wordtopdf模块,主要将word批量转换为pdf,并移动到指定目标路径;3、mergepdf模块,主要实现多个pdf文件合并,同时统计页码

common模块部分代码
代码语言:javascript
复制
def all_path(dirname):
    result = []
    for maindir, subdir, file_name_list in os.walk(dirname):
        for filename in file_name_list:
            apath = os.path.join(maindir, filename)
            result.append(apath)
    return result

def GetExtNamesList(fileslist,ext):
    filenames=[]
    for file in fileslist:
        fileinfo=os.path.splitext(file)
        if fileinfo[1]==ext:
            filenames.append(file)
    return filenames
代码语言:javascript
复制
wordtopdf模块代码
from win32com.client import Dispatch  # 导入pywin32模块的client包下的函数
import os,shutil
import tools.common as common

def doc2pdf(input_file):
    word = Dispatch('Word.Application')
    doc = word.Documents.Open(input_file)
    if input_file.endswith(".docx"):
        doc.SaveAs(input_file.replace(".docx", ".pdf"), FileFormat=17)
        doc.Close()
        word.Quit()
    else:
        doc.SaveAs(input_file.replace(".doc", ".pdf"), FileFormat=17)
        doc.Close()
        word.Quit()
    return

def pdfmove(path,targetpath):

    filelist=common.GetExtNamesList(common.all_path(path),'.pdf')

    for file in filelist:

        targetname=file.replace('\\','/').replace(targetpath,path)

        if not os.path.exists(os.path.dirname(targetpath)):
            os.makedirs(os.path.dirname(targetpath))
        if os.path.exists(targetname):
            shutil.move(file,targetpath)
    return


def wordtopdf(filelist,targetpath):
    valueList = []
    try:
        for fullfilename in filelist:

            temp = fullfilename.split('\\')
            path = temp[0]
            print("路径",path)

            filename = temp[1]
            os.chdir(path)
            doc = os.path.abspath(filename)
            os.chdir(targetpath)
            pdf_name = doc.split(".")[0] + ".pdf"
            valueList.append("{0}".format(pdf_name))
            input_file = fullfilename.replace('\\', '/')
            doc2pdf(input_file)
            pdfmove(path, targetpath)
        return valueList
    except TypeError as e:
        print('出错了!')
        print(e)
        return -1
mergepdf模块
代码语言:javascript
复制
import os, sys
from PyPDF2 import PdfFileReader, PdfFileMerger,PdfFileWriter
import tools.common as common


def MergePDF(targetpath, file_name="merge.pdf"):
    # 实例化写入对象
    output = PdfFileWriter()
    outputPages = 0

    value_List = []
    # 调用上一个函数获取全部文件的绝对路径
    file_list=common.GetExtNamesList(common.all_path(targetpath), '.pdf')

    if len(file_list) == 0:
        print("当前目录及子目录下不存在pdf文件")
        sys.exit()

    for pdf_file in file_list:
        print("文件:%s" % pdf_file.split('\\')[-1], end=' ')

        # 读取PDF文件
        input = PdfFileReader(open(pdf_file, "rb"))
        # 获得源PDF文件中页面总数
        pageCount = input.getNumPages()

        value_List.append([pdf_file, str(pageCount)])

        outputPages += pageCount
        print("页数:%d" % pageCount)
        # 分别将page添加到输出output中
        for iPage in range(pageCount):
            output.addPage(input.getPage(iPage))
    print("\n合并后的总页数:%d" % outputPages)
    # 写入到目标PDF文件
    print("PDF文件正在合并,请稍等......")
    with open(os.path.join(targetpath,"merge.pdf"), "wb") as outputfile:

        output.write(outputfile)
    print("PDF文件合并完成")
    return outputPages,value_List
代码语言:javascript
复制

三、进行槽函数和操作界面关联
点击界面触发信号,连接槽函数并调用我们编写好的功能函数(可参考往期转载的相关推文,可以去这几个优质公众号学习哦,
代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataCharm 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、窗体可视化设计
  • 二、功能模块的编写
    • 本次在项目子目录tools中自定义封装三个模块:1、common模块,完成文件夹路径读取相关操作,同时可对文件排序规则定义;2、wordtopdf模块,主要将word批量转换为pdf,并移动到指定目标路径;3、mergepdf模块,主要实现多个pdf文件合并,同时统计页码
      • common模块部分代码
      • mergepdf模块
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档