Python学习笔记(三)

Python学习笔记(三)

Python学习笔记(二)

结果显示

通过之前的操作,我们得到了要显示的数据。实际数据显示我们使用的pyecharts这个库。关于这个库的使用,推荐大家到官网上去查看Echarts官网。安装方面参考第一篇笔记。
这里用一个例子简单入门一下。

def DrawGraph_Pay2Numofpeope(self):
    # Create Data
    XList,YList = self.hrData.GetData_Pay2NumOfPeople()
    # Make Graph
    self.barPay2Numofpeope = Bar(init_opts=opts.InitOpts(
        theme=ThemeType.LIGHT,
        page_title="工资-人数分布图",
        js_host=self.javascript_hostpaht))
    # Add Data
    self.barPay2Numofpeope.add_xaxis(XList)
    self.barPay2Numofpeope.add_yaxis("人数",YList)
    # Set Format
    self.barPay2Numofpeope.set_global_opts(
        title_opts=opts.TitleOpts(title="工资-人数分布图", subtitle=self.searchCondtionStr),
        toolbox_opts=opts.ToolboxOpts())
    # Create Graph File
    self.barPay2Numofpeope.render(self.searchResultHTMLFilePath+"Pay2Numofpeope.html")
    # Show it with Qt
    self.showObjPay2Numofpeope = QWebEngineView()
    self.DrawGraph_ShowResult(self.showObjPay2Numofpeope,
                              "工资-人数分布图",
                              self.searchResultHTMLFilePath+"Pay2Numofpeope.html")

这个例子实现了工资-人数的柱状图。
实现结果如下
在这里插入图片描述

XList,YList = self.hrData.GetData_Pay2NumOfPeople()

和之前介绍的一样,利用Pandas库,返回了工资列表(XList)和人数列表(YList)。

self.barPay2Numofpeope = Bar(init_opts=opts.InitOpts(
    theme=ThemeType.LIGHT,
    page_title="工资-人数分布图",
    js_host=self.javascript_hostpaht))

