栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

自制一个生成二维码的小应用,包含Qt5,sys.argv,qrcode,正则表达式应用,以及打包 pyinstaller

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自制一个生成二维码的小应用,包含Qt5,sys.argv,qrcode,正则表达式应用,以及打包 pyinstaller

给学生上课展示了下 qrcode 的二维码制作,索性打包一下做成一个可以用的小程序,来记录一下。

网上关于 QrCode 的应用比较多,也很丰富,为了节省篇幅,这里就只添加基本功能,主要是为了展示下从普通的 python 代码到窗体交互到打包 exe 的一个过程,用的也都是简单库调用,主要是为新手体验一下整个过程。

首先我们把制作二维码的代码写出来,比较简单,就是调用 qrcode 库,使用 make 方法生成二维码。由于要保存为 png 文件,加入了 PIL 库

import PIL
import qrcode
img = qrcode.make('https://blog.csdn.net/xinquan01?type=blog')
img.save("website.png")

上面的代码只能生成固定的网址内容,而且只能本地调用。如果我们要做成一个带交互的小程序,让用户可以在窗口上输入网址来生成使用者制定的二维码,则需要把 make 函数内的地址改成用户在窗口上输入的地址,因此我们需要先制作一个窗体,加入文本框,将文本框中的参数传递到 make 函数中来。我们使用 PyQt5 库来创建这个窗体。这里我们只做一个最简单的界面,就是一个窗体,里边有一行文本框可以输入地址,加一个确定按钮。用户打开程序之后,在文本框中输入自己的网址,点确定,就在默认目录下生成了二维码图片。因此,我们需要导入 Qt5 里的窗体应用,加一个文本框和一个确定按钮。Qt5 的窗体都是事件驱动的,因此需要导入一个 application 应用来初始化窗体和接受触发事件。下面的代码创建了一个继承父类 QWidget 属性的窗体,里边有一个文本框和一个按钮。使用 move 方法来调整控件的位置,并且给窗体一个 title,使用 show 方法显示窗体。

import sys
from PyQt5.QtWidgets import QApplication, QWidget,QPushButton, QLineEdit

class WebQr(QWidget):

    def __init__(self):
        super().__init__()
        self.setting()

    def setting(self):

        self.web = QLineEdit(self)
        self.web.move(15,50)

        self.yes = QPushButton('确定',self)
        self.yes.move(220,50)

        self.setGeometry(300, 300, 500, 100)
        self.setWindowTitle('制作你自己网站的二维码')
        self.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    Ex = WebQr()
    sys.exit(app.exec_())

这里着重说一下 sys.argv 这个参数的问题。官网上的说法是可以导入命令行参数,很多同学在网上找资料的时候也只是简单复制官网说明,实际上对此如何应用还是不太理解。我们举个例子来说明这个参数的使用。括弧中本来应该是 QApplication 这个方法的参数,按照官网说明,这个参数可以是以数组的形式存在,例如我们可以使用 style 参数来改变窗体的风格,就可以在括弧中指定 style 参数的值为 windowsxp 或者 windowsvista 等,不指定的话就是默认值。但是这种方式使得我的代码只能使用一个固定风格参数,我们希望在命令行调用文件时再指定风格,就可以把QApplication 方法的参数设定为命令行中的参数,也就是我们说的 sys.argv,然后在命令行调用时再指定具体的方法参数,sys.argv 就会把命令行的参数传递过来了。我们可以在命令行中输入以下代码,就指定了窗体的风格,这个风格参数就可以传递到 QApplication 中。

python filename.py -style=windowsxp

上面的窗体设置代码只是画好了一个框架,如何把文本框的内容和二维码的生成代码结合起来,我们可以使用 connect 方法。我们指定,当对“确认”按钮进行点击操作时,触发生成二维码的函数 coding_,并将之前文本框的内容传递到 coding_ 中。由于这个二维码函数里 make 方法的内容是由用户输入的,我们无法判断是否是标准的网址链接格式(如果不是 http 开头的字符串,生成二维码扫码时无法自动识别为网址,而只会显示字符串的内容),所以我们需要对用户输入的内容进行判断,如果是没有 http 开头的字符串,我们需要加上 https://,因此我们需要导入 re 正则表达式。同样的,我们可以在用户输入的网址最后添加 “/” 来作为网址的结束

self.yes = QPushButton('确定',self)
self.yes.clicked.connect(self.coding_)
    import re

    def coding_(self):
        codetext = self.web.text()
        url = re.findall(r"http",codetext)
        if url == []:
            url = 'https://' + codetext
        else:
            url = codetext
        url1 = re.findall(r".", codetext)
        if url1[-1] != '/':
            url = url + "/"      
        savepath = ".\img\mywebsite"
        img = qrcode.make(url)
        img.save(savepath + ".png")

这里我们增加了一个存储路径,生成的图片存储在 img 目录下。如果我们希望每次存储的图片文件名根据用户输入的网址发生变化,我们可以增加一个 filename 变量来指定文件名。这里需要注意的是如果用户输入的网址里有 “?”或者其他非法字符的话,在进行文件存储时会报错,所以我们只截取网址的主域名作为文件名

        filename = re.findall(r'//(.*?)/', url)[0]
        savepath = ".\img\" + filename

这里我们截取 url 中 “//” 之后到 “/” 之间的内容作为文件名。需要注意的是,这种方法截取文件名是建立在前面构建网址 url 没有错误的情况下,如果之前用户输入了错误的地址,比如说输入了两个 https://,或者是在输入了两个冒号,等等,则会使得截取的文件名中可能还会存在非法字符,就会在保存文件是报错。如果打包成 exe 文件的话就会有闪退现象。

到此,我们的所有代码已经完成,完整代码如下

import sys
import re
import PIL
import qrcode
from PyQt5.QtWidgets import QApplication, QWidget,QPushButton, QLineEdit

class WebQr(QWidget):

    def __init__(self):
        super().__init__()
        self.setting()

    def setting(self):

        self.web = QLineEdit(self)
        self.web.setPlaceholderText('输入你的网址')
        self.web.move(15,50)

        self.yes = QPushButton('确定',self)
        self.yes.clicked.connect(self.coding_)
        self.yes.move(220,50)

        self.setGeometry(300, 100, 520, 100)
        self.setWindowTitle('制作你自己网站的二维码')
        self.show()

    def coding_(self):
        codetext = self.web.text()
        url = re.findall(r"http",codetext)
        if url == []:
            url = 'https://' + codetext
        else:
            url = codetext
        url1 = re.findall(r".", codetext)
        if url1[-1] != '/':
            url = url + "/"
        filename = re.findall(r'//(.*?)/', url)[0]
        savepath = ".\img\" + filename
        img = qrcode.make(url)
        img.save(savepath + ".png")

if __name__ == '__main__':
    app = QApplication(sys.argv)
    Ex = WebQr()
    sys.exit(app.exec_())

完成的 python 文件只能在本地应用,如果我们需要给我们的朋友使用的话,可以使用 pyinstaller 把主文件和相应的库文件都一起打包,生成一个带 exe 文件的文件夹。当然,首先你得安装了 pyinstaller 库,直接使用 pip 就能安装。打包时可以选择不同的参数,这里我们选择生成单独 exe 文件,不显示命令行的方式

pyinstaller filename.py -F -w

打包之后会在目录下生成 build ,dist 两个文件夹,和一个 .spec 文件,我们只保留 dist 文件夹即可,其他的都可以删掉,可以把 exe 所在文件夹直接拷到任意地方使用,不过记得在该文件夹下新建一个 img 文件夹来存储图片

结束

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/950205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号