当前位置:首页>python>【Python钢琴节奏大师·第6讲】声音交互篇-Pygame音效播放与鼠标点击检测

【Python钢琴节奏大师·第6讲】声音交互篇-Pygame音效播放与鼠标点击检测

  • 2026-03-27 23:23:36
【Python钢琴节奏大师·第6讲】声音交互篇-Pygame音效播放与鼠标点击检测

🎹 Python钢琴节奏大师 · 第6章

系列:Python钢琴节奏大师:从零到游戏开发实战[1]章节:第6章 / 共12章标题:声音交互篇-Pygame音效播放与鼠标点击检测上一章:第5章-钢琴进阶篇[2]下一章:第7章-键盘映射篇[3]


让琴键会"响"——Pygame播放声音

今日目标:下载钢琴音效,学习Pygame声音播放,实现点击琴键发出对应音高,让钢琴真正"活"起来。

💡 本章核心:给钢琴添加声音,实现点击发声的交互


🎹 效果预览

完成本篇学习后,你可以:

  • 点击白键,听到 do、re、mi... 的声音
  • 点击黑键,听到 #do、#re... 的升调声音
  • 真正弹奏简单的旋律!
┌────────────────────────────────────────────────────────────┐│                                                            ││        ■   ■      ■   ■   ■                              ││        ■   ■      ■   ■   ■                              ││        ■   ■      ■   ■   ■                              ││        ■   ■      ■   ■   ■                              ││    ┌───┼───┼───┐ ┌───┼───┼───┼───┐                       ││    │   │ ■ │   │ │   │ ■ │ ■ │   │                       ││    │ 0 │1│2│ 3 │ │ 4 │5│6│ 7 │  ← 点击这些键!           ││    │   │   │   │ │   │   │   │   │   会发出声音          ││    │   │   │   │ │   │   │   │   │                       ││    │do │#re│mi │ │fa │#sol│la │si │                       ││    └───┴───┴───┘ └───┴───┴───┴───┘                       ││                                                            ││              🎵 点击琴键,开始演奏吧! 🎵                   │└────────────────────────────────────────────────────────────┘

🤔 声音是怎么播放的?

计算机如何发出声音?

计算机播放声音的过程:

  1. 声音文件(wav/mp3/ogg)存储在硬盘上
  2. Pygame 把声音文件加载到内存
  3. 声卡 把数字信号转换成模拟信号
  4. 扬声器/耳机 发出声音

什么是WAV文件?

WAV是Windows的标准音频格式:

  • ✅ 音质好,无压缩
  • ✅ 兼容性好,Pygame支持
  • ❌ 文件较大

对于钢琴游戏,WAV是最简单可靠的选择。


📝 第一步:准备音效文件

下载钢琴音效

你需要12个音效文件(7个白键 + 5个黑键):

文件名
对应琴键
音高
c4.wav
白键0
do (C4)
d4.wav
白键1
re (D4)
e4.wav
白键2
mi (E4)
f4.wav
白键3
fa (F4)
g4.wav
白键4
sol (G4)
a4.wav
白键5
la (A4)
b4.wav
白键6
si (B4)
cs4.wav
黑键0
#do (C#4)
ds4.wav
黑键1
#re (D#4)
fs4.wav
黑键2
#fa (F#4)
gs4.wav
黑键3
#sol (G#4)
as4.wav
黑键4
#la (A#4)

音效资源获取方式

方式1:网上下载

搜索关键词:"piano wav samples free download"

推荐网站:

  • freesound.org
  • soundpacks.com
  • 各种音效素材网站

方式2:自己录制

用钢琴App或电子琴录制12个音,导出为WAV格式。

创建sounds文件夹

  1. 在你的项目文件夹里,新建一个文件夹叫 sounds
  2. 把12个wav文件放进去
  3. 文件夹结构:
python-piano-game/├── 06_piano_sound.py      # 你的代码├── sounds/                # 音效文件夹│   ├── c4.wav│   ├── d4.wav│   ├── e4.wav│   ├── f4.wav│   ├── g4.wav│   ├── a4.wav│   ├── b4.wav│   ├── cs4.wav│   ├── ds4.wav│   ├── fs4.wav│   ├── gs4.wav│   └── as4.wav

