下面是关于“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技术站