Python实现的二维码生成小软件


Posted in Python onJuly 11, 2014

前几天,我估摸着做一个能生成QR Code小程序,并能用wxPython在屏幕上显示出来。当然,我想用纯Python实现,观望了一会后,我找到了三个候选:

github 上的 python-qrcode
sourceforge上的 pyqrcode
Goolge code 上的 pyqrnative

我尝试了python-qrcode以及pyqrnative,因为它们能够运行在Windows/Mac/Linux。也不需要依赖额外的其他库除了Python图像库。pyqrcode项目需要其他一些先决条件,并且不能在Windows上运行,所以我不想与之纠缠了。我最后使用了一些以前写过的一个Photo Viewer程序的代码,然后稍微地修改了一下,就成了QRCode的查看器了。

开始

正如我上面提到的,你只需要Python图像库,GUI部分我们将使用wxPython。python-qrcode相比pyqrnative生成图片更快,并包含了你见过的大多数QR码类型。

生成 QR Codes

当你准备好所有需要的以后,你可以运行以下代码,看看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生成效果图:

Python实现的二维码生成小软件

PyQRNative生成效果图:

Python实现的二维码生成小软件

Python 相关文章推荐
Python 专题四 文件基础知识
Mar 20 Python
python3.4用函数操作mysql5.7数据库
Jun 23 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
Python自定义线程池实现方法分析
Feb 07 Python
Python中property函数用法实例分析
Jun 04 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
Python中的单下划线和双下划线使用场景详解
Sep 09 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
python 一维二维插值实例
Apr 22 Python
python3发送request请求及查看返回结果实例
Apr 30 Python
Python爬虫爬取ts碎片视频+验证码登录功能
Feb 22 Python
使用python创建股票的时间序列可视化分析
Mar 03 Python
让python同时兼容python2和python3的8个技巧分享
Jul 11 #Python
Python操作SQLite简明教程
Jul 10 #Python
Python读取图片EXIF信息类库介绍和使用实例
Jul 10 #Python
Python采集腾讯新闻实例
Jul 10 #Python
使用wxpython实现的一个简单图片浏览器实例
Jul 10 #Python
Python语言的12个基础知识点小结
Jul 10 #Python
使用Python获取Linux系统的各种信息
Jul 10 #Python
You might like
PHP实现简单爬虫的方法
2015/07/29 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
AngularJS基础 ng-show 指令简单示例
2016/08/03 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
原生js代码实现图片放大境效果
2016/10/30 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
详解Angular.js中$http拦截器的介绍及使用
2017/07/04 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
js实现数字滚动特效
2019/12/16 Javascript
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python socket实现简单聊天室
2018/04/01 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python使用pandas处理CSV文件的实例讲解
2018/06/22 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
python3获取控制台输入的数据的具体实例
2020/08/16 Python
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
美国性感内衣店:Yandy
2018/06/12 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
应聘医药代表职位求职信
2013/10/21 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
2014年扫黄打非工作总结
2014/12/03 职场文书
新教师个人总结
2015/02/06 职场文书
合同补充协议书
2016/03/24 职场文书
争做文明公民倡议书
2019/06/24 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS