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这里,实现的功能是:在定点和移动中的鼠标所在处画一条线
如图所示:
Python3使用PyQt5制作简单的画板/手写板实例
鼠标按住移动的话,线也会跟着移动,从这个简单的程序开始理解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中,使用一个列表保存所有移动过的点,然后要画线的时候,循环遍历列表,依次画出列表中点到定点之间的线即可。

效果如图所示:
Python3使用PyQt5制作简单的画板/手写板实例


'''
简单的画板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
投稿

猜你喜欢

  • 如何基于pythonnet调用halcon脚本

    2022-09-27 16:34:23
  • 使用pyqt 实现重复打开多个相同界面

    2021-08-19 12:33:43
  • 基于DataFrame筛选数据与loc的用法详解

    2021-09-13 04:37:32
  • 使用python对视频文件分辨率进行分组的实例代码

    2022-06-06 21:16:44
  • Python的numpy库下的几个小函数的用法(小结)

    2021-12-13 10:29:33
  • Python使用turtle库绘制小猪佩奇(实例代码)

    2021-09-21 08:45:30
  • Python深入学习之上下文管理器

    2023-03-27 19:09:43
  • numpy系列之数组重塑的实现

    2022-10-20 13:36:35
  • Python入门必须知道的11个知识点

    2023-12-19 05:32:47
  • Python动态加载模块的3种方法

    2023-12-22 21:33:29
  • PHP易混淆知识整理笔记

    2023-06-10 04:34:22
  • 正则表达式的基本概念

    2007-10-17 21:07:00
  • Python实现列表删除重复元素的三种常用方法分析

    2022-02-17 20:21:36
  • python 数据挖掘算法的过程详解

    2022-11-17 09:09:19
  • python实现取余操作的简单实例

    2021-08-21 01:00:51
  • Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)

    2021-06-29 20:05:21
  • 用"表情符号"做植入广告 是否可行呢?

    2009-02-23 13:07:00
  • PHP平滑关闭/重启的实现方法

    2023-10-05 08:48:29
  • Python中pass的作用与使用教程

    2023-05-05 23:05:05
  • Yii2框架实现登陆添加验证码功能示例

    2023-11-21 11:36:32
  • asp之家 网络编程 m.aspxhome.com