Python實(shí)現(xiàn)的二維碼生成小軟件
前幾天,我估摸著做一個(gè)能生成QR Code小程序,并能用wxPython在屏幕上顯示出來(lái)。當(dāng)然,我想用純Python實(shí)現(xiàn),觀望了一會(huì)后,我找到了三個(gè)候選:
github 上的 python-qrcode
sourceforge上的 pyqrcode
Goolge code 上的 pyqrnative
我嘗試了python-qrcode以及pyqrnative,因?yàn)樗鼈兡軌蜻\(yùn)行在Windows/Mac/Linux。也不需要依賴額外的其他庫(kù)除了Python圖像庫(kù)。pyqrcode項(xiàng)目需要其他一些先決條件,并且不能在Windows上運(yùn)行,所以我不想與之糾纏了。我最后使用了一些以前寫過(guò)的一個(gè)Photo Viewer程序的代碼,然后稍微地修改了一下,就成了QRCode的查看器了。
開(kāi)始
正如我上面提到的,你只需要Python圖像庫(kù),GUI部分我們將使用wxPython。python-qrcode相比pyqrnative生成圖片更快,并包含了你見(jiàn)過(guò)的大多數(shù)QR碼類型。
生成 QR Codes
當(dāng)你準(zhǔn)備好所有需要的以后,你可以運(yùn)行以下代碼,看看Python做了些啥:
import os
import wx
try:
import qrcode
except ImportError:
qrcode = None
try:
import PyQRNative
except ImportError:
PyQRNative = None
########################################################################
class QRPanel(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent=parent)
self.photo_max_size = 240
sp = wx.StandardPaths.Get()
self.defaultLocation = sp.GetDocumentsDir()
img = wx.EmptyImage(240,240)
self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY,
wx.BitmapFromImage(img))
qrDataLbl = wx.StaticText(self, label="Text to turn into QR Code:")
self.qrDataTxt = wx.TextCtrl(self, value="http://www.mousevspython.com", size=(200,-1))
instructions = "Name QR image file"
instructLbl = wx.StaticText(self, label=instructions)
self.qrPhotoTxt = wx.TextCtrl(self, size=(200,-1))
browseBtn = wx.Button(self, label='Change Save Location')
browseBtn.Bind(wx.EVT_BUTTON, self.onBrowse)
defLbl = "Default save location: " + self.defaultLocation
self.defaultLocationLbl = wx.StaticText(self, label=defLbl)
qrcodeBtn = wx.Button(self, label="Create QR with qrcode")
qrcodeBtn.Bind(wx.EVT_BUTTON, self.onUseQrcode)
pyQRNativeBtn = wx.Button(self, label="Create QR with PyQRNative")
pyQRNativeBtn.Bind(wx.EVT_BUTTON, self.onUsePyQR)
# Create sizer
self.mainSizer = wx.BoxSizer(wx.VERTICAL)
qrDataSizer = wx.BoxSizer(wx.HORIZONTAL)
locationSizer = wx.BoxSizer(wx.HORIZONTAL)
qrBtnSizer = wx.BoxSizer(wx.VERTICAL)
qrDataSizer.Add(qrDataLbl, 0, wx.ALL, 5)
qrDataSizer.Add(self.qrDataTxt, 1, wx.ALL|wx.EXPAND, 5)
self.mainSizer.Add(wx.StaticLine(self, wx.ID_ANY),
0, wx.ALL|wx.EXPAND, 5)
self.mainSizer.Add(qrDataSizer, 0, wx.EXPAND)
self.mainSizer.Add(self.imageCtrl, 0, wx.ALL, 5)
locationSizer.Add(instructLbl, 0, wx.ALL, 5)
locationSizer.Add(self.qrPhotoTxt, 0, wx.ALL, 5)
locationSizer.Add(browseBtn, 0, wx.ALL, 5)
self.mainSizer.Add(locationSizer, 0, wx.ALL, 5)
self.mainSizer.Add(self.defaultLocationLbl, 0, wx.ALL, 5)
qrBtnSizer.Add(qrcodeBtn, 0, wx.ALL, 5)
qrBtnSizer.Add(pyQRNativeBtn, 0, wx.ALL, 5)
self.mainSizer.Add(qrBtnSizer, 0, wx.ALL|wx.CENTER, 10)
self.SetSizer(self.mainSizer)
self.Layout()
#----------------------------------------------------------------------
def onBrowse(self, event):
""""""
dlg = wx.DirDialog(self, "Choose a directory:",
style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
self.defaultLocation = path
self.defaultLocationLbl.SetLabel("Save location: %s" % path)
dlg.Destroy()
#----------------------------------------------------------------------
def onUseQrcode(self, event):
"""
https://github.com/lincolnloop/python-qrcode
"""
qr = qrcode.QRCode(version=1, box_size=10, border=4)
qr.add_data(self.qrDataTxt.GetValue())
qr.make(fit=True)
x = qr.make_image()
qr_file = os.path.join(self.defaultLocation, self.qrPhotoTxt.GetValue() + ".jpg")
img_file = open(qr_file, 'wb')
x.save(img_file, 'JPEG')
img_file.close()
self.showQRCode(qr_file)
#----------------------------------------------------------------------
def onUsePyQR(self, event):
"""
http://code.google.com/p/pyqrnative/
"""
qr = PyQRNative.QRCode(20, PyQRNative.QRErrorCorrectLevel.L)
qr.addData(self.qrDataTxt.GetValue())
qr.make()
im = qr.makeImage()
qr_file = os.path.join(self.defaultLocation, self.qrPhotoTxt.GetValue() + ".jpg")
img_file = open(qr_file, 'wb')
im.save(img_file, 'JPEG')
img_file.close()
self.showQRCode(qr_file)
#----------------------------------------------------------------------
def showQRCode(self, filepath):
""""""
img = wx.Image(filepath, wx.BITMAP_TYPE_ANY)
# scale the image, preserving the aspect ratio
W = img.GetWidth()
H = img.GetHeight()
if W > H:
NewW = self.photo_max_size
NewH = self.photo_max_size * H / W
else:
NewH = self.photo_max_size
NewW = self.photo_max_size * W / H
img = img.Scale(NewW,NewH)
self.imageCtrl.SetBitmap(wx.BitmapFromImage(img))
self.Refresh()
########################################################################
class QRFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="QR Code Viewer", size=(550,500))
panel = QRPanel(self)
if __name__ == "__main__":
app = wx.App(False)
frame = QRFrame()
frame.Show()
app.MainLoop()
python-qrcode生成效果圖:

