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实现发送邮件及附件功能
Mar 02 Python
python绘制散点图并标记序号的方法
Dec 11 Python
浅谈python3.x pool.map()方法的实质
Jan 16 Python
Python 实现数据结构中的的栈队列
May 16 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
python打造爬虫代理池过程解析
Aug 15 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
Python对Tornado请求与响应的数据处理
Feb 12 Python
Python实现发票自动校核微信机器人的方法
May 22 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
Python接收手机短信的代码整理
Aug 02 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+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
Prototype ObjectRange对象学习
2009/07/19 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python中的一些类型转换函数小结
2013/02/10 Python
python获取Linux下文件版本信息、公司名和产品名的方法
2014/10/05 Python
在Python中使用NLTK库实现对词干的提取的教程
2015/04/08 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
Python中异常重试的解决方案详解
2017/05/05 Python
浅谈numpy生成数组的零值问题
2018/11/12 Python
python适合人工智能的理由和优势
2019/06/28 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python assert关键字原理及实例解析
2019/12/13 Python
python操作cfg配置文件方式
2019/12/22 Python
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
Shell编程面试题
2012/05/30 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
实习求职信
2013/12/01 职场文书
护理专业自我鉴定
2014/01/30 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
2014年营销工作总结
2014/11/22 职场文书
专项资金申请报告
2015/05/15 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
MySQL学习之基础操作总结
2022/03/19 MySQL