【python】PyQt5实现生成二维码并保存的功能(附源码,带注释)

简介: 【python】PyQt5实现生成二维码并保存的功能(附源码,带注释)

源码请点赞关注收藏后评论区留言或私信博主要

程序运行结果如下


可以通过调节边距来放缩二维码大小

点击保存二维码后弹出保存文件路径


 

代码分为以下几个模块 1:二维码图形界面模块

def __init__(self, parent=None):
    super().__init__()
    self.setFixedSize(600, 400)
    self.setWindowTitle('二维码生成器-ljl')
    self.grid = QGridLayout()
    # 定义组件
    #   --Label
    self.content_label = QLabel('内容:')
    self.size_label = QLabel('尺寸:')
    self.version_label = QLabel('版本:')
    self.margin_label = QLabel('边距:')
    self.rendering_label = QLabel('效果:')
    self.show_label = QLabel()
    #     使得图片可缩放
    self.show_label.setScaledContents(True)
    #     显示时的最大尺寸
    self.show_label.setMaximumSize(200, 200)
    #   --输入框
    self.content_edit = QLineEdit()
    self.content_edit.setText('微信公众号:ljl')
    #   --按钮
    self.generate_button = QPushButton('生成二维码')
    self.save_button = QPushButton('保存二维码')
    #   --下拉框
    self.version_combobox = QComboBox()
    for i in range(1, 41):
      self.version_combobox.addItem('%s' % str(i))
    self.size_combobox = QComboBox()
    for i in range(8, 40, 2):
      self.size_combobox.addItem('%s * %s' % (str(i*29), str(i*29)))
    #   --微调框
    self.margin_spinbox = QSpinBox()
    # 布局
    #   数字依次对应行, 列, 行数和列数
    self.grid.addWidget(self.rendering_label, 0, 0, 1, 1)
    self.grid.addWidget(self.show_label, 0, 0, 5, 5)
    self.grid.addWidget(self.content_label, 0, 5, 1, 1)
    self.grid.addWidget(self.content_edit, 0, 6, 1, 3)
    self.grid.addWidget(self.version_label, 1, 5, 1, 1)
    self.grid.addWidget(self.version_combobox, 1, 6, 1, 1)
    self.grid.addWidget(self.size_label, 2, 5, 1, 1)
    self.grid.addWidget(self.size_combobox, 2, 6, 1, 1)
    self.grid.addWidget(self.margin_label, 3, 5, 1, 1)
    self.grid.addWidget(self.margin_spinbox, 3, 6, 1, 1)
    self.grid.addWidget(self.generate_button, 4, 5, 1, 2)
    self.grid.addWidget(self.save_button, 5, 5, 1, 2)
    self.setLayout(self.grid)
    self.generate_button.clicked.connect(self.genQrcode)
    self.save_button.clicked.connect(self.saveQrcode)
    self.margin_spinbox.valueChanged.connect(self.genQrcode)
    self.genQrcode()

2:生成二维码模块

def genQrcode(self):
    content = self.content_edit.text()
    try:
      margin = int(self.margin_spinbox.text())
    except:
      margin = 0
    size = int(self.size_combobox.currentText().split('*')[0])
    qr = qrcode.QRCode(version=1,
               error_correction=qrcode.constants.ERROR_CORRECT_L,
               box_size=size//29,
               border=margin)
    qr.add_data(content)
    self.qr_img = qr.make_image()
    fp = io.BytesIO()
    self.qr_img.save(fp, 'BMP')
    qimg = QtGui.QImage()
    qimg.loadFromData(fp.getvalue(), 'BMP')
    qimg_pixmap = QtGui.QPixmap.fromImage(qimg)
    self.show_label.setPixmap(qimg_pixmap)

3:保存二维码模块

def saveQrcode(self):
    filename = QFileDialog.getSaveFileName(self, '保存', './qrcode.png', '所有文件(*)')
    if filename[0] != '':
      self.qr_img.save(filename[0])
      QDialog().show()

代码整合后如下

