当前位置: 移动技术网 > IT编程>脚本编程>Python > Python实现的二维码生成小软件

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

2019年06月14日  | 移动技术网IT编程  | 我要评论

夏爱熙,美丽的日月潭,beamreader

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

github 上的
sourceforge上的
goolge code 上的

我尝试了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生成效果图:

pyqrnative生成效果图:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网