PyQt5实现画布小程序


Posted in Python onMay 30, 2020

本文实例为大家分享了PyQt5实现画布小程序的具体代码,供大家参考,具体内容如下

实现的效果图如下:

PyQt5实现画布小程序

该实例中,涉及到的知识点有:

1.PyQt5 的常用的布局方式,这里使用到了QVBoxLayout,QHBoxLayout,如何灵活运用这些布局;

2.常用组件的使用方法,这里使用到了QPushButton, QLabel, QPixmap;

3.使用QPainter进行绘制;

4.事件与槽;

主要代码如下:

import random
import sys
 
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QPixmap, QPainter, QColor
from PyQt5.QtWidgets import QMainWindow, QLabel, QApplication, QPushButton, QWidget, QVBoxLayout, QHBoxLayout
 
SPRAY_PARTICLES = 100
SPRAY_DIAMMETER = 10
 
COLORS = [
  '#000000', '#141923', '#414168', '#3a7fa7', '#35e3e3', '#8fd970', '#5ebb49',
  '#458352', '#dcd37b', '#fffee5', '#ffd035', '#cc9245', '#a15c3e', '#a42f3b',
  '#f45b7a', '#c24998', '#81588d', '#bcb0c2', '#ffffff',
]
 
 
class QPlatteButton(QPushButton):
  def __init__(self, color):
    super().__init__()
 
    self.setFixedSize(QSize(24, 24))
    self.color = color
    self.setStyleSheet("background-color: %s" % self.color)
 
 
class Canvas(QLabel):
  def __init__(self):
    super().__init__()
 
    canvas = QPixmap(1200, 800)
    canvas.fill(QColor('white'))
    self.setPixmap(canvas)
 
    self.last_x, self.last_y = None, None
    self.pen_color = QColor('#000')
 
  def set_pen_color(self, c):
    self.pen_color = QColor(c)
 
  def mouseReleaseEvent(self, *args, **kwargs):
    """
    松开鼠标事件
    """
    self.last_x, self.last_y = None, None
 
  def mouseMoveEvent(self, e):
    """
    移动鼠标事件
    """
    if self.last_x is None:
      self.last_x = e.x()
      self.last_y = e.y()
      return
 
    painter = QPainter(self.pixmap())
    pen = painter.pen()
    pen.setWidth(4)
    pen.setColor(self.pen_color)
    painter.setPen(pen)
    painter.drawLine(self.last_x, self.last_y, e.x(), e.y())
    painter.end()
    self.update()
 
    # update the origin for next time
    self.last_x = e.x()
    self.last_y = e.y()
 
  # def mouseMoveEvent(self, e):
  #   painter = QPainter(self.pixmap())
  #   p = painter.pen()
  #   p.setWidth(1)
  #   p.setColor(self.pen_color)
  #   painter.setPen(p)
  #
  #   for n in range(SPRAY_PARTICLES):
  #     xo = random.gauss(0, SPRAY_DIAMMETER)
  #     yo = random.gauss(0, SPRAY_DIAMMETER)
  #     painter.drawPoint(e.x() + xo, e.y() + yo)
  #
  #   self.update()
 
 
class MainWindow(QMainWindow):
  def __init__(self):
    super().__init__()
    self.setWindowTitle("画板小程序")
 
    self.canvas = Canvas()
 
    widget = QWidget()
    vlayout = QVBoxLayout()
    widget.setLayout(vlayout)
 
    vlayout.addWidget(self.canvas)
 
    palette = QHBoxLayout()
    vlayout.addLayout(palette)
    self.add_palette_buttons(palette)
    self.setCentralWidget(widget)
 
  def add_palette_buttons(self, layout):
    """
    在水平布局中放入一行调色板
    """
    for c in COLORS:
      b = QPlatteButton(c)
      b.pressed.connect(lambda c=c: self.canvas.set_pen_color(c))
      layout.addWidget(b)
 
 
if __name__ == '__main__':
  app = QApplication(sys.argv)
  window = MainWindow()
  window.move(120, 120)
  window.show()
  app.exec_()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
python ipset管理 增删白名单的方法
Jan 14 Python
python多进程读图提取特征存npy
May 21 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
python 实现视频 图像帧提取
Dec 10 Python
解决django接口无法通过ip进行访问的问题
Mar 27 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
pytorch 多分类问题,计算百分比操作
Jul 09 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
python3中布局背景颜色代码分析
Dec 01 Python
opencv实现图像几何变换
Mar 24 Python
Java ExcutorService优雅关闭方式解析
May 30 #Python
Python定时任务APScheduler原理及实例解析
May 30 #Python
Python生成器next方法和send方法区别详解
May 30 #Python
Python新手学习标准库模块命名
May 29 #Python
Django Path转换器自定义及正则代码实例
May 29 #Python
Python新手如何理解循环加载模块
May 29 #Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
You might like
PHP 数组基础知识小结
2010/08/20 PHP
destoon常用的安全设置概述
2014/06/21 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
PHP单链表的实现代码
2016/07/05 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
js png图片(有含有透明)在IE6中为什么不透明了
2010/02/07 Javascript
js操作二级联动实现代码
2010/07/27 Javascript
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
在VS2008中使用jQuery智能感应的方法
2010/12/30 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
JavaScript 中的 this 简单规则
2017/09/19 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
phantomjs导出html到pdf的方法总结
2017/10/19 Javascript
JavaScript中Array方法你该知道的正确打开方法
2018/09/11 Javascript
vue根据值给予不同class的实例
2018/09/29 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
python简单实现旋转图片的方法
2015/05/30 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python OpenCV获取视频的方法
2018/02/28 Python
Windows下Anaconda2安装NLTK教程
2018/09/19 Python
Python遍历字典方式就实例详解
2019/12/28 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
个人现实表现材料
2014/02/04 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
承诺书样本
2014/08/30 职场文书
社区党务工作总结2015
2015/05/19 职场文书