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 相关文章推荐
举例讲解Python中的死锁、可重入锁和互斥锁
Nov 05 Python
python psutil库安装教程
Mar 19 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
对django的User模型和四种扩展/重写方法小结
Aug 17 Python
Python搭建代理IP池实现检测IP的方法
Oct 27 Python
Python pickle模块实现对象序列化
Nov 22 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
python 读取.nii格式图像实例
Jul 01 Python
python文件名批量重命名脚本实例代码
Apr 22 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+mysql保存和输出文件
2006/10/09 PHP
初识laravel5
2015/03/02 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
Mac/Windows下如何安装Node.js
2013/11/22 Javascript
js window.onload 加载多个函数和追加函数详解
2014/01/08 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
从零学Python之入门(四)运算
2014/05/27 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
详解用python实现简单的遗传算法
2018/01/02 Python
python PyTorch预训练示例
2018/02/11 Python
pytorch cnn 识别手写的字实现自建图片数据
2018/05/20 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
Python os.access()用法实例
2019/02/18 Python
使用Python OpenCV为CNN增加图像样本的实现
2019/06/10 Python
python实现IOU计算案例
2020/04/12 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
Django实现简单的分页功能
2021/02/22 Python
CSS3绘制超炫的上下起伏波动进度加载动画
2016/04/21 HTML / CSS
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
机电专业大学生求职信
2013/10/04 职场文书
开学典礼致辞
2015/07/29 职场文书
2016教师年度考核评语大全
2015/12/01 职场文书
初中英语教学反思范文
2016/02/15 职场文书
MySQL 亿级数据导入导出及迁移笔记
2021/06/18 MySQL
Python OpenCV实现图形检测示例详解
2022/04/08 Python
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL