zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

Pyqt+QRcode 生成 识别 二维码

识别 生成 二维码 Pyqt Qrcode
2023-09-14 09:07:03 时间

1.生成二维码
python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳

一.python-qrcode介绍
python-qrcode是个用来生成二维码图片的第三方模块,依赖于 PIL 模块和 qrcode 库。

PIL下载地址:

https://pypi.python.org/pypi/PIL/1.1.6 或

http://www.pythonware.com/products/pil/

qrcode下载地址:

https://pypi.python.org/pypi/qrcode

安装:

1 python setup.py install 

简单用法

1 import qrcode 
2 img = qrcode.make('hello, qrcode')
3 img.save('test.png')

高级用法

import qrcode
qr = qrcode.QRCode(
    version=1,
    error_correction=qrcode.constants.ERROR_CORRECT_L,
    box_size=10,
    border=4,
)
qr.add_data('hello, qrcode')
qr.make(fit=True)
img = qr.make_image()
img.save('test.png')

参数说明:

version:值为1~40的整数,控制二维码的大小(最小值是1,是个12×12的矩阵)。 如果想让程序自动确定,将值设置为 None
并使用 fit 参数即可。

error_correction:控制二维码的错误纠正功能。可取值下列4个常量。
  ERROR_CORRECT_L:大约7%或更少的错误能被纠正。
  ERROR_CORRECT_M(默认):大约15%或更少的错误能被纠正。
  ROR_CORRECT_H:大约30%或更少的错误能被纠正。

box_size:控制二维码中每个小格子包含的像素数。

border:控制边框(二维码与图片边界的距离)包含的格子数(默认为4,是相关标准规定的最小值)

二. 打壳
做一个Ui转换为Py文件, import qrcode 后就可以生成二维码了

完整代码如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'Qrcode.ui'
#
# Created: Thu Jan 22 09:32:41 2015
#      by: PyQt4 UI code generator 4.10.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_qrcode(object):
    def setupUi(self, qrcode):
        qrcode.setObjectName(_fromUtf8("qrcode"))
        qrcode.setEnabled(True)
        qrcode.resize(515, 424)
        self.groupBoxshow = QtGui.QGroupBox(qrcode)
        self.groupBoxshow.setGeometry(QtCore.QRect(50, 120, 431, 281))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBoxshow.sizePolicy().hasHeightForWidth())
        self.groupBoxshow.setSizePolicy(sizePolicy)
        self.groupBoxshow.setMinimumSize(QtCore.QSize(0, 0))
        self.groupBoxshow.setAutoFillBackground(True)
        self.groupBoxshow.setCheckable(False)
        self.groupBoxshow.setObjectName(_fromUtf8("groupBoxshow"))
        self.label = QtGui.QLabel(self.groupBoxshow)
        self.label.setGeometry(QtCore.QRect(10, 20, 401, 241))
        self.label.setText(_fromUtf8(""))
        self.label.setObjectName(_fromUtf8("label"))
        self.groupBox = QtGui.QGroupBox(qrcode)
        self.groupBox.setGeometry(QtCore.QRect(50, 20, 431, 91))
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.horizontalLayoutWidget = QtGui.QWidget(self.groupBox)
        self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 401, 80))
        self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget"))
        self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget)
        self.horizontalLayout.setMargin(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.label_url = QtGui.QLabel(self.horizontalLayoutWidget)
        self.label_url.setObjectName(_fromUtf8("label_url"))
        self.horizontalLayout.addWidget(self.label_url)
        self.lineEditInput = QtGui.QLineEdit(self.horizontalLayoutWidget)
        self.lineEditInput.setObjectName(_fromUtf8("lineEditInput"))
        self.horizontalLayout.addWidget(self.lineEditInput)
        self.pushButtonOk = QtGui.QPushButton(self.horizontalLayoutWidget)
        self.pushButtonOk.setObjectName(_fromUtf8("pushButtonOk"))
        self.horizontalLayout.addWidget(self.pushButtonOk)

        self.retranslateUi(qrcode)
        QtCore.QMetaObject.connectSlotsByName(qrcode)

    def retranslateUi(self, qrcode):
        qrcode.setWindowTitle(_translate("qrcode", "Pyqt Qrcode", None))
        self.groupBoxshow.setTitle(_translate("qrcode", "二维码显示", None))
        self.groupBox.setTitle(_translate("qrcode", "填写二维码内容", None))
        self.label_url.setText(_translate("qrcode", "URL地址:", None))
        self.pushButtonOk.setText(_translate("qrcode", "生成二维码", None))


import qrcode
class showQr(QtGui.QWidget):
    def __init__(self):
        super(showQr, self).__init__()
        self.ui_qr = Ui_qrcode()
        self.ui_qr.setupUi(self)
        # PyQT禁止窗口最大化按钮:
        self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
        # PyQT禁止调整窗口大小:
        self.setFixedSize(self.width(), self.height())

        # 触发信号槽
        QtGui.QWidget.connect(self.ui_qr.pushButtonOk, QtCore.SIGNAL('clicked()'), self.generateQr)
        # self.ui_qr.pushButtonOk.clicked.connect(self.generateQr)

    def generateQr(self):
        textcontent=self.ui_qr.lineEditInput.text()
        if textcontent=='':
            QtGui.QMessageBox.information(self, (u'提示'),(u'请填写URL地址'),QtGui.QMessageBox.Yes)
        else:
            filename='Qrcode.png'
            qr = qrcode.QRCode(
                version=None,
                error_correction=qrcode.constants.ERROR_CORRECT_L,
                box_size=5,
                border=4,
            )
            qr.add_data(textcontent)
            qr.make(fit=True)
            img = qr.make_image()
            img.save(filename)
            # img = qrcode.make(textcontent)
            # img.save(filename)
            self.ui_qr.label.setPixmap(QtGui.QPixmap(filename))



     # 重载keyPressEvent ,  当按下Esc退出
    def keyPressEvent(self, event):
        if event.key() ==QtCore.Qt.Key_Escape:
            self.close()


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    qr = showQr()
    qr.show()
    sys.exit(app.exec_())

运行效果:

在这里插入图片描述
在这里插入图片描述
2.识别二维码
解析二维码用到zbar模块

扯蛋的zbar 在Pypi中只有py25 和py26 版本,更新时间还是2009年, 下载后py27还用不了!

最后在github 中找到支持Py27的zbar库

地址: https://github.com/jacobvalenta/zbar-py27-msi

one_qr_code.png
在这里插入图片描述
代码:

from PIL import Image
import zbar

def get_QR():
    scanner = zbar.ImageScanner()
    scanner.parse_config("enable")
    pil = Image.open("one_qr_code.png").convert('L')
    width, height = pil.size
    raw = pil.tostring()
    image = zbar.Image(width, height, 'Y800', raw)
    scanner.scan(image)
    data = ''
    for symbol in image:
        data+=symbol.data
    del(image)
    return data

qrdata= get_QR()
print(qrdata)

返回解析结果:

http://weixin.qq.com/r/n0zE3NfEaooVrZO-9xmN