Python3使用PyQt5制作简单的画板/手写板实例

下面是关于“Python3使用PyQt5制作简单的画板/手写板实例”的详细攻略:

确认开发环境

首先需要确认开发环境已经安装好,建议使用Anaconda或Miniconda来管理Python环境。

创新一个虚拟环境,并安装需要的库,包括PyQt5和Pillow。

conda create -n example-env
conda activate example-env
conda install pyqt5 pillow

创建主窗口

在PyQt5中,首先需要创建Qt应用程序,并创建主窗口。下面是一个简单的创建方法,包含创建一个带有标题和大小的窗口:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Python画板")
        self.setGeometry(100, 100, 800, 600)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

创建画布,添加绘制功能

接下来,需要在主窗口中添加一个可绘制的画布,并添加绘制功能。我们可以使用QPixmap来创建一个画布,并将其显示在一个QLabel中。在继承的MainWindow类中添加以下代码:

from PyQt5.QtGui import QPixmap, QPainter, QPen, QColor
from PyQt5.QtCore import Qt


class DrawingBoard(QLabel):
    def __init__(self):
        super().__init__()
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.white)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.pixmap)

    def mousePressEvent(self, event):
        self.last_point = event.pos()

    def mouseMoveEvent(self, event):
        painter = QPainter(self.pixmap)
        painter.setPen(QPen(QColor(0, 0, 0), 3, Qt.SolidLine))
        painter.drawLine(self.last_point, event.pos())
        self.update()
        self.last_point = event.pos()

在这段代码中,我们创建了一个名为DrawingBoard的类,该类继承自QLabel,并实现了绘制功能。在初始化时,我们使用QPixmap创建一个画布,并用白色填充。在paintEvent函数中,我们使用QPainter将画布绘制在QLabel上。在mousePressEvent和mouseMoveEvent函数中,我们使用QPainter绘制线条。

然后,在MainWindow类的构造函数中添加以下代码来显示DrawingBoard:

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Python画板")
        self.setGeometry(100, 100, 800, 600)

        self.drawing_board = DrawingBoard()
        self.setCentralWidget(self.drawing_board)

这样就可以在主窗口中显示一个可以绘制的画布了。

添加清空和保存功能

最后,我们需要添加清空和保存功能。在DrawingBoard类中添加以下代码:

from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtGui import QImage
import os


class DrawingBoard(QLabel):
    # ...

    def clear(self):
        self.pixmap.fill(Qt.white)

    def save(self):
        file_name, _ = QFileDialog.getSaveFileName(self, '保存文件', os.getcwd(), 'Images(*.png *.jpg *.bmp)')
        if file_name:
            self.pixmap.toImage().save(file_name)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_C:
            self.clear()
        elif event.key() == Qt.Key_S:
            self.save()
        else:
            super().keyPressEvent(event)

这里我们添加了clear和save方法,在keyPressEvent函数中监听按键事件,当按下C键时调用clear方法,当按下S键时调用save方法。在save方法中,我们使用QFileDialog打开一个文件对话框,让用户选择保存的文件名和格式,然后使用QPixmap的toImage方法将画布转换为QImage,并使用QImage的save方法保存文件。

这样就完成了画板应用的制作。

示例

下面是一个简单的应用示例:

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel, QFileDialog
from PyQt5.QtGui import QPixmap, QPainter, QPen, QColor, QImage
from PyQt5.QtCore import Qt
import os


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Python画板")
        self.setGeometry(100, 100, 800, 600)

        self.drawing_board = DrawingBoard()
        self.setCentralWidget(self.drawing_board)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_C:
            self.drawing_board.clear()
        elif event.key() == Qt.Key_S:
            self.drawing_board.save()
        else:
            super().keyPressEvent(event)


class DrawingBoard(QLabel):
    def __init__(self):
        super().__init__()
        self.pixmap = QPixmap(800, 600)
        self.pixmap.fill(Qt.white)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.pixmap)

    def mousePressEvent(self, event):
        self.last_point = event.pos()

    def mouseMoveEvent(self, event):
        painter = QPainter(self.pixmap)
        painter.setPen(QPen(QColor(0, 0, 0), 3, Qt.SolidLine))
        painter.drawLine(self.last_point, event.pos())
        self.update()
        self.last_point = event.pos()

    def clear(self):
        self.pixmap.fill(Qt.white)

    def save(self):
        file_name, _ = QFileDialog.getSaveFileName(self, '保存文件', os.getcwd(), 'Images(*.png *.jpg *.bmp)')
        if file_name:
            self.pixmap.toImage().save(file_name)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

