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进阶教程之动态类型详解
Aug 30 Python
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
python简单的函数定义和用法实例
May 07 Python
九步学会Python装饰器
May 09 Python
python实现百万答题自动百度搜索答案
Jan 16 Python
解读python如何实现决策树算法
Oct 11 Python
python爬取基于m3u8协议的ts文件并合并
Apr 26 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
python2.7的flask框架之引用js&css等静态文件的实现方法
Aug 22 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
利用Python制作动态排名图的实现代码
Apr 09 Python
python 基于opencv实现图像增强
Dec 23 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调用时间格式的参数详解
2013/06/06 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
JS中类或对象的定义说明
2014/03/10 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
layui的table中显示图片方法
2018/08/17 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
Vue 请求传公共参数的操作
2020/07/31 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python判断文件夹内是否存在指定后缀文件的实例
2019/06/10 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
Yahoo-PHP面试题1
2016/07/20 面试题
毕业生自我鉴定实例
2014/01/21 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
运动会闭幕词
2015/01/28 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
转正申请报告格式
2015/05/15 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
如何写一份成功的商业计划书
2019/06/25 职场文书
python之np.argmax()及对axis=0或者1的理解
2021/06/02 Python
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS