前几天,我估摸着做一个能生成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 osimport wx try:  import qrcodeexcept importerror:  qrcode = none try:  import pyqrnativeexcept 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生成效果图:
   
 
   