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批量生成任意尺寸的图片 简介 在需要大量图片的场景中,手动创建图片是很浪费时间和精力的。利用Python,可以快速批量生成任意尺寸、任意颜色的图片,这样可以极大地提高效率。 准备工作 首先,需要安装Python和Pillow库。 安装Python可以到官网下载,并按照指导安装。 安装Pillow可以使用pip命令安装,如下…

    python 2023年5月19日
    00
  • python实现俄罗斯方块小游戏

    Python实现俄罗斯方块小游戏攻略 介绍 俄罗斯方块是一款经典的游戏,我们可以使用Python编程语言来实现这个小游戏。在这个游戏中,玩家需要控制方块不停的下落,直到无法再操作。下面将介绍如何使用Python实现俄罗斯方块。 实现步骤 1. 安装pygame模块 pip install pygame 2. 导入pygame模块 import pygame …

    python 2023年6月3日
    00
  • Python实战之天气预报系统的实现

    Python实战之天气预报系统的实现 天气预报系统是一个非常实用的应用程序,可以帮助我们了解未来几天的天气情况。本攻略将介绍如何使用Python编写一个简单的天气预报系统,包括如何获取天气数据、如何进行数据解析和展示等。 获取天气数据 我们可以使用Python的requests库来获取天气数据。以下是一个示例代码,用于获取北京市的天气数据: import r…

    python 2023年5月15日
    00
  • Python中return self的用法详解

    标题 Python中return self的用法详解 简介 在Python中,return语句用于将函数的结果返回给调用者。但是,有时候我们希望返回的不是一个具体的值,而是函数调用者本身。这种情况下,我们可以使用return self。 什么是self 在Python中,self是指类实例对象本身。在类定义的方法中,通常将self作为第一个参数。在实例方法内…

    python 2023年6月5日
    00
  • python3 常见解密加密算法实例分析【base64、MD5等】

    下面是详细讲解“Python3常见解密加密算法实例分析【base64、MD5等】”的完整攻略,包括算法原理、Python实现和两个示例说明。 算法原理 Base64 Base64是一种将二进制数据编码为ASCII字符的编码方式,常用于在网络上传输数据。Base64编码的原理是将3个字节的二进制数据分成4组,每组6位,然后将每组6位转换为一个可打的ASCII字…

    python 2023年5月14日
    00
  • Python 十个字典用法使用技巧归纳

    Python 十个字典用法使用技巧归纳 字典(dictionary)是 Python 中非常常用的数据类型之一,它以键值对的形式存储数据,使得数据的访问和操作更加方便。在本文中,我们将介绍 Python 字典的十种使用技巧。 1. 创建字典 Python 字典可以使用花括号 {} 或者 dict() 函数来创建。 通过花括号创建字典 dict1 = {&qu…

    python 2023年5月13日
    00
  • Python中Permission denied的解决方案

    在Python中,当我们尝试访问或修改文件或目录时,有时会遇到Permission denied错误。这通常是由于文件或目录的权限设置不正确所致。以下是决Python中Permission denied错误的完整攻略: 1. 检查文件或目录权限 当我们尝试访问或修改文件或目录时,应该确保文件或目录权限设置正确。我们可以使用以下命令来检查文件或目录的权限设置:…

    python 2023年5月13日
    00
  • python爬虫今日热榜数据到txt文件的源码

    在本攻略中,我们将介绍如何使用Python爬虫获取今日热榜数据,并将数据保存到txt文件中。以下是一个完整攻略,包括两个示例。 步骤1:分析网页结构 首先,我们需要分析今日热榜页面的HTML结构。我们可以使用Chrome浏览器的开发者工具来查看页面的HTML结构。 在Chrome浏览器中,我们可以按F12键打开开发者工具。然后,我们可以选择“Elements…

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