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的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python实现类的创建与使用方法示例
Jul 25 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
Python 实现在文件中的每一行添加一个逗号
Apr 29 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
pyqt5打包成exe可执行文件的方法
May 14 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学习教程之第2天
2008/06/15 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
php 深入理解strtotime函数的使用详解
2013/05/23 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
jquery代码规范让代码越来越好看
2017/02/03 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
pageGroup.js实现分页功能
2019/07/27 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
Python日志模块logging简介
2015/04/13 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
Python封装原理与实现方法详解
2018/08/28 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
python是否适合网页编程详解
2019/10/04 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
物流仓管员工作职责
2014/01/06 职场文书
年度考核评语
2014/01/19 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
英语分层教学实施方案
2014/06/15 职场文书
公司离职证明范本(汇总)
2014/09/10 职场文书
2014年大学生工作总结
2014/11/20 职场文书
python用字节处理文件实例讲解
2021/04/13 Python
Python中glob库实现文件名的匹配
2021/06/18 Python
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