pygam第3课——画图小程序

news2024/12/23 6:04:31

前言:我们前两节课已经学习了,界面的设计、图片的加载、那么今天我们将继续学习pygame的基础知识,我们的今天学习的内容是:鼠标滑动时坐标的实时获取鼠标的移动事件鼠标的点击事件图形绘制等。希望大家能

搭建界面,如下如:

**- 5个功能小图标
- 1、删除
- 2、画笔加粗
- 3、画笔减细
- 4、保存
- 5、橡皮擦

  • 6个不同颜色的小方块代表调色板**
    在这里插入图片描述

图片素材自取:

画笔加粗图标:点我保存
在这里插入图片描述
删除图标:点我保存
在这里插入图片描述
画笔减细图标:点我保存
在这里插入图片描述
橡皮擦图标:点我保存
在这里插入图片描述

保存图标:点我保存
在这里插入图片描述

背景(自己裁剪一下,把我的水印去掉)

在这里插入图片描述

图片的坐标,我已经给到:

sc.blit(up, (0, 0))
sc.blit(clear, (100, 50))
sc.blit(add, (180, 50))
sc.blit(cut, (260, 50))
sc.blit(eraser, (340, 50))
sc.blit(save, (420, 50))

小方块的制作方法是:

'''
参数:作用
sc             : 这是窗口对象
(r,g,b)        :rbg颜色,每个数字0- 255之间
(x, y, 宽, 高) :第1、2代表坐标,第3、4是小方块的宽和高
'''
pygame.draw.rect(sc, (255, 0, 0), (520, 30, 40, 40))
pygame.draw.rect(sc, (0, 255, 0), (580, 30, 40, 40))
pygame.draw.rect(sc, (0, 0, 255), (640, 30, 40, 40))
pygame.draw.rect(sc, (255, 255, 0), (520, 80, 40, 40))
pygame.draw.rect(sc, (0, 255, 255), (580, 80, 40, 40))
pygame.draw.rect(sc, (0, 0, 0), (640, 80, 40, 40))

其他的图形代码,可以上官网查看,点我查看

在这里插入图片描述

在这里插入图片描述

界面搞定

  • 图片有了,坐标有了,小方块颜色坐标也有了,那我们将界面搭建出来
    在这里插入图片描述

界面代码:

# 用矩形函数绘制一个按钮,当鼠标点击按钮后,按钮随机变换一种颜色。
import pygame, time, sys
pygame.init()
a_list = ["./image/bg.jpg",
          "./image/add.png",
          "./image/cut.png",
          "./image/clear.png",
          "./image/eraser.png",
          "./image/save.png"]

bg = (255, 255, 255)  # RGB颜色 红绿蓝三原色
sc = pygame.display.set_mode((800, 600))
sc.fill(bg)
up = pygame.image.load(a_list[0])
add = pygame.image.load(a_list[1])
cut = pygame.image.load(a_list[2])
clear = pygame.image.load(a_list[3])
eraser = pygame.image.load(a_list[-1])
save = pygame.image.load(a_list[-2])
pygame.display.set_caption("Draw")
while True:
    sc.blit(up, (0, 0))
    sc.blit(clear, (100, 50))
    sc.blit(add, (180, 50))
    sc.blit(cut, (260, 50))
    sc.blit(eraser, (340, 50))
    sc.blit(save, (420, 50))
    pygame.draw.rect(sc, (255, 0, 0), (520, 30, 40, 40))
    pygame.draw.rect(sc, (0, 255, 0), (580, 30, 40, 40))
    pygame.draw.rect(sc, (0, 0, 255), (640, 30, 40, 40))
    pygame.draw.rect(sc, (255, 255, 0), (520, 80, 40, 40))
    pygame.draw.rect(sc, (0, 255, 255), (580, 80, 40, 40))
    pygame.draw.rect(sc, (0, 0, 0), (640, 80, 40, 40))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

常用的鼠标事件

事件作用
pygame.MOUSEBUTTONDOWN鼠标按下
pygame.MOUSEMOTION鼠标移动
pygame.MOUSEBUTTONUP鼠标松开

更多的事件可以官网查看:点我

在这里插入图片描述