import io
import sys
import qrcode
from PyQt5 import QtWidgets, QtGui
from PyQt5.QtWidgets import QApplication, QGridLayout, QLabel, QLineEdit, QPushButton, QComboBox, QSpinBox, QFileDialog, QDialog
#pyqt5制作界面常用
'''Demo'''
#图形界面的类
class qrcodeGUI(QtWidgets.QWidget):
  def __init__(self, parent=None):
    super().__init__()
    self.setFixedSize(600, 400)
    self.setWindowTitle('二维码生成器-ljl')
    self.grid = QGridLayout()
    # 定义组件
    #   --Label
    self.content_label = QLabel('内容:')
    self.size_label = QLabel('尺寸:')
    self.version_label = QLabel('版本:')
    self.margin_label = QLabel('边距:')
    self.rendering_label = QLabel('效果:')
    self.show_label = QLabel()
    #     使得图片可缩放
    self.show_label.setScaledContents(True)
    #     显示时的最大尺寸
    self.show_label.setMaximumSize(200, 200)
    #   --输入框
    self.content_edit = QLineEdit()
    self.content_edit.setText('微信公众号:ljl')
    #   --按钮
    self.generate_button = QPushButton('生成二维码')
    self.save_button = QPushButton('保存二维码')
    #   --下拉框
    self.version_combobox = QComboBox()
    for i in range(1, 41):
      self.version_combobox.addItem('%s' % str(i))
    self.size_combobox = QComboBox()
    for i in range(8, 40, 2):
      self.size_combobox.addItem('%s * %s' % (str(i*29), str(i*29)))
    #   --微调框
    self.margin_spinbox = QSpinBox()
    # 布局
    #   数字依次对应行, 列, 行数和列数
    self.grid.addWidget(self.rendering_label, 0, 0, 1, 1)
    self.grid.addWidget(self.show_label, 0, 0, 5, 5)
    self.grid.addWidget(self.content_label, 0, 5, 1, 1)
    self.grid.addWidget(self.content_edit, 0, 6, 1, 3)
    self.grid.addWidget(self.version_label, 1, 5, 1, 1)
    self.grid.addWidget(self.version_combobox, 1, 6, 1, 1)
    self.grid.addWidget(self.size_label, 2, 5, 1, 1)
    self.grid.addWidget(self.size_combobox, 2, 6, 1, 1)
    self.grid.addWidget(self.margin_label, 3, 5, 1, 1)
    self.grid.addWidget(self.margin_spinbox, 3, 6, 1, 1)
    self.grid.addWidget(self.generate_button, 4, 5, 1, 2)
    self.grid.addWidget(self.save_button, 5, 5, 1, 2)
    self.setLayout(self.grid)
    self.generate_button.clicked.connect(self.genQrcode)
    self.save_button.clicked.connect(self.saveQrcode)
    self.margin_spinbox.valueChanged.connect(self.genQrcode)
    self.genQrcode()
  '''生成二维码'''
  def genQrcode(self):
    content = self.content_edit.text()
    try:
      margin = int(self.margin_spinbox.text())
    except:
      margin = 0
    size = int(self.size_combobox.currentText().split('*')[0])
    qr = qrcode.QRCode(version=1,
               error_correction=qrcode.constants.ERROR_CORRECT_L,
               box_size=size//29,
               border=margin)
    qr.add_data(content)
    self.qr_img = qr.make_image()
    fp = io.BytesIO()
    self.qr_img.save(fp, 'BMP')
    qimg = QtGui.QImage()
    qim
    filename = QFileDialog.getSaveFileName(self, '保存', './qrcode.png', '所有文件(*)')
    if filename[0] != '':
      self.qr_img.save(filename[0])
      QDialog().show()
if __name__ == '__main__':
  gui.show()
  sys.exit(app.exec_())
相关文章
|
19天前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
26 6
|
29天前
|
IDE 数据挖掘 开发工具
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
Python作为一种广受欢迎的高级编程语言,以其简洁的语法和强大的功能吸引了众多初学者和专业开发者
37 7
|
21天前
|
测试技术 Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界中,装饰器是那些能够为我们的代码增添魔力的小精灵。它们不仅让代码看起来更加优雅,还能在不改变原有函数定义的情况下,增加额外的功能。本文将通过生动的例子和易于理解的语言,带你领略装饰器的奥秘,从基础概念到实际应用,一起开启Python装饰器的奇妙旅程。
34 11
|
16天前
|
Python
探索Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器就像是给函数穿上了一件神奇的外套,让它们拥有了超能力。本文将通过浅显易懂的语言和生动的比喻,带你了解装饰器的基本概念、使用方法以及它们如何让你的代码变得更加简洁高效。让我们一起揭开装饰器的神秘面纱,看看它是如何在不改变函数核心逻辑的情况下,为函数增添新功能的吧!
|
25天前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
26天前
|
设计模式 监控 程序员
Python中的装饰器:功能增强与代码复用的利器####
本文深入探讨了Python中装饰器的工作原理、应用场景及其在提升代码可读性、减少重复劳动方面的优势。不同于传统方法的冗长和复杂,装饰器提供了一种优雅且高效的方式来增强函数或方法的功能。通过具体实例,我们将揭示装饰器如何简化错误处理、日志记录及性能监控等常见任务,使开发者能够专注于核心业务逻辑的实现。 ####
|
27天前
|
机器人 计算机视觉 Python
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
Python作为一种高效、易读且功能强大的编程语言,在教育领域的应用日益广泛
42 5
|
1月前
|
开发框架 缓存 测试技术
Python中的装饰器:魔法般的功能增强
在Python编程中,装饰器是一种强大而灵活的工具,它允许开发者修改或扩展函数和类的行为。本文将深入探讨Python装饰器的工作原理,并通过实例演示如何创建和使用自定义装饰器来增强代码的功能性和可读性。我们将从基础概念讲起,逐步深入到高级应用,揭示装饰器背后的“魔法”,并展示它们在实际开发中的多种用途。
|
27天前
|
Python
探索Python中的装饰器:简化代码,增强功能
本文将引导你了解Python装饰器的奇妙世界。我们将从基础概念入手,逐步深入到装饰器的应用实例,展示如何通过这一强大工具简化代码并增加新功能。文章不仅介绍理论知识,还将提供实用的代码示例,帮助你在实际项目中运用装饰器提升开发效率。
|
1月前
|
搜索推荐 测试技术 数据处理
Python中的装饰器:功能增强与代码复用的利器####
本文将深入浅出地探讨Python中装饰器的概念、工作原理及其在提升代码可读性、减少重复劳动方面的显著优势。不同于常规的摘要,本文将以一个实际应用场景为引子,逐步揭示装饰器如何巧妙地解决代码冗余问题,同时提供具体示例,帮助读者快速掌握这一强大的编程工具。 ####