python生成二維碼是件很簡單的事,使用第三方庫Python QRCode就可生成二維碼,我用Pyqt給QRcode打個殼python
python-qrcode是個用來生成二維碼圖片的第三方模塊,依賴於 PIL 模塊和 qrcode 庫。git
PIL下載地址:github
https://pypi.python.org/pypi/PIL/1.1.6 或app
http://www.pythonware.com/products/pil/ui
qrcode下載地址: this
https://pypi.python.org/pypi/qrcodeurl
安裝:spa
1 python setup.py install
簡單用法code
1 import qrcode 2 img = qrcode.make('hello, qrcode') 3 img.save('test.png')
高級用法orm
1 import qrcode 2 qr = qrcode.QRCode( 3 version=1, 4 error_correction=qrcode.constants.ERROR_CORRECT_L, 5 box_size=10, 6 border=4, 7 ) 8 qr.add_data('hello, qrcode') 9 qr.make(fit=True) 10 img = qr.make_image() 11 img.save('test.png')
參數說明:
version:值爲1~40的整數,控制二維碼的大小(最小值是1,是個12×12的矩陣)。 若是想讓程序自動肯定,將值設置爲 None 並使用 fit 參數便可。 error_correction:控制二維碼的錯誤糾正功能。可取值下列4個常量。 box_size:控制二維碼中每一個小格子包含的像素數。 border:控制邊框(二維碼與圖片邊界的距離)包含的格子數(默認爲4,是相關標準規定的最小值) |
作一個Ui轉換爲Py文件, import qrcode 後就能夠生成二維碼了
完整代碼以下:
1 # -*- coding: utf-8 -*- 2 3 # Form implementation generated from reading ui file 'Qrcode.ui' 4 # 5 # Created: Thu Jan 22 09:32:41 2015 6 # by: PyQt4 UI code generator 4.10.3 7 # 8 # WARNING! All changes made in this file will be lost! 9 10 from PyQt4 import QtCore, QtGui 11 12 try: 13 _fromUtf8 = QtCore.QString.fromUtf8 14 except AttributeError: 15 def _fromUtf8(s): 16 return s 17 18 try: 19 _encoding = QtGui.QApplication.UnicodeUTF8 20 def _translate(context, text, disambig): 21 return QtGui.QApplication.translate(context, text, disambig, _encoding) 22 except AttributeError: 23 def _translate(context, text, disambig): 24 return QtGui.QApplication.translate(context, text, disambig) 25 26 class Ui_qrcode(object): 27 def setupUi(self, qrcode): 28 qrcode.setObjectName(_fromUtf8("qrcode")) 29 qrcode.setEnabled(True) 30 qrcode.resize(515, 424) 31 self.groupBoxshow = QtGui.QGroupBox(qrcode) 32 self.groupBoxshow.setGeometry(QtCore.QRect(50, 120, 431, 281)) 33 sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) 34 sizePolicy.setHorizontalStretch(0) 35 sizePolicy.setVerticalStretch(0) 36 sizePolicy.setHeightForWidth(self.groupBoxshow.sizePolicy().hasHeightForWidth()) 37 self.groupBoxshow.setSizePolicy(sizePolicy) 38 self.groupBoxshow.setMinimumSize(QtCore.QSize(0, 0)) 39 self.groupBoxshow.setAutoFillBackground(True) 40 self.groupBoxshow.setCheckable(False) 41 self.groupBoxshow.setObjectName(_fromUtf8("groupBoxshow")) 42 self.label = QtGui.QLabel(self.groupBoxshow) 43 self.label.setGeometry(QtCore.QRect(10, 20, 401, 241)) 44 self.label.setText(_fromUtf8("")) 45 self.label.setObjectName(_fromUtf8("label")) 46 self.groupBox = QtGui.QGroupBox(qrcode) 47 self.groupBox.setGeometry(QtCore.QRect(50, 20, 431, 91)) 48 self.groupBox.setObjectName(_fromUtf8("groupBox")) 49 self.horizontalLayoutWidget = QtGui.QWidget(self.groupBox) 50 self.horizontalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 401, 80)) 51 self.horizontalLayoutWidget.setObjectName(_fromUtf8("horizontalLayoutWidget")) 52 self.horizontalLayout = QtGui.QHBoxLayout(self.horizontalLayoutWidget) 53 self.horizontalLayout.setMargin(0) 54 self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 55 self.label_url = QtGui.QLabel(self.horizontalLayoutWidget) 56 self.label_url.setObjectName(_fromUtf8("label_url")) 57 self.horizontalLayout.addWidget(self.label_url) 58 self.lineEditInput = QtGui.QLineEdit(self.horizontalLayoutWidget) 59 self.lineEditInput.setObjectName(_fromUtf8("lineEditInput")) 60 self.horizontalLayout.addWidget(self.lineEditInput) 61 self.pushButtonOk = QtGui.QPushButton(self.horizontalLayoutWidget) 62 self.pushButtonOk.setObjectName(_fromUtf8("pushButtonOk")) 63 self.horizontalLayout.addWidget(self.pushButtonOk) 64 65 self.retranslateUi(qrcode) 66 QtCore.QMetaObject.connectSlotsByName(qrcode) 67 68 def retranslateUi(self, qrcode): 69 qrcode.setWindowTitle(_translate("qrcode", "Pyqt Qrcode", None)) 70 self.groupBoxshow.setTitle(_translate("qrcode", "二維碼顯示", None)) 71 self.groupBox.setTitle(_translate("qrcode", "填寫二維碼內容", None)) 72 self.label_url.setText(_translate("qrcode", "URL地址:", None)) 73 self.pushButtonOk.setText(_translate("qrcode", "生成二維碼", None)) 74 75 76 import qrcode 77 class showQr(QtGui.QWidget): 78 def __init__(self): 79 super(showQr, self).__init__() 80 self.ui_qr = Ui_qrcode() 81 self.ui_qr.setupUi(self) 82 # PyQT禁止窗口最大化按鈕: 83 self.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint) 84 # PyQT禁止調整窗口大小: 85 self.setFixedSize(self.width(), self.height()) 86 87 # 觸發信號槽 88 QtGui.QWidget.connect(self.ui_qr.pushButtonOk, QtCore.SIGNAL('clicked()'), self.generateQr) 89 # self.ui_qr.pushButtonOk.clicked.connect(self.generateQr) 90 91 def generateQr(self): 92 textcontent=self.ui_qr.lineEditInput.text() 93 if textcontent=='': 94 QtGui.QMessageBox.information(self, (u'提示'),(u'請填寫URL地址'),QtGui.QMessageBox.Yes) 95 else: 96 filename='Qrcode.png' 97 qr = qrcode.QRCode( 98 version=None, 99 error_correction=qrcode.constants.ERROR_CORRECT_L, 100 box_size=5, 101 border=4, 102 ) 103 qr.add_data(textcontent) 104 qr.make(fit=True) 105 img = qr.make_image() 106 img.save(filename) 107 # img = qrcode.make(textcontent) 108 # img.save(filename) 109 self.ui_qr.label.setPixmap(QtGui.QPixmap(filename)) 110 111 112 113 # 重載keyPressEvent , 當按下Esc退出 114 def keyPressEvent(self, event): 115 if event.key() ==QtCore.Qt.Key_Escape: 116 self.close() 117 118 119 if __name__ == "__main__": 120 import sys 121 app = QtGui.QApplication(sys.argv) 122 qr = showQr() 123 qr.show() 124 sys.exit(app.exec_())
運行效果:
解析二維碼用到zbar模塊
扯蛋的zbar 在Pypi中只有py25 和py26 版本,更新時間仍是2009年, 下載後py27還用不了!
最後在github 中找到支持Py27的zbar庫
地址: https://github.com/jacobvalenta/zbar-py27-msi
one_qr_code.png
代碼:
1 from PIL import Image 2 import zbar 3 4 def get_QR(): 5 scanner = zbar.ImageScanner() 6 scanner.parse_config("enable") 7 pil = Image.open("one_qr_code.png").convert('L') 8 width, height = pil.size 9 raw = pil.tostring() 10 image = zbar.Image(width, height, 'Y800', raw) 11 scanner.scan(image) 12 data = '' 13 for symbol in image: 14 data+=symbol.data 15 del(image) 16 return data 17 18 qrdata= get_QR() 19 print(qrdata)
返回解析結果:
http://weixin.qq.com/r/n0zE3NfEaooVrZO-9xmN