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解析html开发库pyquery使用方法
Feb 07 Python
python获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Python中单例模式总结
Feb 20 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
Mar 14 Python
Python使用win32 COM实现Excel的写入与保存功能示例
May 03 Python
详解Pytorch 使用Pytorch拟合多项式(多项式回归)
May 24 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
Dec 12 Python
python实现图片九宫格分割
Mar 07 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
Python Map 函数的使用
Aug 28 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 ADODB使用方法集锦
2008/03/25 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
Laravel学习教程之request validation的编写
2017/10/25 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
PHP 超级全局变量相关总结
2020/06/30 PHP
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
简介AngularJS的HTML DOM支持情况
2015/06/17 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
python构建基础的爬虫教学
2018/12/23 Python
Python3 安装PyQt5及exe打包图文教程
2019/01/08 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Python logging模块原理解析及应用
2020/08/13 Python
python 实用工具状态机transitions
2020/11/21 Python
关于人生的感言
2014/01/17 职场文书
财务简历的自我评价
2014/03/05 职场文书
网络编辑求职信
2014/04/30 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
Mysql基础之常见函数
2021/04/22 MySQL
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
Rust中的Struct使用示例详解
2022/08/14 Javascript