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装饰器使用方法实例
Nov 21 Python
在python中的socket模块使用代理实例
May 29 Python
python操作xml文件详细介绍
Jun 09 Python
Python Sleep休眠函数使用简单实例
Feb 02 Python
Python自动发邮件脚本
Mar 31 Python
Python实现中一次读取多个值的方法
Apr 22 Python
python正则表达式实例代码
Mar 03 Python
python如何判断IP地址合法性
Apr 05 Python
Python中格式化字符串的四种实现
May 26 Python
python中pickle模块浅析
Dec 29 Python
Python try except else使用详解
Jan 12 Python
python如何进行基准测试
Apr 26 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
javascript 数组学习资料收集
2010/04/11 Javascript
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
微信小程序实现留言板功能
2018/11/02 Javascript
JavaScript函数的4种调用方法实例分析
2019/03/05 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
详解Python中表达式i += x与i = i + x是否等价
2017/02/08 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
Django实现文件上传下载
2019/10/06 Python
Pytorch模型转onnx模型实例
2020/01/15 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
HTML5中判断横屏竖屏的方法(移动端)
2016/08/04 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
期末自我鉴定
2014/01/23 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
一条 SQL 语句执行过程
2022/03/17 MySQL