📝 第二步:初始化声音系统

Pygame声音模块

Pygame有两个声音相关的模块:

模块
用途
适合场景
pygame.mixer
播放短音效
琴键声音、爆炸声
pygame.mixer.music
播放背景音乐
游戏BGM

钢琴键声音用 pygame.mixer

初始化代码

在 pygame.init() 之后,添加:

# 初始化声音系统(频率44100Hz,16位,双声道,缓冲区4096)pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=4096)

参数说明:

  • frequency=44100:采样率,CD音质
  • size=-16:16位深度(负号表示有符号)
  • channels=2:立体声
  • buffer=4096:缓冲区大小

简化版(使用默认参数):

pygame.mixer.init()

📝 第三步:加载声音文件

加载单个声音

# 加载一个声音文件sound_do = pygame.mixer.Sound("sounds/c4.wav")

加载所有声音

用列表存储所有声音:

# 白键音效文件列表WHITE_SOUNDS = ["c4.wav""d4.wav""e4.wav""f4.wav""g4.wav""a4.wav""b4.wav"]# 黑键音效文件列表BLACK_SOUNDS = ["cs4.wav""ds4.wav""fs4.wav""gs4.wav""as4.wav"]# 加载所有白键音效white_sounds = []for filename in WHITE_SOUNDS:    sound = pygame.mixer.Sound(f"sounds/{filename}")    white_sounds.append(sound)# 加载所有黑键音效black_sounds = []for filename in BLACK_SOUNDS:    sound = pygame.mixer.Sound(f"sounds/{filename}")    black_sounds.append(sound)

使用列表推导式(更简洁)

# 一行代码加载所有白键音效white_sounds = [pygame.mixer.Sound(f"sounds/{f}"for f in WHITE_SOUNDS]# 一行代码加载所有黑键音效  black_sounds = [pygame.mixer.Sound(f"sounds/{f}"for f in BLACK_SOUNDS]

📝 第四步:播放声音

基本播放

# 播放声音sound_do.play()

播放指定音效

# 播放第0个白键的声音(do)white_sounds[0].play()# 播放第2个黑键的声音(#fa)black_sounds[2].play()

停止播放

# 停止某个声音sound_do.stop()# 停止所有声音pygame.mixer.stop()

📝 第五步:检测鼠标点击

鼠标事件类型

事件类型
含义
pygame.MOUSEBUTTONDOWN
鼠标按下
pygame.MOUSEBUTTONUP
鼠标松开
pygame.MOUSEMOTION
鼠标移动

获取鼠标位置

# 获取当前鼠标位置(x, y)mouse_x, mouse_y = pygame.mouse.get_pos()

检测点击事件

for event in pygame.event.get():if event.type == pygame.QUIT:        running = False# 检测鼠标按下elif event.type == pygame.MOUSEBUTTONDOWN:# 获取鼠标位置        mouse_x, mouse_y = event.posprint(f"鼠标点击位置:({mouse_x}{mouse_y})")

📝 第六步:判断点击了哪个键

判断点是否在矩形内

Pygame提供了一个方便的函数:

# 创建一个矩形对象rect = pygame.Rect(x, y, width, height)# 判断点是否在矩形内if rect.collidepoint(mouse_x, mouse_y):print("点击了矩形!")

应用到钢琴键

# 检测白键点击for i inrange(WHITE_KEY_COUNT):    x = START_X + i * WHITE_KEY_WIDTH    key_rect = pygame.Rect(x, START_Y, WHITE_KEY_WIDTH, WHITE_KEY_HEIGHT)if key_rect.collidepoint(mouse_x, mouse_y):print(f"点击了白键 {i} ({WHITE_KEY_NAMES[i]})")        white_sounds[i].play()  # 播放对应音效break# 找到就停止,避免重复检测# 检测黑键点击(注意:黑键要在白键之后检测,因为黑键在上面)for i inrange(BLACK_KEY_COUNT):    white_key_index = BLACK_KEY_POSITIONS[i]    white_key_x = START_X + white_key_index * WHITE_KEY_WIDTH    black_key_x = white_key_x + WHITE_KEY_WIDTH - BLACK_KEY_WIDTH // 2    key_rect = pygame.Rect(black_key_x, START_Y, BLACK_KEY_WIDTH, BLACK_KEY_HEIGHT)if key_rect.collidepoint(mouse_x, mouse_y):print(f"点击了黑键 {i} ({BLACK_KEY_NAMES[i]})")        black_sounds[i].play()  # 播放对应音效break