这个应用支持清空和保存画布,可以通过按下C键和S键实现。用户可以在画布上自由绘制,画布支持保存为png、jpg或bmp格式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python3使用PyQt5制作简单的画板/手写板实例 - Python技术站

(1)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python查找重复图片并删除(图片去重)

    Python查找重复图片并删除(图片去重) 1. 简介 在使用计算机存储图片的时候,往往会遇到大量的图片需要存储。但是很多时候,我们会发现有些图片是相同的,却被存储了多次。这样不仅浪费了硬盘的空间,而且也不方便图片查找和管理。因此,我们需要一种方式来对图片进行去重。 Python是强大的编程语言,它提供了各种各样的库,可以帮助我们实现各种功能,包括图片去重。…

    python 2023年5月18日
    00
  • Python ValueError: invalid literal for int() with base 10 实用解决方法

    Python中的ValueError异常通常是由于数据类型不匹配,或者输入数据格式错误等原因引起的。其中,invalid literal for int() with base 10错误表示给int()函数传递了无效参数。本篇攻略将针对此错误进行详细讲解,提供实用解决方法,希望能帮助您排除类似问题。 什么是PythonValueError: invalid …

    python 2023年5月13日
    00
  • python常用的正则表达式大全

    下面是详细的攻略: Python常用的正则表达式大全 正则表达式是一种用于匹配字符串的模式。在Python中,我们可以使用re模块来编写正则表达式。本文将介绍Python常用的正则表达式,包括匹配数字、匹配字母、匹配空白字符、匹配特殊字符等。 匹配数字 下面是一些常用的正则表达式,用于匹配数字: \d:匹配任意数字。 \d+:匹配一个或多个数字。 \d{3}…

    python 2023年5月14日
    00
  • python中ASCII码字符与int之间的转换方法

    Python中ASCII码字符与int之间的转换方法 在Python中,我们可以很方便地将ASCII码字符与整数进行相互转换。以下是具体操作方法。 将ASCII码字符转换为int 可以使用Python内置函数ord()将ASCII码字符转换为对应的整数。 # 示例1:将字符’A’转换为对应的整数 num = ord(‘A’) print(num) # 输出:…

    python 2023年5月31日
    00
  • Python多进程的使用详情

    下面是针对“Python多进程的使用详情”的完整攻略。 1. Python多进程简介 在操作系统中,一个进程是一个执行中的程序,这个程序有可能是由一个进程或者多个进程组成的。Python提供了一个multiprocessing模块,可以很方便地实现进程间通信以及进程池等多进程操作。 2. Python多进程的使用方法 2.1 进程的创建 在Python中,可…

    python 2023年5月19日
    00
  • 如何使用python爬虫爬取要登陆的网站

    使用Python爬虫爬取需要登陆的网站,一般需要以下几个步骤: 对目标网站进行分析,找到登录页面的url、用户名输入框、密码输入框、提交按钮等。 使用Python的requests库发起登录请求。代码示例如下: import requests # 填写登录信息 username = ‘your_username’ password = ‘your_passw…

    python 2023年5月14日
    00
  • Python3使用tesserocr识别字母数字验证码的实现

    Python3使用tesserocr识别字母数字验证码的实现攻略 在程序中,有时需要对字母数字等验证码进行识别,而tesserocr是一个很好用的OCR库。这篇文章将详细讲解如何使用tesserocr识别字母数字验证码。 1. 依赖库安装 为了使用tesserocr,需要安装它的依赖库leptonica和tesseract。下面介绍在Ubuntu 18.04…

    python 2023年5月18日
    00
  • python+adb命令实现自动刷视频脚本案例

    Python+ADB命令实现自动刷视频脚本,可以分为以下几个步骤: 环境搭建 要使用Python+ADB命令实现自动刷视频脚本,我们首先需要搭建好相关的环境。具体来说,需要安装好Python以及ADB命令行工具,同时还需要了解如何在电脑上调试安装了ADB驱动的安卓手机。 编辑Python脚本 一旦环境搭建完成,我们就可以开始编写Python脚本来实现自动刷视…

    python 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部