Python3使用PyQt5制作简单的画板/手写板实例
作者:PyLearn 时间:2022-01-11 15:21:30
1.前言
版本:Python3.6.1 + PyQt5
写一个程序的时候需要用到画板/手写板,只需要最简单的那种。原以为网上到处都是,结果找了好几天,都没有找到想要的结果。
网上的要么是非python版的qt程序(要知道qt版本之间差异巨大,还是非同一语言的),改写难度太大。要么是PyQt4的老程序,很多都已经不能在PyQt5上运行了。要么是大神写的特别复杂的程序,简直是直接做出了一个Windows自带的画图版,只能膜拜~
于是我只能在众多代码中慢慢寻找自己需要的那一小部分,然后不断地拼凑,不断地理解大神的代码,最终做出这么一个简单的画板。望着这个简单的画板我真是泪流满面,中间数十次拼不对拼不全导致程序无数次崩溃,差点就放弃了......
2.简单的画板1.0
在简单的画板1.0这里,实现的功能是:在定点和移动中的鼠标所在处画一条线
如图所示:
鼠标按住移动的话,线也会跟着移动,从这个简单的程序开始理解PyQt5的运行机制吧。
'''
简单的画板1.0
功能:在定点和移动中的鼠标所在处画一条线
作者:PyLearn
最后修改日期: 2017/10/18
'''
import sys
from PyQt5.QtWidgets import (QApplication, QWidget)
from PyQt5.QtGui import (QPainter, QPen)
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
#resize设置宽高,move设置位置
self.resize(400, 300)
self.move(100, 100)
self.setWindowTitle("简单的画板1.0")
#setMouseTracking设置为False,否则不按下鼠标时也会跟踪鼠标事件
self.setMouseTracking(False)
#设置两个变量接收移动中的点的x、y坐标
self.pos_x = 20
self.pos_y = 20
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.black, 2, Qt.SolidLine)
painter.setPen(pen)
#定点(20, 20) 到 (self.pos_x, self.pos_y)之间画线
painter.drawLine(20, 20, self.pos_x, self.pos_y)
painter.end()
def mouseMoveEvent(self, event):
'''
按住鼠标移动事件:更新pos_x和pos_y的值
调用update()函数在这里相当于调用paintEvent()函数
每次update()时,之前调用的paintEvent()留下的痕迹都会清空
'''
self.pos_x = event.pos().x()
self.pos_y = event.pos().y()
self.update()
if __name__ == "__main__":
app = QApplication(sys.argv)
pyqt_learn = Example()
pyqt_learn.show()
app.exec_()
3.简单的画板2.0
从以上的简单的画板1.0程序的运行可以发现,按住鼠标移动的时候,线也会跟着移动,那如何让之前的线留下痕迹,而不是消失呢?
在简单的画板2.0中,使用一个列表保存所有移动过的点,然后要画线的时候,循环遍历列表,依次画出列表中点到定点之间的线即可。
效果如图所示:
'''
简单的画板2.0
功能:
在定点和移动中的鼠标所在处画一条线
并将画过的线都保留在窗体上
作者:PyLearn
最后修改日期: 2017/10/18
'''
import sys
from PyQt5.QtWidgets import (QApplication, QWidget)
from PyQt5.QtGui import (QPainter, QPen)
from PyQt5.QtCore import Qt
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
#resize设置宽高,move设置位置
self.resize(400, 300)
self.move(100, 100)
self.setWindowTitle("简单的画板2.0")
#setMouseTracking设置为False,否则不按下鼠标时也会跟踪鼠标事件
self.setMouseTracking(False)
'''
要想将画过的线都保留在窗体上
需要一个列表来保存所有移动过的点
'''
self.pos_xy = []
def paintEvent(self, event):
painter = QPainter()
painter.begin(self)
pen = QPen(Qt.black, 2, Qt.SolidLine)
painter.setPen(pen)
#循环遍历self.pos_xy中每个点,然后画点到定点之间的线
for pos_tmp in self.pos_xy:
painter.drawLine(20, 20, pos_tmp[0], pos_tmp[1])
painter.end()
def mouseMoveEvent(self, event):
'''
按住鼠标移动事件:将当前点添加到pos_xy列表中
调用update()函数在这里相当于调用paintEvent()函数
每次update()时,之前调用的paintEvent()留下的痕迹都会清空
'''
#中间变量pos_tmp提取当前点
pos_tmp = (event.pos().x(), event.pos().y())
#pos_tmp添加到self.pos_xy中
self.pos_xy.append(pos_tmp)
self.update()
if __name__ == "__main__":
app = QApplication(sys.argv)
pyqt_learn = Example()
pyqt_learn.show()
app.exec_()
4.简单的画板3.0
来源:http://www.cnblogs.com/PyLearn/archive/2017/10/18/7689170.html
标签:python,PyQt5,画板,手写板
0
投稿
猜你喜欢
详解IWinter 一个路由转控制器的 Nodejs 库
2024-05-03 15:56:03
JSP页面传参出现中文乱码的解决方案
2023-06-13 12:53:03
python2和python3实现在图片上加汉字的方法
2021-08-16 05:46:29
Python文件的操作示例的详细讲解
2023-11-20 17:54:55
MySQL Order By用法
2011-01-04 19:50:00
PHP未登录自动跳转到登录页面
2023-11-15 07:39:11
tensorflow实现训练变量checkpoint的保存与读取
2023-12-15 18:10:33
Python+Pygame实战之疯狂吃水果游戏的实现
2021-09-17 11:37:58
Python数字图像处理基础直方图详解
2021-02-12 08:21:55
基于vue-resource jsonp跨域问题的解决方法
2023-07-02 16:33:44
Jinja2实现模板渲染与访问对象属性流程详解
2022-09-18 14:44:20
利用python发送和接收邮件
2022-01-23 10:22:07
python 实现dict转json并保存文件
2022-04-17 10:24:17
Yahoo!上的小秘密
2007-08-23 09:48:00
探讨:如何查看和获取SQL Server实例名
2024-01-18 03:47:42
利用phpmyadmin设置mysql的权限方法
2023-11-24 02:12:46
用Python一键搭建Http服务器的方法
2021-08-09 19:36:32
mysql 8.0.18 压缩包安装及忘记密码重置所遇到的坑
2024-01-28 18:01:35
如何在golang中使用shopspring/decimal来处理精度问题
2024-05-21 10:24:12
Bootstrap modal使用及点击外部不消失的解决方法
2024-04-10 13:56:45