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移位运算的实现 移位运算是指将一个二进制数向左或向右移动指定的位数,移动后的位用0填充。Python提供了左移位运算符(<<)和右移位运算符(>>)。 左移位算 左移位运算将一个二进制数向左移动指定的位数,移动后的空位用0填充。左移n位相当于将这个乘以的n次方。 a = 5 b = a << 2 print(b…

    python 2023年5月14日
    00
  • python 调用有道api接口的方法

    有道翻译API是一种常见的API接口,可以用于实现Python程序的翻译功能。本文将详细讲解如何使用Python调用有道API接口的完整攻略,包括使用requests和http.client两个示例。 使用requests调用有道API接口的示例 requests是一个Python HTTP库,可以用于发送HTTP请求和处理HTTP响应。以下是一个示例,演示…

    python 2023年5月15日
    00
  • 使用python查看五黄及罗猴

    应多为风水道友之要求,特在 https://github.com/china-testing/bazi 增加查看五黄及罗猴功能。 如何查看五黄 五黄是风水理气中九宫飞星中最凶之星,凡是修造、下葬都要避开。 首先要避开当年五黄的方向作为朝向。比如2023年,西北方向是五黄,不能朝向西北,也不能在房子西北方向附近动土。 其次五黄日,比如2023年5月7日,大忌挖…

    python 2023年5月4日
    00
  • python3读取csv和xlsx文件的实例

    当然,我很乐意为您提供“Python3读取CSV和XLSX文件的实例”的完整教程和两个示例说明。让我们开始吧! Python3读取CSV和XLSX文件的实例 在Python中读取CSV和XLSX文件是一项广泛使用的任务,因为CSV和XLSX文件广泛用于存储数据,包括数据的输出和输入。Python标准库中的csv和openpyxl模块为读取这些文件提供了内置功…

    python 2023年5月13日
    00
  • python正则表达式中匹配次数与贪心问题详解(+ ?*)

    Python正则表达式中匹配次数与贪心问题详解(+ ? *) 正则表达式是一种强大的文本处理工具,可以用于各种文本处理任务,如数据清洗、本分、信息提取等。在Python中,我们可以使用模块来操作正则表达式。本攻略将详细讲解Python正则达式中匹配次数与贪心问题,包括正则表达式中的+、?、*等符号的用法,以及贪心问题的解决方法。 正则表达式中的+、?、*符号…

    python 2023年5月14日
    00
  • 使用python处理一万份word表格简历操作

    下面会为您提供一个使用Python处理一万份Word表格简历的完整实例教程。 准备工作 安装必要的库文件 我们需要从Python中调用Pywin32库来操作Word文档。您可以通过以下命令来安装: pip install pypiwin32 准备样例简历 准备样例简历,要求简历中需要包含表格形式的个人信息、教育经历、工作经历等内容。为了便于操作示例,准备至少…

    python 2023年5月14日
    00
  • python爬虫 execjs安装配置及使用

    下面是关于“Python爬虫execjs安装配置及使用”的完整攻略。 1. execjs 简介 execjs是Python的一个库,它可以用来执行JavaScript代码。它的使用非常简单,只需要传入一个JavaScript脚本和需要执行的函数名就可以了。 execjs适用于使用JS编写的一些算法,或者使用JS实现的网站的信息抓取。 2. 安装execjs …

    python 2023年5月13日
    00
  • Python实现一个优先级队列的方法

    下面是“Python实现一个优先级队列的方法”的完整攻略,步骤如下: 步骤一:理解优先级队列的概念 优先级队列是一种数据结构,它可以按照优先级来排列元素。在优先级队列中,每个元素都有一个优先级,最高优先级的元素最先被处理,而优先级较低的元素后被处理。优先级队列可以用来解决很多实际问题,比如任务调度、事件处理等。 步骤二:选择合适的实现方式 Python中有多…

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