重要:先检测白键,再检测黑键!

因为黑键在白键上面,如果先检测黑键,点击黑键时会同时触发白键检测。


🎯 完整代码

import pygame# ========== 初始化 ==========pygame.init()# 初始化声音系统pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=4096)# ========== 窗口设置 ==========SCREEN_WIDTH = 800SCREEN_HEIGHT = 600screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))pygame.display.set_caption("会发声的钢琴")# ========== 颜色定义 ==========BLACK = (000)WHITE = (255255255)GRAY = (200200200)DARK_GRAY = (505050)YELLOW = (2552550)  # 按键按下时的颜色# ========== 钢琴键参数 ==========WHITE_KEY_WIDTH = 80WHITE_KEY_HEIGHT = 300WHITE_KEY_COUNT = 7START_X = 100START_Y = 200BLACK_KEY_WIDTH = 50BLACK_KEY_HEIGHT = 180BLACK_KEY_COUNT = 5BLACK_KEY_POSITIONS = [01345]WHITE_KEY_NAMES = ["do""re""mi""fa""sol""la""si"]BLACK_KEY_NAMES = ["#do""#re""#fa""#sol""#la"]# ========== 加载音效 ==========WHITE_SOUNDS = ["c4.wav""d4.wav""e4.wav""f4.wav""g4.wav""a4.wav""b4.wav"]BLACK_SOUNDS = ["cs4.wav""ds4.wav""fs4.wav""gs4.wav""as4.wav"]print("正在加载音效...")try:    white_sounds = [pygame.mixer.Sound(f"sounds/{f}"for f in WHITE_SOUNDS]    black_sounds = [pygame.mixer.Sound(f"sounds/{f}"for f in BLACK_SOUNDS]print("音效加载完成!")except FileNotFoundError as e:print(f"错误:找不到音效文件 {e}")print("请确保sounds文件夹存在,且包含所有wav文件")# 创建空的声音列表,避免程序崩溃    white_sounds = [None] * WHITE_KEY_COUNT    black_sounds = [None] * BLACK_KEY_COUNT# ========== 字体 ==========font = pygame.font.SysFont(None36)small_font = pygame.font.SysFont(None24)# ========== 游戏循环 ==========running = True# 记录哪个键被按下(用于显示效果)white_key_pressed = [False] * WHITE_KEY_COUNTblack_key_pressed = [False] * BLACK_KEY_COUNTwhile running:# ========== 事件处理 ==========for event in pygame.event.get():if event.type == pygame.QUIT:            running = False# 鼠标按下事件elif event.type == pygame.MOUSEBUTTONDOWN:            mouse_x, mouse_y = event.pos# 先检测白键            key_found = Falsefor i inrange(WHITE_KEY_COUNT):                x = START_X + i * WHITE_KEY_WIDTH                key_rect = pygame.Rect(x, START_Y, WHITE_KEY_WIDTH, WHITE_KEY_HEIGHT)if key_rect.collidepoint(mouse_x, mouse_y):print(f"🎵 白键 {WHITE_KEY_NAMES[i]}")                    white_key_pressed[i] = Trueif white_sounds[i]:                        white_sounds[i].play()                    key_found = Truebreak# 再检测黑键(如果白键没点到)ifnot key_found:for i inrange(BLACK_KEY_COUNT):                    white_key_index = BLACK_KEY_POSITIONS[i]                    white_key_x = START_X + white_key_index * WHITE_KEY_WIDTH                    black_key_x = white_key_x + WHITE_KEY_WIDTH - BLACK_KEY_WIDTH // 2                    key_rect = pygame.Rect(black_key_x, START_Y, BLACK_KEY_WIDTH, BLACK_KEY_HEIGHT)if key_rect.collidepoint(mouse_x, mouse_y):print(f"🎵 黑键 {BLACK_KEY_NAMES[i]}")                        black_key_pressed[i] = Trueif black_sounds[i]:                            black_sounds[i].play()break# 鼠标松开事件(重置按键状态)elif event.type == pygame.MOUSEBUTTONUP:            white_key_pressed = [False] * WHITE_KEY_COUNT            black_key_pressed = [False] * BLACK_KEY_COUNT# ========== 绘制 ==========    screen.fill(DARK_GRAY)# 绘制白键for i inrange(WHITE_KEY_COUNT):        x = START_X + i * WHITE_KEY_WIDTH# 如果被按下,显示黄色,否则白色if white_key_pressed[i]:            color = YELLOWelse:            color = WHITE        pygame.draw.rect(screen, color, (x, START_Y, WHITE_KEY_WIDTH, WHITE_KEY_HEIGHT))        pygame.draw.rect(screen, GRAY, (x, START_Y, WHITE_KEY_WIDTH, WHITE_KEY_HEIGHT), 1)# 音名        text = font.render(WHITE_KEY_NAMES[i], True, BLACK)        text_x = x + (WHITE_KEY_WIDTH - text.get_width()) // 2        text_y = START_Y + WHITE_KEY_HEIGHT - 50        screen.blit(text, (text_x, text_y))# 绘制黑键for i inrange(BLACK_KEY_COUNT):        white_key_index = BLACK_KEY_POSITIONS[i]        white_key_x = START_X + white_key_index * WHITE_KEY_WIDTH        black_key_x = white_key_x + WHITE_KEY_WIDTH - BLACK_KEY_WIDTH // 2# 如果被按下,显示深灰色,否则黑色if black_key_pressed[i]:            color = (808080)else:            color = BLACK        pygame.draw.rect(screen, color,                         (black_key_x, START_Y, BLACK_KEY_WIDTH, BLACK_KEY_HEIGHT))        pygame.draw.rect(screen, (100100100),                         (black_key_x, START_Y, BLACK_KEY_WIDTH, BLACK_KEY_HEIGHT), 1)# 音名        text = small_font.render(BLACK_KEY_NAMES[i], True, WHITE)        text_x = black_key_x + (BLACK_KEY_WIDTH - text.get_width()) // 2        text_y = START_Y + BLACK_KEY_HEIGHT - 30        screen.blit(text, (text_x, text_y))# 分隔线for i inrange(1, WHITE_KEY_COUNT):        x = START_X + i * WHITE_KEY_WIDTH        pygame.draw.line(screen, BLACK, (x, START_Y), (x, START_Y + WHITE_KEY_HEIGHT), 2)# 提示文字    hint = small_font.render("点击琴键演奏"True, WHITE)    screen.blit(hint, (SCREEN_WIDTH // 2 - hint.get_width() // 2100))    pygame.display.flip()pygame.quit()

🔍 代码重点解析

1. 声音加载错误处理

try:    white_sounds = [pygame.mixer.Sound(f"sounds/{f}"for f in WHITE_SOUNDS]except FileNotFoundError as e:print(f"错误:找不到音效文件 {e}")    white_sounds = [None] * WHITE_KEY_COUNT

为什么需要try-except?

如果sounds文件夹不存在或文件缺失,程序会崩溃。用try-except可以优雅地处理错误。

2. 按键状态记录

white_key_pressed = [False] * WHITE_KEY_COUNT

这是一个布尔列表,记录每个键是否被按下。用于:

  • 改变按键颜色(视觉反馈)
  • 防止重复触发

3. 点击检测顺序

# 先检测白键for i inrange(WHITE_KEY_COUNT):    ...if key_rect.collidepoint(mouse_x, mouse_y):        ...break# 找到就退出# 再检测黑键ifnot key_found:  # 只有没点到白键时才检测黑键for i inrange(BLACK_KEY_COUNT):        ...

关键点

  • 白键先检测
  • 点到白键后 break,不再检测后面的键
  • 只有没点到白键时,才检测黑键

4. 视觉反馈

if white_key_pressed[i]:    color = YELLOW  # 按下时变黄else:    color = WHITE   # 平时是白色

让用户知道哪个键被按下了。


🎨 动手改造

改造1:添加音量控制

# 设置音量(0.0到1.0)white_sounds[0].set_volume(0.5)  # 50%音量

改造2:循环播放

# -1表示无限循环white_sounds[0].play(-1)# 停止播放white_sounds[0].stop()

改造3:淡入效果

# 播放时淡入500毫秒white_sounds[0].play(fade_ms=500)

改造4:播放背景音乐

# 加载背景音乐pygame.mixer.music.load("sounds/background.mp3")pygame.mixer.music.play(-1)  # 循环播放pygame.mixer.music.set_volume(0.3)  # 音量30%

❓ 常见问题

Q1:没有声音

检查清单

  1. 音箱/耳机是否连接?
  2. 系统音量是否开启?
  3. sounds文件夹路径是否正确?
  4. 文件名是否匹配?
  5. pygame.mixer是否正确初始化?

Q2:声音延迟

解决:减小buffer大小

pygame.mixer.init(buffer=512)  # 默认4096,改小减少延迟

Q3:点击没反应

检查

  1. 鼠标坐标是否正确获取?
  2. collidepoint判断是否正确?
  3. 矩形坐标是否计算正确?

Q4:同时按多个键只有一声

原因:Pygame默认单声道

解决:使用多通道

# 设置8个通道pygame.mixer.set_num_channels(8)# 播放时指定通道pygame.mixer.Channel(0).play(sound1)pygame.mixer.Channel(1).play(sound2)

Q5:声音文件格式不支持

解决:转换为WAV格式

可以用格式工厂、Audacity等工具转换。


🎯 课后练习

练习1:录制自己的音效

用手机录制12个音,转换为WAV格式,替换默认音效。

练习2:添加按键动画

按键按下时,键向下移动几个像素,模拟真实钢琴效果。

练习3:显示按键历史

在屏幕上方显示最近按下的5个音。

练习4(挑战):实现录音功能

记录用户弹奏的音符和时长,保存到文件,可以回放。


🎬 下篇预告

第7篇:《键盘弹钢琴——把手放键盘上》

明天我们将:

  • 学习键盘事件处理
  • 把电脑键盘按键映射到钢琴键
  • 实现用键盘弹钢琴
  • 支持同时按多个键

不用鼠标,直接上手弹!


📦 本课资源

  • 完整代码06_piano_sound.py
  • 核心概念
    • pygame.mixer 声音系统
    • 声音加载和播放
    • 鼠标事件处理
    • 碰撞检测
  • 关键函数
    • pygame.mixer.Sound() - 加载声音
    • sound.play() - 播放声音
    • rect.collidepoint() - 点是否在矩形内
    • pygame.mouse.get_pos() - 获取鼠标位置

🎉 恭喜你完成第6课!

今天你已经:

  • ✅ 学会了Pygame声音系统
  • ✅ 加载和播放了12个钢琴音效
  • ✅ 实现了鼠标点击发声
  • ✅ 添加了视觉反馈效果

你的钢琴会"说话"了!明天学习用键盘弹奏!


本系列文章面向零基础中小学生,每篇都有详细步骤和配图说明。遇到问题欢迎在评论区留言!关注回复“钢琴”免费获取源代码下载地址。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-28 14:29:23 HTTP/2.0 GET : https://f.mffb.com.cn/a/483470.html
  2. 运行时间 : 0.101690s [ 吞吐率:9.83req/s ] 内存消耗:4,938.11kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=73cad4e8f67e1c3f9af163e059ae1454
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000694s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000867s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000347s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000268s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000596s ]
  6. SELECT * FROM `set` [ RunTime:0.000224s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000725s ]
  8. SELECT * FROM `article` WHERE `id` = 483470 LIMIT 1 [ RunTime:0.002655s ]
  9. UPDATE `article` SET `lasttime` = 1774679363 WHERE `id` = 483470 [ RunTime:0.003936s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.003199s ]
  11. SELECT * FROM `article` WHERE `id` < 483470 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000666s ]
  12. SELECT * FROM `article` WHERE `id` > 483470 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000564s ]
  13. SELECT * FROM `article` WHERE `id` < 483470 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002990s ]
  14. SELECT * FROM `article` WHERE `id` < 483470 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.013063s ]
  15. SELECT * FROM `article` WHERE `id` < 483470 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001532s ]
0.103266s