目录

一、引言

二、GUI界面设计

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

2.第二步:点击开始生成

3.第三步:直接保存至本地

4.异常提示

5.界面设计jiemian.py

三、主要程序详解

1.导入所需模块

2.初始化设置

3.生成对应二维码

4.保存二维码至本地

四、总程序代码QRCode.py

五、效果演示


一、引言

二维码技术已深度渗透现代生活场景,从社交连接到移动支付,从营销活动到信息传递,这种黑白方块矩阵无处不在。您是否考虑过自主创建个性化二维码?无需依赖第三方平台,本地化工具即可实现链接共享、联系人交换甚至加密消息传递,让数据流转更高效安全。

二、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等)可避免此问题。‌‌‌‌‌当然,也可通过“临时查看文本内容”来解决‌,微信提示页面下方提供“复制文本内容”选项,粘贴后可查看二维码隐藏内容。‌‌

欢迎留言/私信沟通交流!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