Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器
一、文中涉及
本文涉及以下知識點:
- PyQt5/PiSide2網格佈局的使用;
- PyQt5/PiSide2按鈕小部件的使用;
- PyQt5/PiSide2標籤小部件的使用;
- PyQt5/PiSide2選值框小部件的使用;
- PyQt5/PiSide2影象的使用;
- Python第三方庫qrcode的使用;
為了方便起見,以下程式碼使用PyQt5進行講解,PiSide2同樣適用。
二、建立圖形介面
首先,我們來建立這個二維碼生成器的基礎圖形介面。介面採用QGridLayout()網格佈局,裡面包含5個QLable()文字標籤部件:
- 指示輸入二維碼的內容;
- 指示選擇二維碼影象尺寸;
- 指示設定二維碼的內邊框;
- 指示預覽二維碼;
- 顯示預覽的二維碼;
首先我們引入所需的模組:
from PyQt5 import QtWidgets,QtGui import qrcode import io import traceback import datetime
為了方便大家理解各個子類呼叫的位置,我們沒有從PyQt5的子模組中直接import所有的子類。
然後建立一個繼承自QtWidgets.QWidget()的類——QrcodeApp()作為我們的圖形介面的主類,將上述的小部件新增進去:
class QrcodeApp(QtWidgets.QWidget): def __init__(self): super().__init__() self.setFixedSize(450,220) self.setWindowTitle("州的先生 - 二維碼生成器") self.main_layout = QtWidgets.QGridLayout() # 視窗網格佈局 self.label_desc = QtWidgets.QLabel("輸入文字或網址:") self.input_content = QtWidgets.QLineEdit() # 二維碼內容 self.input_content.setText("州的先生") self.lable_size = QtWidgets.QLabel("圖片尺寸:") self.label_space = QtWidgets.QLabel("留白設定:") self.lable_pre = QtWidgets.QLabel("預覽:") self.input_size = QtWidgets.QComboBox() # 二維碼編碼型別 self.input_size.addItem("210*210") self.input_size.addItem("420*420") self.input_size.addItem("630*630") self.input_space = QtWidgets.QSpinBox() # 二維碼留白大小 self.save_qrcode = QtWidgets.QPushButton("儲存二維碼") self.qrcode_img = QtWidgets.QLabel() self.qrcode_img.setScaledContents(True) # 設定二維碼影象容器內部件縮放 self.qrcode_img.setMaximumSize(190,190) # 固定二維碼影象容器大小 self.setLayout(self.main_layout) self.main_layout.addWidget(self.label_desc,0,0,1,2) self.main_layout.addWidget(self.input_content, 1, 0, 1, 2) self.main_layout.addWidget(self.lable_size, 2, 0, 1, 1) self.main_layout.addWidget(self.label_space, 2, 1, 1, 1) self.main_layout.addWidget(self.input_size, 3, 0, 1, 1) self.main_layout.addWidget(self.input_space, 3, 1, 1, 1) self.main_layout.addWidget(self.save_qrcode,4,0,1,2) self.main_layout.addWidget(self.lable_pre,0,2,) self.main_layout.addWidget(self.qrcode_img, 1, 2, 5, 2)
這樣,在執行程式碼後,我們會得到一個如下圖所示的圖形介面視窗:
一個基本的介面建立好了,接下來我們來實現生成二維碼的功能;
三、生成二維碼
在Python中有很多第三方的庫可以生成二維碼,在此我們選用的的qrcode這個庫。沒有按照的小夥伴可以使用下述命令進行安裝:
pip install qrcode 它的專案地址為:https://github.com/lincolnloop/python-qrcode ,裡面有詳細的使用方法。
qrcode安裝好之後,我們就可以很方便地建立二維碼了。以下是一個使用qrcode建立二維碼簡單的示例:
import qrcode img = qrcode.make('https://zmister.com') img.save('qrcode.png')
執行上述程式碼,我們將會在本地目錄得到一個名為qrcode.png的二維碼圖片,使用微信掃描它就可以直接開啟州的先生部落格。但是我們建立的二維碼沒有那麼簡單,還需要設定二維碼的大小和留白,所以我們使用qrcode的高階用法。
在QrcodeApp()類中新建一個名為value_change()的方法,分別獲取文字輸入框、選值框和下拉框的值作為二維碼的內容、二維碼的留白大小和二維碼的圖片大小。通過qrcode生成二維碼,再通過Qlabel()部件將二維碼顯示出來:
def value_change(self): try: qr_text = self.input_content.text() # 二維碼內容值 qr_space = self.input_space.text() qr_size = int(self.input_size.currentText().split('*')[0]) print(qr_text) qr = qrcode.QRCode( version=1, box_size=qr_size / 21, border=qr_space if qr_space != '' else 0 ) qr.add_data(qr_text) self.qr_img = qr.make_image() fp = io.BytesIO() self.qr_img.save(fp,"BMP") image = QtGui.QImage() image.loadFromData(fp.getvalue(),"BMP") qr_pixmap = QtGui.QPixmap.fromImage(image) self.qrcode_img.setPixmap(qr_pixmap) except Exception as e: print(repr(e)) print(traceback.print_exc())
然後在初始化方法中呼叫value_change()方法,執行程式,我們就可以看到預設的文字框內容“州的先生”就已經被生成了二維碼,如下圖所示:
接下來,我們將文字輸入框的文字改變訊號textChanged、下拉框的當前索引改變訊號currentIndexChanged和選值框的值改變訊號valueChanged都連線到value_change()方法上,使得二維碼可以實時根據設定的變化而生成新的二維碼:
self.input_content.textChanged.connect(self.value_change) self.input_size.currentIndexChanged.connect(self.value_change) self.input_space.valueChanged.connect(self.value_change)
再次執行程式碼,可以發現當我們改變文字資料框和選值框的值時,顯示的二維碼也隨之發生了改變,如下圖所示:
四、儲存二維碼
完成了二維碼的生成之後,我們需要將其儲存到本地。在這裡我們使用PyQt5的檔案儲存彈出框和qrcode的二維碼儲存方法save()來實現,繼續新建一個名為save_qr()的方法:
def save_qr(self): date = datetime.datetime.strftime(datetime.datetime.now(),'%Y%m%d%H%M%S%f') filename = QtWidgets.QFileDialog.getSaveFileName(self,'儲存二維碼','./qrcode-{date}.png'.format(date=date),'影象檔案(*.png)') if filename[0] != '': self.qr_img.save(filename[0]) print("儲存成功") QtWidgets.QDialog().show()
然後將“儲存二維碼”按鈕的clicked訊號連線到這個方法上:
self.save_qrcode.clicked.connect(self.save_qr)
最後執行程式碼,可以發現生成的二維碼已經可以儲存了,如下圖所示:
五、最後
這樣我們就實現了使用Python製作二維碼生成