下面是让鼠标画出线条

分析:

  • 1、我们需要实时定位鼠标在窗口的坐标
x, y = pygame.mouse.get_pos()
  • 2、鼠标左击并滑动时,画出线条

  • 3、鼠标松开时,画线条停止

  • 4、pygame没有直接画实时线条的代码,但是有话圆形的代码,无限的点连起来就是线条

  • 5、设置一个变量,鼠标按下为True,为True时可以无限画点,为False时停止

line = False
  • 6、设置一个变量,控制画笔粗细
pen_size = 10
  • 7、设置一个变量,表示初始画笔颜色
pen_color = (255, 0, 0)

事件监测的用法

  • 一般写在主循环里:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        x, y = pygame.mouse.get_pos()
        if event.type == pygame.MOUSEBUTTONDOWN:
            pass
        elif event.type == 事件类型:
            检测到的执行代码
        elif event.type == 事件类型:
            检测到的执行代码
        elif event.type == 事件类型:
            检测到的执行代码
		...
		...

完整版代码:

在这里插入图片描述

# 用矩形函数绘制一个按钮,当鼠标点击按钮后,按钮随机变换一种颜色。
import pygame, time, sys

pygame.init()
a_list = ["./image/bg.jpg",
          "./image/add.png",
          "./image/cut.png",
          "./image/clear.png",
          "./image/eraser.png",
          "./image/save.png"]

bg = (255, 255, 255)  # RGB颜色 红绿蓝三原色
sc = pygame.display.set_mode((800, 600))
sc.fill(bg)
up = pygame.image.load(a_list[0])
add = pygame.image.load(a_list[1])
cut = pygame.image.load(a_list[2])
clear = pygame.image.load(a_list[3])
save = pygame.image.load(a_list[-1])
eraser = pygame.image.load(a_list[-2])
pygame.display.set_caption("Draw")
pen_color = (255, 0, 0)
pen_size = 10
line = False
while True:
    sc.blit(up, (0, 0))
    sc.blit(clear, (100, 50))
    sc.blit(add, (180, 50))
    sc.blit(cut, (260, 50))
    sc.blit(eraser, (340, 50))
    sc.blit(save, (420, 50))
    pygame.draw.rect(sc, (255, 0, 0), (520, 30, 40, 40))
    pygame.draw.rect(sc, (0, 255, 0), (580, 30, 40, 40))
    pygame.draw.rect(sc, (0, 0, 255), (640, 30, 40, 40))
    pygame.draw.rect(sc, (255, 255, 0), (520, 80, 40, 40))
    pygame.draw.rect(sc, (0, 255, 255), (580, 80, 40, 40))
    pygame.draw.rect(sc, (0, 0, 0), (640, 80, 40, 40))
    pygame.display.update()
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        x, y = pygame.mouse.get_pos()
        if event.type == pygame.MOUSEBUTTONDOWN:
            line = True

        elif event.type == pygame.MOUSEMOTION:
            if line == True:
                pygame.draw.circle(sc, pen_color, (x, y), pen_size)
                pygame.display.update()
        elif event.type == pygame.MOUSEBUTTONUP:
            line = False

        # 注释的是第三节的内容,整体是完整的代码
        if event.type == pygame.MOUSEBUTTONDOWN:
            # step1_1,实现清空功能
            if 100 < x < 140 and 50 < y < 90:
                sc.fill((255, 255, 255))
            # step2,实现宽度调整功能
            elif 180 < x < 220 and 50 < y < 90:
                pen_size += 2
            elif 260 < x < 300 and 50 < y < 90:
                pen_size -= 2
                # 画笔的粗细不能小于1
                if pen_size < 0:
                    pensize = 2
            # tep3,实现调色板与橡皮擦功能
            elif 520 < x < 560 and 30 < y < 70:
                pen_color = (255, 0, 0)
            elif 580 < x < 620 and 30 < y < 70:
                pen_color = (0, 255, 0)
            elif 640 < x < 680 and 30 < y < 70:
                pen_color = (0, 0, 255)
            elif 520 < x < 560 and 80 < y < 120:
                pen_color = (255, 255, 0)
            elif 580 < x < 620 and 80 < y < 120:
                pen_color = (0, 255, 255)
            elif 640 < x < 680 and 80 < y < 120:
                pen_color = (0, 0, 0)
            # 橡皮擦和画笔的原理是一样的,只是颜色与底色相同
            elif 340 < x < 380 and 50 < y < 90:
                pen_color = (255, 255, 255)

            # 知识进阶--保存作品
            elif 420 < x < 460 and 50 < y < 90:
                pygame.image.save(sc, "./我的作品.png")

希望对大家有帮助

致力于办公自动化的小小程序员一枚#

都看到这了,关注+点赞+收藏=不迷路!!

如果你想知道更多关于Python办公自动化的知识各位大佬给个关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/553844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

firewalld防火墙(又到了可以看日落和晚霞的日子了)

文章目录 一、firewalld概述二、firewalld和iptables的关系三、firewalld区域的概念四、firewalld数据处理流程五、firewalld检查数据包源地址的规则六、firewalld防火墙的配置种类1.运行时配置2.永久配置 七、firewalld防火墙的配置方法八、使用命令配置firewalld防火墙1.获取…

Ventoy 多合一启动盘制作工具神器 - 将多个系统 Win/PE/Linux 镜像装在1个U盘里

最近很多操作系统都纷纷发布了新版本&#xff0c;比如 Windows 11、Ubuntu、Deepin、优麒麟、CentOS、Debian 等等&#xff0c;对喜欢玩系统的人来说绝对是盛宴。 不过一般用 Rufus 等工具&#xff0c;一个 U 盘往往只能制作成一个系统的启动盘/安装盘&#xff0c;想要增加另一…

零入门kubernetes网络实战-33->基于nat+brigde+veth pair形成的跨主机的内网通信方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本文主要使用的技术是 nat技术Linux虚拟网桥虚拟网络设备veth pair来实现跨主机网桥的通信 1、测试环境介绍 两台centos虚拟机 # 查看操作系统版本 cat …

VIBRO-METER VM600 IRC4 智能继电器卡

额外的继电器&#xff0c;由来自MPC4和/或AMC8卡的多达86个输入的方程驱动&#xff0c;用于需要2oo3表决等更复杂的逻辑时8个继电器&#xff0c;可配置为8个SPDT或4个DPDT使用IRC4配置器软件进行完全软件配置继电器可配置为正常通电(NE)或正常断电(NDE)&#xff0c;具有可配置的…

小航助学GESP_C++一级模拟测试试卷(含题库答题软件账号)

GESP在线模拟训练系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 答案:A 第1题人们在使用计算机时所提到的 Windows 通常指的是&#xff08;&#xff09;。 A、操作系统B、多…

Science Bulletin:张占军教授团队提出“额叶保持,颞叶损伤” 假说解析成功认知老化

步入老年后&#xff0c;各项认知能力会逐渐衰退&#xff0c;我们把这一过程称之为认知老化。认知老化的过程与速度因人而异&#xff0c;走向阿尔茨海默病&#xff08;AD&#xff09;等认知障碍疾病为结局的属于病理认知老化&#xff0c;也就是经历轻度认知障碍阶段&#xff0c;…

【分享】PowerPoint如何设置保护和加密?

想保护自己做好的PPT&#xff0c;通常用的方法就是给PPT加密。下面我们来看看PPT加密保护方式有几种&#xff0c;具体如何操作。 打开PPT&#xff0c;点击菜单【文件】&#xff0c;再依次点击【信息】-【保护演示文稿】&#xff0c;就可以看到设置密码保护的5个选项。 选项1&a…

小航助学2022年NOC初赛图形化(小低组)(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题3.0分 删除编辑 答案:D 第1题如果想要从造型库中自选一个喜欢角色&#xff0c;可以点击哪个按钮呢&#xff1f; A、①B、②C…

Go语言核心编程-流程控制

第 5 章 程序流程控制 5.1 程序流程控制介绍 在程序中&#xff0c;程序运行的流程控制决定程序是如何执行的&#xff0c;是我们必须掌握的&#xff0c;主要有三大流程控 制语句。 顺序控制分支控制循环控制 5.2 顺序控制 程序从上到下逐行地执行&#xff0c;中间没有任何判…

智行致远丨美格智能亮相IOTE 2023 第十九届上海国际物联网展

5月17~19日&#xff0c;IOTE 2023第十九届上海国际物联网展盛大举办&#xff0c;全球超过350家参展企业到场展示先进的物联网技术和产品&#xff0c;盛况空前。本届展会以“IoT构建数字经济底座”为主题&#xff0c;将IoT技术引入实体经济领域&#xff0c;促进数字化转型和智能…

深度剖析JVM调优法则:从两大特性CPU、内存出发轻松掌握调优实战技巧

1、JDK自带工具 场景一、CPU过高 CPU占用过高排查思路&#xff1a;&#xff08;查进程->查线程列表->查线程堆栈&#xff09; step1&#xff1a;通过top命令查询占用CPU情况 top p.s.shiftp(大写的P-cpu排序) shiftm(大写的M-内存排序) step2&#xff1a;通过进程pi…

调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程,包括tasks.json和launch.json的配置

调试Dynaslam: Ubuntu系统下使用VS Code进行自动化调试Dynaslam的教程&#xff0c;包括tasks.json和launch.json的配置 修改CMakeLists.txt文件 将SET(CMAKE_BUILD_TYPE Release)修改为SET(CMAKE_BUILD_TYPE Debug)不开启编译优化&#xff0c;在编译选项中包含 -g 参数来启用…

springboot+vue冬奥会科普平台(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的冬奥会科普平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌…

探索iOS之多摄像头预览架构

在iOS13.0开始支持多摄像头预览AVCaptureMultiCamSession&#xff0c;然后iOS15.0增加支持摄像头画中画预览。在使用之前&#xff0c;我们通过isMultiCamSupported()判断是否支持多Camera同时预览。 一、Camera架构 1、Camera流水线 Camera由AVCaptureDeviceInput、AVCaptur…

【实践篇】领域驱动设计:DDD工程参考架构 | 京东云技术团队

背景 为什么要制定参考工程架构 不同团队落地DDD所采取的应用架构风格可能不同&#xff0c;并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构&#xff0c;或改进的DDD四层架构&#xff0c;有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构…

数据仓库选择Greenplum还是SQL-on-Hadoop

Greenplum和Hadoop都是为了解决大数据并行计算而出现的技术&#xff0c;二者的相似点在于&#xff1a; 分布式存储数据在多个节点上。采用分布式并行计算框架。支持向外扩展来提高整体的计算能力和存储容量。支持X86开放集群架构。 但两种技术在数据存储和计算方法上&#xf…

ADS-600树脂,除COD有机物树脂,大孔树脂型号,矿井水有机物

基于吸附功能的聚苯乙烯特种树脂 Tulsimer ADS-600 是一款没有离子官能基的&#xff0c;由交联聚苯乙烯合成的功能强大的吸附型树脂。 Tulsimer ADS-600 主要应用于水溶液中吸附酚及其化合物&#xff0c;氯代烃等含氯物质&#xff0c;表面活性剂&#xff0c;氨基酸&#…

Python系列模块之标准库OS详解

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 ​一、模块 1.1 模块的定义 1.2 模块的分类 1.3 模块的基本导入语法 二、Python中的包 三、标准库之os模块 实战&#xff1a; 钉钉告警应用 一、模块 1.1 模块的定义 Python 模块(Module)&a…

【JAVA程序设计】(C00139)基于Springboot+Thymeleaf的药店管理系统

基于SpringbootThymeleaf的药店管理系统 项目简介项目获取开发环境项目技术运行截图 项目简介 本项目为基于SpringbootThymeleaf的药店管理系统&#xff08;医院药品管理系统、医院管理系统&#xff09;&#xff0c;本项目主要功能为&#xff1a; 药品库存管理&#xff08;登记…

0基础学习VR全景平台篇第27章:场景管理-视角功能

大家好&#xff0c;欢迎收看蛙色平台免费教程&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 视角功能&#xff1a;指观看者打开场景时&#xff0c;默认展示的位置内容&#xff0c;可针对视角显示范围、视角远近范围进行设置。 应用场景&#xff1a;几乎每个作品…