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模块顶层运行的代码引起的一个Bug
Jul 04 Python
Python实现去除代码前行号的方法
Mar 10 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
python如何将图片转换为字符图片
Aug 19 Python
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
搞清楚 Python traceback的具体使用方法
May 13 Python
python实现多进程通信实例分析
Sep 01 Python
Django Admin中增加导出Excel功能过程解析
Sep 04 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
Python 实现键盘鼠标按键模拟
Nov 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
php中Ctype函数用法详解
2014/12/09 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
JS中toFixed()方法引起的问题如何解决
2012/11/20 Javascript
Javacript实现颜色梯度变化和渐变的效果代码
2013/05/31 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
webpack+react+antd脚手架优化的方法
2018/04/02 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
详谈python在windows中的文件路径问题
2018/04/28 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
8种常用的Python工具
2020/08/05 Python
Python如何发送与接收大型数组
2020/08/07 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
销售主管的自我评价分享
2014/01/03 职场文书
好书伴我成长演讲稿
2014/05/14 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
父亲婚礼答谢词
2015/01/04 职场文书
大四学生个人总结
2015/02/15 职场文书
技术员个人工作总结
2015/03/03 职场文书
2019银行竞聘书
2019/06/21 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python