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 相关文章推荐
Python3中的2to3转换工具使用示例
Jun 12 Python
Python实现在线音乐播放器
Mar 03 Python
python 使用get_argument获取url query参数
Apr 28 Python
Python字符串处理实现单词反转
Jun 14 Python
如何实现删除numpy.array中的行或列
May 08 Python
python 多个参数不为空校验方法
Feb 14 Python
在django admin中添加自定义视图的例子
Jul 26 Python
django框架F&Q 聚合与分组操作示例
Dec 12 Python
python pptx复制指定页的ppt教程
Feb 14 Python
执行Python程序时模块报错问题
Mar 26 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
Dec 24 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
CodeIgniter钩子用法实例详解
2016/01/20 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
javascript天然的迭代器
2010/10/29 Javascript
浅谈Javascript面向对象编程
2011/11/15 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery UI设置固定日期选择特效代码分享
2015/08/27 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
jquery滚动条插件(可以自定义)
2016/12/11 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
图文讲解用vue-cli脚手架创建vue项目步骤
2019/02/12 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
详解React 元素渲染
2020/07/07 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
详解Python的Django框架中的模版继承
2015/07/16 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
基于python历史天气采集的分析
2019/02/14 Python
Python实现Restful API的例子
2019/08/31 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
2020/03/12 Python
详解Python中的Lock和Rlock
2021/01/26 Python
使用HTML和CSS实现的标签云效果(附demo)
2021/02/03 HTML / CSS
在什么时候需要使用"常引用"
2015/12/31 面试题
C#笔试题和英文面试题
2013/02/07 面试题
产品销售员岗位职责
2013/12/18 职场文书
检举信的格式及范文
2014/04/04 职场文书
四风自我剖析材料
2014/09/30 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
护士个人总结范文
2015/02/13 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python
美元符号 $
2022/02/17 杂记
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js