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 捕获shell脚本的输出结果实例
Jan 04 Python
详解python调度框架APScheduler使用
Mar 28 Python
利用Python实现Windows下的鼠标键盘模拟的实例代码
Jul 13 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
python各层级目录下import方法代码实例
Jan 20 Python
python实现人机五子棋
Mar 25 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
python中绕过反爬虫的方法总结
Nov 25 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
教你怎么用Python监控愉客行车程
Apr 29 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(7) php 字符串相关应用
2010/03/05 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP+MySQL存储数据常见中文乱码问题小结
2016/06/13 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
js中自定义方法实现停留几秒sleep
2014/07/11 Javascript
JavaScript截取字符串的2个函数介绍
2014/08/27 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
详谈js中window.location.search的用法和作用
2017/02/13 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
layui实现动态和静态分页
2018/04/28 Javascript
javascript少儿编程关于返回值的函数内容
2018/05/27 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
python实现统计代码行数的方法
2015/05/22 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
在Pandas中给多层索引降级的方法
2018/11/16 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
Python实现FLV视频拼接功能
2020/01/21 Python
python学习笔记之多进程
2020/08/06 Python
python用tkinter实现一个简易能进行随机点名的界面
2020/09/27 Python
详解html5 canvas 微信海报分享(个人爬坑)
2018/01/12 HTML / CSS
美国男士西装打折店:Jos. A. Bank
2017/11/13 全球购物
《美丽的黄昏》教学反思
2014/02/28 职场文书
2015年女工委工作总结
2015/07/27 职场文书
详解Python类和对象内容
2021/06/22 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers