Python+PyQt:30行代码实现二维码自由
目录
一、引言
二维码技术已深度渗透现代生活场景,从社交连接到移动支付,从营销活动到信息传递,这种黑白方块矩阵无处不在。您是否考虑过自主创建个性化二维码?无需依赖第三方平台,本地化工具即可实现链接共享、联系人交换甚至加密消息传递,让数据流转更高效安全。
二、GUI界面设计
使用PyQt5进行界面的搭建,最终界面如下:

1.第一步:输入要显示的内容

直接在文本框中输入/粘贴即可(文字输入越多,生成的二维码越为复杂)。
2.第二步:点击开始生成

弹出“生成成功”的提示框,并在右侧出现对应的二维码样式。
3.第三步:直接保存至本地
若有需求,可直接点击“图片另存为”,将其保存至当前目录下。

4.异常提示
若未在文本框中键入内容,直接点击“开始生成”,则会出现以下的异常提示。

5.界面设计jiemian.py
最后附上通过pyuic5产生的GUI界面代码jiemian.py:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'jiemian.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.setEnabled(True)
Form.resize(550, 500)
Form.setMinimumSize(QtCore.QSize(550, 500))
Form.setMaximumSize(QtCore.QSize(550, 500))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
Form.setWindowIcon(icon)
Form.setToolTipDuration(-1)
self.label_5 = QtWidgets.QLabel(Form)
self.label_5.setGeometry(QtCore.QRect(360, 70, 141, 31))
font = QtGui.QFont()
font.setFamily("Adobe Arabic")
font.setPointSize(16)
self.label_5.setFont(font)
self.label_5.setObjectName("label_5")
self.label_8 = QtWidgets.QLabel(Form)
self.label_8.setGeometry(QtCore.QRect(170, 20, 231, 31))
font = QtGui.QFont()
font.setFamily("Adobe Arabic")
font.setPointSize(18)
font.setBold(False)
font.setWeight(50)
self.label_8.setFont(font)
self.label_8.setObjectName("label_8")
self.label_10 = QtWidgets.QLabel(Form)
self.label_10.setGeometry(QtCore.QRect(440, 60, 71, 51))
self.label_10.setText("")
self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
self.label_10.setObjectName("label_10")
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(350, 180, 131, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.label_4 = QtWidgets.QLabel(Form)
self.label_4.setGeometry(QtCore.QRect(140, 280, 161, 16))
self.label_4.setObjectName("label_4")
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(140, 180, 131, 23))
self.pushButton.setObjectName("pushButton")
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(80, 150, 271, 16))
self.label.setObjectName("label")
self.lineEdit_3 = QtWidgets.QLineEdit(Form)
self.lineEdit_3.setGeometry(QtCore.QRect(340, 360, 113, 20))
self.lineEdit_3.setObjectName("lineEdit_3")
self.lineEdit = QtWidgets.QLineEdit(Form)
self.lineEdit.setGeometry(QtCore.QRect(340, 280, 111, 20))
self.lineEdit.setObjectName("lineEdit")
self.pushButton_3 = QtWidgets.QPushButton(Form)
self.pushButton_3.setGeometry(QtCore.QRect(80, 430, 401, 23))
self.pushButton_3.setObjectName("pushButton_3")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(290, 150, 141, 16))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(Form)
self.lineEdit_2.setGeometry(QtCore.QRect(340, 320, 113, 20))
self.lineEdit_2.setObjectName("lineEdit_2")
self.label_6 = QtWidgets.QLabel(Form)
self.label_6.setGeometry(QtCore.QRect(140, 320, 181, 16))
self.label_6.setObjectName("label_6")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(80, 230, 141, 16))
self.label_3.setObjectName("label_3")
self.label_7 = QtWidgets.QLabel(Form)
self.label_7.setGeometry(QtCore.QRect(140, 360, 161, 16))
self.label_7.setObjectName("label_7")
self.label_9 = QtWidgets.QLabel(Form)
self.label_9.setGeometry(QtCore.QRect(50, 120, 461, 351))
self.label_9.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_9.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label_9.setLineWidth(1)
self.label_9.setMidLineWidth(1)
self.label_9.setText("")
self.label_9.setObjectName("label_9")
self.label_11 = QtWidgets.QLabel(Form)
self.label_11.setGeometry(QtCore.QRect(120, 270, 351, 121))
self.label_11.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.label_11.setFrameShadow(QtWidgets.QFrame.Sunken)
self.label_11.setLineWidth(1)
self.label_11.setMidLineWidth(1)
self.label_11.setText("")
self.label_11.setObjectName("label_11")
self.label_9.raise_()
self.label_11.raise_()
self.label_5.raise_()
self.label_8.raise_()
self.label_10.raise_()
self.pushButton_2.raise_()
self.label_4.raise_()
self.pushButton.raise_()
self.label.raise_()
self.lineEdit_3.raise_()
self.lineEdit.raise_()
self.pushButton_3.raise_()
self.label_2.raise_()
self.lineEdit_2.raise_()
self.label_6.raise_()
self.label_3.raise_()
self.label_7.raise_()
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Exam_arrangement"))
self.label_5.setText(_translate("Form", "Designed By"))
self.label_8.setText(_translate("Form", "考试随机编排系统"))
self.pushButton_2.setText(_translate("Form", "点击上传"))
self.label_4.setText(_translate("Form", "请输入考号前缀(如20251):"))
self.pushButton.setText(_translate("Form", "点击下载"))
self.label.setText(_translate("Form", "一、请下载学生信息模板"))
self.pushButton_3.setText(_translate("Form", "开始编排"))
self.label_2.setText(_translate("Form", "二、请上传学生信息模板"))
self.label_6.setText(_translate("Form", "请输入每个考场的人数(偶数):"))
self.label_3.setText(_translate("Form", "三、请输入编排信息"))
self.label_7.setText(_translate("Form", "请输入首考场号(1-N均可):"))
import ziyuan_rc
三、主要程序详解
1.导入所需模块
import sys
import qrcode
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
from PyQt5.QtGui import QPixmap
二维码最常用且权威的表达是“QR Code”(全称Quick Response Code),其中“QR”代表“Quick Response”(快速响应),体现其高速识读特性。在导入qrcode之前,需要通过pip指令安装qrcode。
pip install qrcode
不懂为啥需要导入Qtcore的,请看一键曝光:Python+PyQt实现的文件目录透视镜。
QPixmap用于在label上显示图片。
2.初始化设置
class mainwindow(QWidget, Ui_Form):
def __init__(self):
super(QWidget, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.shengcheng)
self.pushButton_2.clicked.connect(self.saveQR)
继承于父类QWidget,并显示主界面;将pushbutton绑定于shengcheng;将pushbutton_2绑定于saveQR。
3.生成对应二维码
def shengcheng(self):
# 创建二维码配置对象
qr = qrcode.QRCode(version=3, box_size=8, border=4)
# version=3:二维码尺寸版本 (1-40),3对应29x29模块(自动适配时可省略)
# box_size=8:每个二维码小方块占8像素
# border=4:二维码边缘留白宽度(4个小方块宽度的白色边框)
neirong = self.textEdit.toPlainText()
if neirong != "":
# 添加数据
qr.add_data(self.textEdit.toPlainText())
# 生成数据矩阵
qr.make(fit=True)# fit=True:自动选择最小可用版本尺寸;若数据过长会自动升级 version 值(覆盖初始设置的version=3)
# 渲染图像
self.image = qr.make_image(fill='Black')
# 显示图像
self.image.save('qr_code.jpg')
pixmap = QPixmap('qr_code.jpg')
self.label_2.setPixmap(pixmap)
self.label_2.setScaledContents(True) # 图片自动适应label大小
QtWidgets.QMessageBox.information(self, "成功", "生成成功,效果如右图所示!")
else:
QtWidgets.QMessageBox.critical(self, "提示", "请输入显示内容!")
从二维码尺寸、二维码像素分布以及二维码留白空隙这三个方面创建二维码;读取textedit中的内容,若为空,则弹出“请输入”的提示,否则根据textedit内容生成数据矩阵;在渲染图像中,还可通过back_color设置二维码的背景颜色,这里默认为白色;最后将生成的二维码图像显示在右侧的label中。
4.保存二维码至本地
def saveQR(self):
QtWidgets.QMessageBox.information(self, "成功", "二维码保存在当前目录下,请查看!")
其实在上一步中,已经将二维码图片以qr_code.jpg为文件名保存在当前目录下了,这里只是友好提示。因为QPixmap需要作用的对象是图片类型,为了让其正常显示在右侧,所以将其先保存下来,然后再从本地读取已保存的图像,最终实现显示的效果。总体思路与实际操作相反,但为了实现显示效果,出此下策,若有好的想法,欢迎留言/私信/评论提点。
四、总程序代码QRCode.py
import sys
import qrcode
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
from PyQt5.QtGui import QPixmap
class mainwindow(QWidget, Ui_Form):
def __init__(self):
super(QWidget, self).__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.shengcheng)
self.pushButton_2.clicked.connect(self.saveQR)
def shengcheng(self):
# 创建二维码配置对象
qr = qrcode.QRCode(version=3, box_size=8, border=4)
# version=3:二维码尺寸版本 (1-40),3对应29x29模块(自动适配时可省略)
# box_size=8:每个二维码小方块占8像素
# border=4:二维码边缘留白宽度(4个小方块宽度的白色边框)
neirong = self.textEdit.toPlainText()
if neirong != "":
# 添加数据
qr.add_data(self.textEdit.toPlainText())
# 生成数据矩阵
qr.make(fit=True)# fit=True:自动选择最小可用版本尺寸;若数据过长会自动升级 version 值(覆盖初始设置的version=3)
# 渲染图像
self.image = qr.make_image(fill='Black')
# 显示图像
self.image.save('qr_code.jpg')
pixmap = QPixmap('qr_code.jpg')
self.label_2.setPixmap(pixmap)
self.label_2.setScaledContents(True) # 图片自动适应label大小
QtWidgets.QMessageBox.information(self, "成功", "生成成功,效果如右图所示!")
else:
QtWidgets.QMessageBox.critical(self, "提示", "请输入显示内容!")
def saveQR(self):
QtWidgets.QMessageBox.information(self, "成功", "二维码保存在当前目录下,请查看!")
if __name__ == '__main__':
app = QApplication(sys.argv)
w = mainwindow()
w.show()
sys.exit(app.exec_())
五、效果演示
“Hello,World”生成的二维码效果如下。
说明:
在使用微信扫码的时候,有时会出现“微信暂不支持展示二维码中的文本内容”的提示,是由于微信自2023年起调整规则,限制扫描纯文本静态二维码(尤其是含中文内容),防止恶意内容或敏感信息直接暴露造成的。而使用其他扫码工具(如支付宝、QuickMark等)可避免此问题。当然,也可通过“临时查看文本内容”来解决,微信提示页面下方提供“复制文本内容”选项,粘贴后可查看二维码隐藏内容。

欢迎留言/私信沟通交流!
更多推荐
所有评论(0)