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数据可视化正态分布简单分析及实现代码
Dec 04 Python
python删除过期log文件操作实例解析
Jan 31 Python
基于MTCNN/TensorFlow实现人脸检测
May 24 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
用python写一个定时提醒程序的实现代码
Jul 22 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python如何使用input函数获取输入
Aug 06 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 Python
python 基于DDT实现数据驱动测试
Feb 18 Python
2021年最新用于图像处理的Python库总结
Jun 15 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 空格,换行,跳格使用说明
2009/12/18 PHP
php建立Ftp连接的方法
2015/03/07 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
基于JQuery的列表拖动排序实现代码
2013/10/01 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
js实现京东秒杀倒计时功能
2019/01/21 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
在vue中动态修改css其中一个属性值操作
2020/12/07 Vue.js
python使用wxpython开发简单记事本的方法
2015/05/20 Python
详解Python迭代和迭代器
2016/03/28 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
python flask实现分页的示例代码
2018/08/02 Python
解决在pycharm中显示额外的 figure 窗口问题
2019/01/15 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
巴西最大的珠宝连锁店:Vivara
2019/04/18 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
在校生汽车维修实习自我鉴定
2013/09/19 职场文书
读书心得体会
2013/12/28 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
财务会计岗位职责
2015/02/03 职场文书
楚门的世界观后感
2015/06/03 职场文书
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL