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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
老生常谈Python startswith()函数与endswith函数
Sep 08 Python
对python cv2批量灰度图片并保存的实例讲解
Nov 09 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
java中的控制结构(if,循环)详解
Jun 26 Python
如何安装2019Pycharm最新版本(详细教程)
Sep 26 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
May 18 Python
python中np是做什么的
Jul 21 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
Python几种酷炫的进度条的方式
Apr 11 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索引问题
2008/06/07 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
php图像验证码生成代码
2017/06/08 PHP
javascript 原型继承介绍
2011/08/30 Javascript
js三种排序算法分享
2012/08/16 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
jQuery1.9.1源码分析系列(十六)ajax之ajax框架
2015/12/04 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
详解使用mpvue开发github小程序总结
2018/07/25 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
简介Python中用于处理字符串的center()方法
2015/05/18 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
详解python中*号的用法
2019/10/21 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
党员国庆节演讲稿范文2014
2014/09/21 职场文书
民间个人借款协议书
2014/09/30 职场文书
教师个人师德总结
2015/02/06 职场文书
档案工作个人总结
2015/03/03 职场文书
淮海战役观后感
2015/06/11 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
Vue3中的Refs和Ref详情
2021/11/11 Vue.js