【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_())
相关文章
|
1月前
|
计算机视觉 Python
Python实用记录(一):如何将不同类型视频按关键帧提取并保存图片,实现图片裁剪功能
这篇文章介绍了如何使用Python和OpenCV库从不同格式的视频文件中按关键帧提取图片,并展示了图片裁剪的方法。
66 0
|
4天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
7天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
12天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
13天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
20天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
|
22天前
|
开发框架 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第20天】在编程的海洋中,简洁与强大是航行的双桨。Python的装饰器,这一高级特性,恰似海风助力,让代码更优雅、功能更强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一步步深入其内涵与意义。
|
27天前
|
云计算 Python
用python给你写个简单的计算器功能网页啊
这张图片展示了阿里巴巴集团的组织架构图,涵盖了核心电商、云计算、数字媒体与娱乐、创新业务等主要板块,以及各板块下的具体业务单元和部门。
|
1月前
|
设计模式 开发者 Python
Python中的装饰器:简化代码与增强功能
【10月更文挑战第9天】在编程的世界里,效率和可读性是衡量代码质量的两大关键指标。Python语言以其简洁明了的语法赢得了无数开发者的青睐,而装饰器则是其独特魅力之一。本文将深入探讨装饰器的工作原理、使用方法以及如何通过自定义装饰器来提升代码的重用性和可维护性,让读者能够更加高效地编写出既优雅又功能强大的代码。
|
1月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
99 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照