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 (1)
Oct 31 Python
下载给定网页上图片的方法
Feb 18 Python
Python import自定义模块方法
Feb 12 Python
举例详解Python中yield生成器的用法
Aug 05 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
详解Python3 对象组合zip()和回退方式*zip
May 15 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
Python Sympy计算梯度、散度和旋度的实例
Dec 06 Python
python3字符串输出常见面试题总结
Dec 01 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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后端方法)
2016/02/03 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
php实现单笔转账到支付宝功能
2018/10/09 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
微信小程序利用for循环解决内容变更问题
2020/03/05 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
Python中字典的基础知识归纳小结
2015/08/19 Python
python中的随机函数小结
2018/01/27 Python
Python中作用域的深入讲解
2018/12/10 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
普通大学毕业生自荐信范文
2014/02/23 职场文书
中职生求职信
2014/07/01 职场文书
社会学专业求职信
2014/07/17 职场文书
对外汉语专业大学生职业生涯规划范文
2014/09/13 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
敬老院活动感想
2015/08/07 职场文书
Python制作表白爱心合集
2022/01/22 Python
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers