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中的ctime()方法使用教程
May 22 Python
对Python中type打开文件的方式介绍
Apr 28 Python
django 修改server端口号的方法
May 14 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python对象中__del__方法起作用的条件详解
Nov 01 Python
浅谈python脚本设置运行参数的方法
Dec 03 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
Python操作SQLite/MySQL/LMDB数据库的方法
Nov 07 Python
python实现图片上添加图片
Nov 26 Python
python实现3D地图可视化
Mar 25 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
Jul 31 Python
浅谈keras.callbacks设置模型保存策略
Jun 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
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
2014/07/25 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
用jQuery实现检测浏览器及版本的脚本代码
2008/01/22 Javascript
jQuery在vs2008及js文件中的无智能提示的解决方法
2010/12/30 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
javascript编写简易计算器
2017/05/06 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
TensorFLow 不同大小图片的TFrecords存取实例
2020/01/20 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
python环境下安装opencv库的方法
2020/03/05 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
行政助理的职责
2013/11/14 职场文书
安全生产责任书
2014/03/12 职场文书
趣味运动会通讯稿
2015/07/18 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
使用nginx动态转换图片大小生成缩略图
2021/03/31 Servers
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle
vue项目多环境配置(.env)的实现
2021/07/21 Vue.js
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS