学生学python编程---实现贪吃蛇小游戏+原码

news2024/11/29 8:48:02

学生学python编程---实现贪吃蛇小游戏+原码

      • 前言
    • 主要设计
      • 1、蛇的表示
      • 2、蛇怎么移动?
      • 3、玩家控制小蛇移动功能的实现
      • 4、如何判定游戏结束?
    • 应用知识点
      • 1、python知识点
        • 1.1 列表
        • append()在列表未尾增加一个元素
        • del 删除最后一个元素
        • 在指定位置增加元素用insert()
        • 1.2 time 时间模块
        • 1.3 random模块
      • 2、pygamezero知识点
        • 2.1 游戏角色Acto
        • 2.2 输出中文字体
        • 2.3键盘控制
    • 功能截图
    • 代码实现
        • 1、蛇的表示
      • 2、蛇的前进移动
      • 3、控制移动方向
      • 4、游戏失败
      • 5、食物的随机出现
      • 6、游戏得分
    • 源码
    • 总结
    • 源码获取

前言

这几年人工智能技术大发展,Python因此几乎成了第一位的语言。实际上,多年来,它不仅在软件工程师中得到广泛使用,也是各行业通用的专家语言,就是说,不管孩子以后做什么,都可能用得着。准备针对我自己上小学的孩子,每周抽出些时间,通过学习他们感兴趣的小游戏,逐步把python知识点带进游戏的制作过程中,用到哪些知识简单的解绍一下哪些,以学,以用为主。
本次我们将编写一个贪吃蛇的游戏。通过键盘上、下、左、右控制小蛇上、下、左、右移动,吃到食物后长度加1;蛇头碰到自身或窗口边缘,游戏失败。我们首先构造小蛇,实现小蛇向4个方向移动;然后实现游戏失败的判断、吃食物增加长度、得分功能;每段游戏,增加一个功能,另存一下,容易让孩子理解学习,同时也可以让其在每个阶段增加他想增加的功能,一举多得。最后学习函数的定义与使用,并通过进行时间控制变更游戏难度。

主要设计

1、蛇的表示

游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
蛇怎么表示?我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,蛇头用个蛇头(圆带两个眼睛)表示,蛇身用个圆表示。我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了。

2、蛇怎么移动?

第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。(由于蛇头与蛇身是不同的图片,还需要把第二张也即原先的蛇并没有照片换成蛇身照片,要不跑几步就成一串蛇头了,你可以试试,把蛇身换蛇头的那行代码注释掉就可看到了。)

3、玩家控制小蛇移动功能的实现

玩家控制小蛇移动功能的实现
玩家控制小蛇移动,在update()函数中实现用户按上、下、左、右方向键,设定direction变量取不同的值,即可实现玩家键盘控制小蛇向4个方向移动。即通过一个公共变量direction来实现,当键盘按不同的上下左右键时修改公共变量direction就达到了玩家控制小蛇方向的问题。

4、如何判定游戏结束?

“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。那么如何判断碰到自己呢?
如果脑子里想的是“蛇”动的画面,那真的比较难了,但是放到代码中,我们的“蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中岂不就可以了?
理清了这些问题,我们就可以开始编码了。

应用知识点

1、python知识点

1.1 列表

游戏开发本身就会用到很多面向对象的概念,而蛇的身体又是一个天然的“链表”结构,太适合用来练习数据结构了。
列表,数据类型list,list是python内置的一种高级数据类型。list是一种有序的集合,基于链表实现 在python中应用很广泛,可以随时添加和删除其中的元素。在此游戏中用于表是蛇身,由蛇头,蛇身组成,吃个食物,蛇身增加一段,即应用列表添加一个蛇身图片。蛇身的移动,用到了列表的添加与删除功能。len()可以获得列表长度。用索引来访问list中每一个位置的元素,记得索引是从0开始的,也可以用负数,表示从-1表示列表最后一个。

append()在列表未尾增加一个元素

如:Snake.append(snakebody) # 把蛇身加入列表中

del 删除最后一个元素

del Snake[len(Snake)-1] # 删除旧蛇尾
也可用 del Snake[-1]

在指定位置增加元素用insert()

如:Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面

1.2 time 时间模块

属于Python的时间模块。基本上,这会增加执行延迟,并且只会暂停当前线程,而不会暂停整个程序。
Python的time模块中提供了Python time.sleep()函数。在使用此Python函数之前,您需要使用以下命令导入此模块:import time
导入此模块后,即可使用time.sleep()函数。语法如下:
句法:睡眠(秒),如您所见,它需要一个参数,即秒。在执行过程中,这基本上会引起这么多秒的延迟,此游戏中应用到sleep(0.2),让游戏更新时暂缓0.2秒,通过此参数可以调试蛇的移动速度。

1.3 random模块

random() 方法返回随机生成的一个实数,它在[0,1)范围内
import random
random.random()
#randint函数,返回指定范围的一个随机整数,包含上下限
random.randint(0,99)#返回0~99之间的整数

2、pygamezero知识点

Pygame Zero这个神器,它对PyGame做了很多封装,避免写很多枯燥的框架代码,让初学者可以更专注于游戏核心逻辑,容易上手。

2.1 游戏角色Acto

游戏角色Actor pgzero中所有以图片显示的元素都是Actor类来定义,如snakebody = Actor(‘snake2’) # 导入蛇身方块图片。也可以理解为Actor是用来代表一个你绘制到屏幕的图形。
通过把字符串 ‘snake2’ 作为参数传递给 Actor 类,Pygame Zero自动加载了外星人精灵,并且图片具有位置和大小属性。snake2是指images文件夹下snake2.png图片。也可以apple = Actor(‘apple’,(200,300)) # 设置图片apple的位置。连图片带位置一起指定。
一个免费的png图片下载网站:https://kenney.nl/assets/page:3?q=2d

2.2 输出中文字体

显示中文 准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttf
if isclose: # 显示游戏失败信息
screen.draw.text(“游戏失败!”, (120, HEIGHT/2-100),
fontsize=100, fontname=‘simhei’, color=‘yellow’)

2.3键盘控制

from pgzero.keyboard import keys, Keyboard
可以查询下原码,通过keys.w,keyboard.left等进行控制

功能截图

在这里插入图片描述

在这里插入图片描述

代码实现

1、蛇的表示

在这里插入图片描述

import pgzrun # 导入游戏库
TILE_SIZE = 30 # 小蛇方块的大小,20×20
WIDTH = 20*TILE_SIZE # 设置窗口的宽度为800
HEIGHT = 20*TILE_SIZE # 设置窗口的高度为600

snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标

Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入列表中
for i in range(4): # 再为蛇添加4段蛇身
    print(i)
    snakebody = Actor('snake2') # 导入蛇身方块图片
    snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标
    snakebody.y = Snake[i].y # 蛇身方块图片的y坐标
    Snake.append(snakebody) # 把蛇身加入列表中

def draw(): # 绘制模块,每帧重复执行
    screen.clear() # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake: # 绘制蛇
        snkaebody.draw()

pgzrun.go() # 开始执行游戏

2、蛇的前进移动

蛇一直向右移动,直至完全走出屏幕

direction = 'right'
def update(): # 更新模块,每帧重复操作
    newSnakeHead = Actor('snake1') # 创建新蛇头的图片    
    # 根据direction变量设定新蛇头的坐标    # 如小蛇向下移动,就在旧蛇头的下边
    if direction == 'right': # 小蛇向右移动
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left': # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up': # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down': # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面
    Snake[1].image='snake2'
    del Snake[len(Snake)-1] # 删除旧蛇尾

3、控制移动方向

在这里插入图片描述

def update(): # 更新模块,每帧重复操作
    global direction,isclose
    if keyboard.left: # 如果按下键盘向左方向键
        direction = 'left' # 小蛇要向左移
    if keyboard.right: # 如果按下键盘向右方向键
        direction = 'right' # 小蛇要向右移
    if keyboard.up: # 如果按下键盘向上方向键
        direction = 'up' # 小蛇要向上移
    if keyboard.down: # 如果按下键盘向下方向键
        direction = 'down' # 小蛇要向下移

4、游戏失败

在这里插入图片描述

    # 当小蛇(新蛇头)超出边框时,游戏失败
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isclose = True
    def draw(): # 绘制模块,每帧重复执行
    screen.clear() # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake: # 绘制蛇
        snkaebody.draw()
    # 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件simhei.ttf
    if isclose: # 显示游戏失败信息
        screen.draw.text("游戏失败!", (120, HEIGHT/2-100),
                         fontsize=100, fontname='simhei', color='yellow')     

5、食物的随机出现

当小蛇头碰到食物时,不处理,也就是长度+1;青蛙重新在随机位置出现;

 if newSnakeHead.x == food.x and newSnakeHead.y == food.y:
        food.x = random.randint(5, 20) * TILE_SIZE
        food.y = random.randint(5, 20) * TILE_SIZE
        score = score + 1  # 得分加1

6、游戏得分

设置公共变量score,当小蛇吃到食物时,score值加1,更新时屏幕显示出得分,用如下语句。

    screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,
                    fontname='simhei', color='white')

源码

由于网友建意,把源码增加在此,为方便大家查询,特修改添之

# _*_ coding: UTF-8 _*_
# 开发团队: 信息化未来
# 开发人员: Administrator
# 开发时间:2022/9/4 18:02
# 文件名称: 贪吃蛇.py
# 开发工具: PyCharm

import pgzrun # 导入游戏库
from pgzero.actor import Actor
from pgzero.keyboard import Keyboard
from pgzero.screen import Screen
keyboard: Keyboard  # 类型标注
screen: Screen  # 类型标注

import time
import random # 导入随机库

TILE_SIZE = 30 # 小蛇方块的大小,20×20
WIDTH = 20*TILE_SIZE # 设置窗口的宽度为800
HEIGHT = 20*TILE_SIZE # 设置窗口的高度为600

snkaeHead = Actor('snake1') # 导入蛇头方块图片
snkaeHead.x = WIDTH/2 # 蛇头方块图片的x坐标
snkaeHead.y = HEIGHT/2 # 蛇头方块图片的y坐标

food = Actor('food') # 导入食物方块图片
food.x = random.randint(10, 20)*TILE_SIZE # 食物方块图片的x坐标
food.y = random.randint(10, 20)*TILE_SIZE # 食物方块图片的y坐标

score = 0 # 游戏得分
direction = 'right'
isclose = False
Snake = [] # 存储蛇的列表
Snake.append(snkaeHead) # 把蛇头加入列表中
for i in range(4): # 再为蛇添加4段蛇身
    print(i)
    snakebody = Actor('snake2') # 导入蛇身方块图片
    snakebody.x = Snake[i].x - TILE_SIZE # 蛇身方块图片的x坐标
    snakebody.y = Snake[i].y # 蛇身方块图片的y坐标
    Snake.append(snakebody) # 把蛇身加入列表中

def draw(): # 绘制模块,每帧重复执行
    screen.clear() # 每帧清除屏幕,便于重新绘制
    for snkaebody in Snake: # 绘制蛇
        snkaebody.draw()
    food.draw()
    # 显示中文    准备:在.py同级目录下新建fonts文件夹,并放入支持中文的字体文件.ttf
    if isclose: # 显示游戏失败信息
        screen.draw.text("游戏失败!", (120, HEIGHT/2-100),
                         fontsize=100, fontname='simhei', color='yellow')  # fontname='宋体',
    screen.draw.text("得分:"+str(score), (100, 20), fontsize=50,
                    fontname='simhei', color='white')


def update(): # 更新模块,每帧重复操作
    global direction,isclose,food,score
    if keyboard.left: # 如果按下键盘向左方向键
        direction = 'left' # 小蛇要向左移
    if keyboard.right: # 如果按下键盘向右方向键
        direction = 'right' # 小蛇要向右移
    if keyboard.up: # 如果按下键盘向上方向键
        direction = 'up' # 小蛇要向上移
    if keyboard.down: # 如果按下键盘向下方向键
        direction = 'down' # 小蛇要向下移


    newSnakeHead = Actor('snake1') # 创建新蛇头的图片    # 根据direction变量设定新蛇头的坐标    # 如小蛇向下移动,就在旧蛇头的下边
    if direction == 'right': # 小蛇向右移动
        newSnakeHead.x = Snake[0].x + TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'left': # 小蛇向左移动
        newSnakeHead.x = Snake[0].x - TILE_SIZE
        newSnakeHead.y = Snake[0].y
    if direction == 'up': # 小蛇向上移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y - TILE_SIZE
    if direction == 'down': # 小蛇向下移动
        newSnakeHead.x = Snake[0].x
        newSnakeHead.y = Snake[0].y + TILE_SIZE

    # 当小蛇(新蛇头)超出边框时,游戏失败
    if newSnakeHead.y < 0 or newSnakeHead.y > HEIGHT  or newSnakeHead.x < 0 or newSnakeHead.x > WIDTH:
        isclose = True
        # 当小蛇蛇头碰到自身时,游戏失败
        for snakebody in Snake:
            # 对所有蛇身循环,判断是否和蛇头坐标一致
            if newSnakeHead.x == snakebody.x and  newSnakeHead.y == snakebody.y:
                isLoose = True
                break

    # 当小蛇头碰到食物时,不处理,也就是长度+1;青蛙重新在随机位置出现;
    if newSnakeHead.x == food.x and newSnakeHead.y == food.y:
        food.x = random.randint(5, 20) * TILE_SIZE
        food.y = random.randint(5, 20) * TILE_SIZE
        score = score + 1  # 得分加1
    else:  # 否则,删除掉旧蛇尾,也就是蛇的长度保持不变
        del Snake[len(Snake) - 1]

    Snake.insert(0, newSnakeHead) # 把新蛇头加到列表的最前面
    Snake[1].image='snake2'
    # del Snake[len(Snake)-1] # 删除旧蛇尾
    time.sleep(0.2) # 暂停0.2s

pgzrun.go() # 开始执行游戏


总结

这次我们主要制作了贪吃蛇游戏,了解了time模块的sleep函数、clock模块的schedule等功能,学习了列表的插入函数、break与continue语句、函数的定义与调用等知识点。读者可以尝试在本章代码的基础上继续改进:1.实现得分越来越高,游戏速度越来越快的效果;2.实现蛇头、蛇身不同颜色的显示效果;

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 1 /30个。
可以关注我,点赞我、评论我、收藏我啦。

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

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

相关文章

vCenter命令行升级

1.为当前vCenter打快照 2.为vCenter关联新的iso镜像 3.SSH登录vCenter 4.检查ISO镜像 software-packages stage --iso software-packages list --staged 5.安装vCenter&#xff0c;安装预计40分钟 software-packages install --staged 6.重启vCenter Command>shell #re…

【论文】撰写小论文用到的资料

一、小论文算法的学习 &#xff08;一&#xff09;资料链接 1.联邦学习&#xff1a;https://www.baidu.com/s 2.迁移学习概述&#xff08;Transfer Learning&#xff09;https://blog.csdn.net/dakenz/article/details/85954548 3.迁移学习&#xff1a;经典算法解析&#xff…

前端怎么解决跨域

JSONP jsonp的原理就是利用<script>标签没有跨域限制&#xff0c;通过<script>标签src属性&#xff0c;将本地的全局函数通过callback传到服务器&#xff0c;服务端将接口返回数据拼凑到callback函数中&#xff0c;返回给客服端 实现思路 服务端的代码&#xff…

第七章 数学 AcWing 1533. 1 的个数

第七章 数学 AcWing 1533. 1 的个数 原题链接 AcWing 1533. 1 的个数 算法标签 数学 枚举 数位DP 思路 显然&#xff0c;直接暴力枚举时间复杂度 230(枚举N个数)∗10(枚举N个数每一位)≈10102^{30}(枚举N个数)*10(枚举N个数每一位)\approx10^{10}230(枚举N个数)∗10(枚举…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令&#xff1a;yum install epel-release之后会自动匹配对应版本的rpm包&#xff0c;并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令&#xff1a;yum install xrdp2.开启…

【POJ No. 3368】 最频繁值 Frequent values

【POJ No. 3368】 最频繁值 Frequent values 北大OJ 题目地址 【题意】 给定n 个整数的非递减序列a 1 , a 2 ,…, an &#xff0c;对每个索引i 和j 组成的查询&#xff08;1≤i ≤j ≤n &#xff09;&#xff0c;都确定整数ai , …, aj 中的最频繁值&#xff08;出现次数最多…

Jmeter工具下载并直连MySQL数据库

优秀链接&#xff1a; Jmeter汉化 Jmeter初认识 前提有JDK&#xff0c;我的是1.8 下载Jmeter 下载的Jmeter版本是5.5无需配置Jmeter路径&#xff0c;下载后解压便可以运行 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网下载比较慢&#xff0c;在…

[附源码]计算机毕业设计JAVA健身健康规划系统

[附源码]计算机毕业设计JAVA健身健康规划系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

ADPCM(自适应差分脉冲编码调制)的原理和计算

关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, G.723, G.726 中都会使用到 ADPCM G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. …

【Linux】linux中,你不得不爱的命令集(下)

我们将要介绍的命令并不是linux中所有的命令&#xff0c;是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7&#xff0c;我们的linux搭建是在腾讯云服务器上搭建的&#xff0c;借助Xshell登录服务器&#xff0c;在root下进行命令行的操作。 目录 mv指令&#x…

什么认证在云计算行业内的含金量最大?考试费用贵不贵?

作为一个新兴发展起来的技术&#xff0c;云计算在社会生产中的作用越来越重要&#xff0c;各家企业纷纷转型&#xff0c;希望能借用新技术&#xff0c;获得新的发展。这样一来市场就需要大量的新人才来维护运行&#xff0c;然而云计算作为新兴技术&#xff0c;还没有被大量引入…

野火FPGA入门(7):IP核调用

文章目录第24讲&#xff1a;快速开发的法宝&#xff1a;IP核第25讲&#xff1a;PLL-IP核的调用第26讲&#xff1a;ROM-IP核的调用rom_ctrl.vrom.v第27讲&#xff1a;RAM-IP核的调用key_filterram_crtlram第28讲&#xff1a;FIFO-IP核的调用同步FIFO异步FIFO第24讲&#xff1a;快…

Docker的四种网络模式和相关网络命令

一、Docker网络 1.实现原理 docker 使用linux 桥接&#xff0c;在宿主机虚拟一个docker 容器网桥&#xff08;docker0) &#xff0c;docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker 网桥是每个容器的…

建议别瞎卷,GitHub乱杀,MySQL DBA 攻坚指南一出,阿里数据库专家都解脱了

我先叭叭哈~ 大家可能并不觉得&#xff0c;数据库其实非常重要&#xff0c;每个业内巨头&#xff0c;每个成熟的互联网产品都有多个数据库系统&#xff0c;能保证大量并发场景下不出错&#xff0c;并非易事。尤其是银行、电商、电信、电力、航空等实时交易重要的环境中&#x…

微服务远程调用组件Feign的使用详解

一. 概要 我们知道&#xff0c;现在最火且最有技术含量的技术莫过于SpringCloud微服务了&#xff0c;所以今天百泽老师就带大家来学习一下微服务的核心的组件之一&#xff0c;Feign的基本使用及其工作机制。 二. Feign简介 1.概念 在学习Feign的使用之前&#xff0c;我们先…

贝赛尔曲线

<template><svg width"400" height"400" class"BG" mousemove"mousemove"><!-- 这样拼字符串&#xff0c;少些点加号&#xff0c;方便改一些 --><path class"Line":d"M${StartPoint[0]} ${StartP…

CNN经典模型之ALexNet、ResNet、DenseNet总结和比较

目录 ALexNet(2012 研究背景 思路和主要过程 网络模型 数据增强 主要贡献点 ResNet(2015 研究背景 思路和主要过程 Residual block(残差块)和shortcut connections(捷径连接) bottleneck block-瓶颈模块 主要贡献点: Denset(2017 研究背景 思路和主要过程 Dense…

mysql忘记密码怎么解决(几乎囊括你可能遇到的所有问题)

mysql忘记密码解决&#xff1a; 多次输入都错误&#xff0c;出现下面的提示 Access denied for user rootlocalhost (using password: YES)解决&#xff1a; 1.关闭mysql service mysqld stop2.mysql停止后输入 mysqld --shared-memory --skip-grant-tables3.重新打开一个…

利用Pinpoint搭建全链路监控系统

随着项目微服务的进行&#xff0c;微服务数量逐渐增加&#xff0c;服务间的调用也越来越复杂&#xff0c;我们急切需要一个APM工具帮我们监控各个服务的性能及对服务间的调用进行跟踪&#xff0c;而通过调研多个开源APM工具后&#xff0c;最终我们选择了Pinpoint。 简介 Pinp…

PyQt5 QDialog对话框(QMessageBox,QInputDialog,QFontDialog,QFileDialog,QColorDialog)

PyQt5 QDialog对话框QDialog类图QDialogQMessageBoxQInputDialogQFontDialogQFileDialogQColorDialogQDialog类图 QDialog import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtCore import Qtclass MyDialogWindow…