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
投稿

猜你喜欢

  • 详解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
  • asp之家 网络编程 m.aspxhome.com