PyQRNative生成效果圖:

- Python及Django框架生成二維碼的方法分析
- Python之ReportLab繪制條形碼和二維碼的實(shí)例
- python生成二維碼的實(shí)例詳解
- Python實(shí)現(xiàn)將文本生成二維碼的方法示例
- Python基于QRCode實(shí)現(xiàn)生成二維碼的方法【下載,安裝,調(diào)用等】
- Python使用QRCode模塊生成二維碼實(shí)例詳解
- 使用python調(diào)用zxing庫(kù)生成二維碼圖片詳解
- python實(shí)現(xiàn)二維碼掃碼自動(dòng)登錄淘寶
- 分享Python文本生成二維碼實(shí)例
- Python二維碼生成庫(kù)qrcode安裝和使用示例
- Python用5行代碼寫一個(gè)自定義簡(jiǎn)單二維碼
相關(guān)文章
Python實(shí)現(xiàn)創(chuàng)建模塊的方法詳解
導(dǎo)入一個(gè)模塊,我們一般都會(huì)使用?import?關(guān)鍵字,但有些場(chǎng)景下?import?難以滿足我們的需要。所以除了?import?之外還有很多其它導(dǎo)入模塊的方式,下面就來(lái)介紹一下2022-07-07
python列表刪除元素的三種實(shí)現(xiàn)方法
本文主要介紹了python列表刪除元素的三種實(shí)現(xiàn)方法,主要包括pop方法,remove方法,del方法這三種,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
python使用datetime模塊處理日期時(shí)間及常用功能詳解
datetime模塊是Python標(biāo)準(zhǔn)庫(kù)中用于處理日期和時(shí)間的模塊,在本節(jié)中,我們將介紹datetime模塊的一些常用功能,并通過(guò)實(shí)例代碼詳細(xì)講解每個(gè)知識(shí)點(diǎn),有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-06-06
Python socket實(shí)現(xiàn)簡(jiǎn)單聊天室
這篇文章主要為大家詳細(xì)介紹了Python socket實(shí)現(xiàn)簡(jiǎn)單聊天室,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04
Python簡(jiǎn)單實(shí)現(xiàn)區(qū)域生長(zhǎng)方式
今天小編就為大家分享一篇Python簡(jiǎn)單實(shí)現(xiàn)區(qū)域生長(zhǎng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
獲取django框架orm query執(zhí)行的sql語(yǔ)句實(shí)現(xiàn)方法分析
這篇文章主要介紹了獲取django框架orm query執(zhí)行的sql語(yǔ)句實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Django框架中orm query執(zhí)行的sql語(yǔ)句獲取方法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-06-06
使用Python的Flask框架構(gòu)建大型Web應(yīng)用程序的結(jié)構(gòu)示例
雖說(shuō)Flask是一個(gè)以輕量級(jí)著稱的框架,但也為大型Web應(yīng)用提供了諸如單元測(cè)試與數(shù)據(jù)庫(kù)遷移等許多便利的功能,這里我們來(lái)看一下使用Python的Flask框架構(gòu)建大型Web應(yīng)用程序的結(jié)構(gòu)示例:2016-06-06
簡(jiǎn)單分析Python中用fork()函數(shù)生成的子進(jìn)程
這篇文章主要介紹了Python中用fork()函數(shù)生成的子進(jìn)程,分析子進(jìn)程與父進(jìn)程的執(zhí)行順序,需要的朋友可以參考下2015-05-05

