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 字符串格式化输出(format/printf)
Jul 21 Python
python 使用get_argument获取url query参数
Apr 28 Python
插入排序_Python与PHP的实现版(推荐)
May 11 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
python爬虫获取京东手机图片的图文教程
Dec 29 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
Flask框架配置与调试操作示例
Jul 23 Python
Python中函数参数匹配模型详解
Jun 09 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
python从Oracle读取数据生成图表
Oct 14 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 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
基于pear auth实现登录验证
2010/02/26 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript charCodeAt方法入门实例(用于取得指定位置字符的Unicode编码)
2014/10/17 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
轮播的简单实现方法
2016/07/28 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
详解Vue.js动态绑定class
2016/12/20 Javascript
angularjs 实现带查找筛选功能的select下拉框实例
2017/01/11 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
基于casperjs和resemble.js实现一个像素对比服务详解
2018/01/10 Javascript
Vue+element-ui 实现表格的分页功能示例
2018/08/18 Javascript
重学JS之显示强制类型转换详解
2019/06/30 Javascript
微信小程序列表时间戳转换实现过程解析
2019/10/12 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
原生js实现照片墙效果
2020/10/13 Javascript
python+os根据文件名自动生成文本
2019/03/21 Python
利用Python模拟登录pastebin.com的实现方法
2019/07/12 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
浅谈matplotlib中FigureCanvasXAgg的用法
2020/06/16 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
工艺工程师工作职责
2013/11/23 职场文书
旅游业大学生创业计划书
2014/01/31 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL