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

yizhihongxing

下面是关于“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 matplotlib可视化绘图详解

    Python matplotlib可视化绘图详解 介绍 Python 是一种非常流行的编程语言,拥有广泛的应用场景,其中之一就是用于数据分析和可视化。在数据可视化领域,Python 的一个常用库是 matplotlib。 matplotlib 是一个绘图库,能够提供各种类型的二维图形、三维图形以及动画效果,是 Python 语言中一款非常强大的数据可视化工具…

    python 2023年6月3日
    00
  • Python多进程机制实例详解

    Python多进程机制实例详解 什么是进程? 进程是指在操作系统中独立运行的一个程序,一个程序可以拥有多个进程。 为什么使用多进程? 多进程可以提高程序运行效率,因为多个进程可以同时运行。此外,多进程可以让程序更加稳定,如果一个进程崩溃了,其它进程还可以继续运行。 如何使用Python实现多进程? 使用Python内置的multiprocessing模块可以…

    python 2023年5月13日
    00
  • 基于python写个国庆假期倒计时程序

    当我们想要倒计算时间或日程等信息的时候,倒计时程序是一个很管用的工具。在这里,我们将会讲解如何用 Python 编写一个国庆假期倒计时程序。 步骤一:导入模块 Python 有内置的 datetime 模块,它提供了一个 datetime 类来操作日期和时间。在代码的第一行,我们可以导入 datetime 模块。 import datetime 步骤二:获取…

    python 2023年6月2日
    00
  • python excel多行合并的方法

    下面我将详细讲解“pythonexcel多行合并的方法”的完整实例教程。 标题 问题 如何用Python的pandas库将Excel表格中的多行合并成一行? 解决方法 使用pandas库,可以轻松实现多行合并功能,具体操作步骤如下: 1.导入pandas模块 import pandas as pd 2.读取Excel文件 df = pd.read_excel…

    python 2023年5月13日
    00
  • python操作pptx设置title字体大小插入全屏图片A4尺寸实例一枚

    pip install python-pptx 安装好pptx,设置标题最大的作用是ppt里面的摘要视图显示摘要文字 参考:https://python-pptx.readthedocs.io/en/latest/   from pptx import Presentation from pptx.util import Cm pwidth,pheight=…

    python 2023年4月22日
    00
  • Python实现清理重复文件功能的示例代码

    下面我就来详细讲解一下“Python实现清理重复文件功能的示例代码”的完整攻略。 1. 核心思路 清理重复文件的核心思路是通过比对文件内容是否相同来判断文件是否重复,如果文件内容相同,则只保留其中一个文件,其他重复的文件都可以删除。 所以我们需要先将文件按照文件内容的 hash 值进行分组,每个分组中的文件 hash 值相同。然后在每个分组中将除第一个文件之…

    python 2023年6月5日
    00
  • python 字符串详解

    Python 字符串详解 字符串是Python中最常用的数据类型之一。在本文中,我们将共同探讨Python中字符串的基本概念、常见操作以及字符串格式化等方面。 字符串的定义 Python字符串是用一对引号(单引号或双引号)括起来的文本数据,例如: str1 = ‘This is a string.’ str2 = "这是一个字符串。" 另…

    python 2023年6月5日
    00
  • 利用一个简单的例子窥探CPython内核的运行机制

    这里提供一份完整的攻略,帮助你利用一个简单的例子窥探CPython内核的运行机制。 什么是CPython? CPython是一种常见的Python解释器,它是使用C语言编写的,是Python开发高性能应用程序的首选方案。在CPython中,Python代码先被解析,然后被转化成AST抽象语法树后再被编译成字节码,最后字节码被执行。 第一步:创建一个简单的Py…

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