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中除法使用的注意事项
Aug 21 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
Python读取word文本操作详解
Jan 22 Python
python简单实现AES加密和解密
Mar 28 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
python基于K-means聚类算法的图像分割
Oct 30 Python
Pytorch之卷积层的使用详解
Dec 31 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
Python word文本自动化操作实现方法解析
Nov 05 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
php实现源代码加密的方法
2015/07/11 PHP
php使用str_shuffle()函数生成随机字符串的方法分析
2017/02/17 PHP
PHP常用函数之获取汉字首字母功能示例
2019/10/21 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
完美实现八种js焦点轮播图(上篇)
2016/07/18 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
利用d3.js制作连线动画图与编辑器的方法实例
2019/09/05 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
JS 5种遍历对象的方式
2020/06/16 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
Python实现截屏的函数
2015/07/25 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
深入理解Django-Signals信号量
2019/02/19 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
Python获取、格式化当前时间日期的方法
2020/02/10 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
大学生找工作推荐信范文
2013/11/28 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
《草原》教学反思
2014/02/15 职场文书
股东合作协议书
2014/04/14 职场文书
职员竞岗演讲稿
2014/05/14 职场文书
酒店优秀员工事迹材料
2014/06/02 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
停车场管理制度范本
2015/08/05 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python