这里面要重地说的是js_host=self.javascript_hostpaht。其余内容可以自行查看官网的说明。
pyecharts其实是利用了javascripts来实现图表的渲染的。但是这个javascripts并没有随着pyecharts的安装一起安装在本地。默认的是需要联网访问一个网址来获取相应的js文件的。
但是我们好多时候机器并不能访问网络。如果我们想脱机使用pyecharts的话,就需要从自己下载js文件。
并且通过js_host这个参数指定js文件的路径(路径就可以,不用加上文件名称)。
要下载的js文件名称是echarts.min.js
可以通过下面地址进行下载echarts.min.js
在这里插入图片描述
点击Scatter和其他图表的标志,尽可能都选上(当然也可以只选你自己用到的图表)。然后点击最下面的下载按钮
在这里插入图片描述
然后就是
在这里插入图片描述
等Build完成后,就会开始下载echarts.min.js这个文件了。
这个文件理论上放在任何地方都可以,但是为了在别人PC也能运行我们的程序,我再venv下面建了一个UIResource的文件夹,把echarts.min.js这个文件放在下面了。
当然这个路径也有设定到js_host这个参数当中。但是要注意的是路径的写法需要用URL的形式,由于使用的是Qt的界面,所以直接用Qt的QUrl.fromLocalFile(os.getcwd()+"\…\UIResource\").toString()来获得相应的URL形式的路径。

关于pyecharts的其他操作还是看官网吧。生成的结果是HTML文件的形式(如果不进行上面的处理,在脱机的时候,浏览器也无法正常打开HTML文件)

最后,为了把生成的HTML文件再Qt当中显示出来,我们要用到QWebEngineView这个控件。pyqt5当中似乎没有这个控件,这也是最终使我切换到pyside2的原因(也可能是我没用好pyqt5)。
这个控件的使用请参考如下代码

	...
	self.showObjPay2Numofpeope = QWebEngineView()
	self.DrawGraph_ShowResult(self.showObjPay2Numofpeope,
                          "工资-人数分布图",
                          self.searchResultHTMLFilePath+"Pay2Numofpeope.html")

def DrawGraph_ShowResult(self,showObject,titelStr,filePath):
    showObject.resize(950, 550)
    font = QtGui.QFont()
    font.setFamily("Microsoft YaHei UI")
    showObject.setFont(font)
    icon = QtGui.QIcon()
    icon.addPixmap(QtGui.QPixmap("../UIResource/RenCai.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
    showObject.setWindowIcon(icon)
    showObject.load(QUrl.fromLocalFile(filePath))
    showObject.setWindowTitle(titelStr)
    showObject.show()

最有用的就是showObject.load(QUrl.fromLocalFile(filePath)),这句话会加载HTML文件。

做成EXE文件

使用pyinstaller来做成EXE文件
网上大部分的例子都是 pyinstaller python.py 的方式来介绍的。但是这种方式对应复杂一些的项目并不适用。但是对我们还是很有用的。
在pyinstaller XXXX.py 的过程中会生成一个XXXX.spec的文件。
生成文件大家可以自己打开看一下,下面是我改造后的

# -*- mode: python ; coding: utf-8 -*-
PYFileList=['..\\PySrc\\HRDataProcess.py', '..\\PySrc\\HRJudge.py', '..\\PySrc\\HRToolGuiProcess.py', '..\\PySrc\\LogChgTool.py']
ReleasePathExe=['C:\\Users\\PythonLearn\\venv\\Release']
LIBToImport=['pyecharts', 'PySide2', 'pandas', 'numpy']
ReleaseExeName='RecruitmentTool'

block_cipher = None
a = Analysis(PYFileList,
             pathex=ReleasePathExe,
             binaries=[],
             datas=[],
             hiddenimports=LIBToImport,
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          [],
          exclude_binaries=True,
          name=ReleaseExeName,
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=False )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name=ReleaseExeName)

PYFileList当中就是我们要解析的全部Py文件列表
ReleasePathExe是我们要生成的EXE所在的文件路径
LIBToImport是我们明确需要包含的Python库的名字,这个可以省略,pyinstaller会自己分析并查找需要的库,但是有时候会有遗漏,所以还是的写出来。
ReleaseExeName这个就是我们生成的EXE文件名称

这里需要说明的是,pyinstaller做成的EXE运行的时候可能会出现各种问题,为了能发现出现问题的问题信息,我们需要将上面的console=False改为console=True

正常生成的EXE文件会在[ReleasePathExe]路径下的dist文件夹下。同时在[ReleasePathExe]路径下还会生成一个build文件夹,这个文件夹据说是编译用的中间产物,没什么用。

我们实际使用的过程当中难免要反复生成EXE文件,为了保证每次生成前的环境一直,我使用了下面的Python命令做了一些环境清理的准备

if os.path.isdir(".\\dist"):
    shutil.rmtree(".\\dist",True)
    print("Delete the folder [.\\dist]")

if os.path.isdir(".\\build"):
    shutil.rmtree(".\\build",True)
    print("Delete the folder [.\\build]")

if os.path.isfile(".\\release.spec"):
    os.remove(".\\release.spec")

release.spec文件是我们真正要使用的文件,但是我们可能会增加python文件,所以我用下面的方法自动扫描全部的Python文件设定到spec文件当中去

LIBToImport=['pyecharts','PySide2','pandas','numpy']
PYFileList=[]
folderlist = os.listdir("..\\PySrc")
for file in folderlist:
    if file != "UIResource":
        if file.endswith(".py"):
            srcfilepath = os.path.join("..\\PySrc\\", file)
            PYFileList += [srcfilepath]
        folder = os.path.join("..\\PySrc", file)
        if os.path.isdir(folder) == True:
            allfilelist = os.listdir(folder)
            for pyfile in allfilelist:
                if pyfile.endswith(".py"):
                    pyfilepath = os.path.join(folder, pyfile)
                    PYFileList += [pyfilepath]

FileContents = "# -*- mode: python ; coding: utf-8 -*-"
FileContents += "\nPYFileList=%s" % (PYFileList)
FileContents += "\nReleasePathExe=%s" % ([os.getcwd()])
FileContents += "\nLIBToImport=%s" % (LIBToImport)
FileContents += "\nReleaseExeName='%s'" % (ReleaseExeName)
FileContents += "\n\n"

然后将FileContents写入事前准备好的default.spec的开头

with open(".\\py\\default.spec","r") as defaultSpecFile:
    FileContents += defaultSpecFile.read()
    defaultSpecFile.close()

with open(".\\release.spec","w") as SpecFile:
    SpecFile.write(FileContents)
    SpecFile.close()

然后通过如下命令就可以生成EXE文件了

os.system("pyinstaller -F release.spec")

但是这样运行完生成的EXE文件有 很多问题
1.由于Python文件本身有文件夹结构,生成的EXE文件路径下本身没有这些Python文件以及相关文件夹,所以运行时会出错(找不到XXX.py文件之类的错误)
一种方法是把相关的原Python文件连带文件夹一起拷贝到dist下面的EXE所在文件夹
另一种,是生成EXE之前,取消掉所有Python文件的文件夹结构,都在一个文件夹下面。
这两种方法都有弊端,本人还没有找到一个好一点的方法。
2.运行的EXE可能会报告一些找不到某些使用Python库的错误。这是因为使用的Python库的dll文件没有被pyinstaller拷贝到dist下面的EXE所在文件夹.
解决办法就是,自己手动拷贝
一般来说,我们需要的库都在XXXProject\venv\Lib\site-packages\下面,可以按需拷贝
3.如果Python的程序当中引用了一下资源文件,比如图标,数据文件等等。那么这些文件pyinstaller也不会拷贝到dist下面的EXE所在文件夹,需要我们自己手动按照Python原文件工程的文件夹结构将这些资源文件拷贝过去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值