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 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
Nov 23 Python
Python 获取主机ip与hostname的方法
Dec 17 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
Python字符串对象实现原理详解
Jul 01 Python
Django REST Framework之频率限制的使用
Sep 29 Python
在Django中实现添加user到group并查看
Nov 18 Python
python 实现矩阵填充0的例子
Nov 29 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python tkinter 下拉日历控件代码
Mar 04 Python
如何真正的了解python装饰器
Aug 14 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
大师制作的中短波矿石收音机
2020/04/02 无线电
在普通HTTP上安全地传输密码
2007/07/21 PHP
php部分常见问题总结
2008/03/27 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
newxtree.js代码
2007/03/13 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
2010/04/01 Javascript
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
AngularJS实现tab选项卡的方法详解
2017/07/05 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
JavaScript 五大常见函数
2018/03/23 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
Ruby元编程基础学习笔记整理
2016/07/02 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
python将回车作为输入内容的实例
2018/06/23 Python
想学python 这5本书籍你必看!
2018/12/11 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python简单实现9宫格图片实例
2020/09/03 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
数据库方面面试题
2012/04/22 面试题
三年级小学生评语
2014/04/22 职场文书
后勤个人工作总结
2015/02/28 职场文书
新闻稿怎么写
2015/07/18 职场文书
机械生产实习心得体会
2016/01/22 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python
Python字典的基础操作
2021/11/01 Python
OpenCV实现普通阈值
2021/11/17 Java/Android