1. 程式人生 > >Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

 

一、文中涉及

本文涉及以下知識點:

  • PyQt5/PiSide2網格佈局的使用;
  • PyQt5/PiSide2按鈕小部件的使用;
  • PyQt5/PiSide2標籤小部件的使用;
  • PyQt5/PiSide2選值框小部件的使用;
  • PyQt5/PiSide2影象的使用;
  • Python第三方庫qrcode的使用;

為了方便起見,以下程式碼使用PyQt5進行講解,PiSide2同樣適用。

Python圖形介面實戰:使用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圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

 

一個基本的介面建立好了,接下來我們來實現生成二維碼的功能;

三、生成二維碼

在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()方法,執行程式,我們就可以看到預設的文字框內容“州的先生”就已經被生成了二維碼,如下圖所示:

Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

 

接下來,我們將文字輸入框的文字改變訊號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)
 

再次執行程式碼,可以發現當我們改變文字資料框和選值框的值時,顯示的二維碼也隨之發生了改變,如下圖所示:

Python圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

 

四、儲存二維碼

完成了二維碼的生成之後,我們需要將其儲存到本地。在這裡我們使用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圖形介面實戰:使用PyQt5/PiSide2製作二維碼生成器

 

五、最後

這樣我們就實現了使用Python製作二維碼生成