当前位置:首页>python>告别付费水印!100行Python打造丝滑录屏转GIF工具,体验拉满

告别付费水印!100行Python打造丝滑录屏转GIF工具,体验拉满

  • 2026-06-30 00:53:52
告别付费水印!100行Python打造丝滑录屏转GIF工具,体验拉满

告别付费水印!

在日常工作和学习中,我们几乎每天都需要分享电脑操作内容:给同事演示软件功能、向开发反馈bug复现过程、写教程时展示操作步骤、甚至只是和朋友分享一个有趣的网页特效。这时候,单纯的文字描述太抽象,静态截图说不清楚动态过程,而视频文件体积动辄几十MB,发送和查看都极其不便。

GIF动图就成了这个场景下的完美解决方案——它体积小巧、无需任何播放器、能自动循环播放,完美适配微信、QQ、钉钉、公众号等几乎所有平台。但相信很多人都有过这样的糟心经历:网上找的免费GIF录制工具,要么带着巨大的半透明水印遮挡内容,要么限制最长录制时长,要么广告弹窗满天飞,甚至还有捆绑恶意软件的风险。而那些好用的专业工具,动辄几十上百的年费,对于只是偶尔使用的普通用户来说,实在是性价比太低。

其实,用Python我们完全可以自己动手写一个专属的录屏转GIF工具,不仅100%免费、无水印、无广告,还能根据自己的需求随意定制功能。今天我就给大家分享一个我深度优化后的版本,它不仅实现了核心的指定区域录屏和高清GIF生成功能,还特别打磨了最影响体验的区域选择环节——点击按钮直接进入拖拽模式,实时显示选择区域的精确尺寸,操作流畅度完全不输付费软件。整个工具只有不到200行代码,依赖简单,哪怕是Python新手也能一键运行。

一、工具整体架构与极简界面设计

这个工具基于Python标准库自带的tkinter开发,无需安装任何复杂的GUI框架,真正做到了开箱即用。整体采用面向对象的设计思想,将所有功能封装在Screen2GifGUI类中,结构清晰,逻辑分明,后续想要添加新功能也非常方便。

在初始化方法中,我们首先创建了主应用窗口,设置了固定的400x280像素尺寸并禁止缩放,避免用户误操作破坏界面布局。然后定义了一系列核心状态变量:

  • recording:布尔值,标记当前是否正在录制
  • frames:列表,用于存储录制过程中截取的每一帧图像
  • start_x/start_y/end_x/end_y:记录用户选择的录制区域的四个坐标
  • region_selected:布尔值,标记用户是否已经成功选择了录制区域
  • fps:整数变量,控制最终生成GIF的帧率,默认值为10帧/秒

界面设计上,我们遵循了"功能优先、极简至上"的原则,没有任何多余的装饰元素。顶部是一个帧率调节框,用户可以在5-30帧之间自由选择,帧率越高GIF越流畅,但文件体积也会相应增大。中间是四个按操作顺序排列的功能按钮:选择录制区域→开始录制→停止并生成GIF→清空录制帧,用户一眼就能明白操作流程,完全不需要学习成本。

二、核心优化:丝滑的实时区域选择功能

区域选择是录屏工具最常用也最影响用户体验的功能。传统的实现方式往往是先弹出一个提示框,告诉用户"请按住鼠标左键拖动选择区域",然后在后台等待用户操作。这种方式不仅步骤繁琐,而且用户在拖动过程中完全看不到自己选择的区域大小和位置,只能凭感觉操作,体验非常糟糕。

这次我对区域选择功能进行了彻底的重构,实现了无提示直接进入选择模式,并且实时显示拖拽框和精确尺寸:

  1. 全屏透明遮罩:点击"选择录制区域"按钮后,主窗口会自动最小化,同时创建一个全屏的半透明顶层窗口。这个窗口设置了-topmost属性,始终显示在所有窗口的最前面,并且去掉了标题栏和边框,不会对用户的选择操作造成任何干扰。
  2. 十字光标提示:将选择窗口的鼠标光标设置为十字形,直观地告诉用户当前处于区域选择模式。
  3. 实时绘制与尺寸显示:通过tkinter的Canvas组件,我们实现了鼠标拖拽时的实时绘制功能。当用户按下鼠标左键时,记录起始坐标并创建一个绿色的虚线矩形框和一个尺寸标签;在拖动过程中,矩形框会跟随鼠标实时更新位置和大小,尺寸标签也会同步显示当前选择区域的宽高像素值。
  4. 智能坐标修正:支持用户从任意方向拖动鼠标(比如从右下往左上拖),程序会自动修正坐标,确保最终得到的是正确的区域范围。
  5. ESC一键取消:添加了ESC键盘事件绑定,用户在选择过程中如果改变主意,可以随时按ESC键取消操作,返回主界面。
  6. 无效区域过滤:如果用户选择的区域小于10x10像素,程序会弹出警告提示并要求重新选择,避免生成无效的GIF文件。

三、高效稳定的录屏与GIF生成逻辑

录屏和GIF合成是工具的核心功能,为了避免录制过程中出现界面卡顿的问题,我们采用了多线程技术,将耗时的录制任务放在子线程中执行,保证GUI主线程始终保持响应。

当用户点击"开始录制"按钮时,程序会先进行状态检查:如果还没有选择录制区域,或者已经在录制中,会弹出相应的警告提示。确认一切正常后,清空之前的录制帧,创建一个新的守护线程来执行录制循环。

在录制循环中,我们根据用户设置的帧率计算出每次截图的时间间隔,然后循环调用PIL库的ImageGrab.grab()方法截取指定区域的屏幕图像,并将每一帧添加到frames列表中。守护线程的特性确保了当主程序退出时,录制线程也会自动终止,不会造成资源泄漏。

当用户点击"停止并生成GIF"按钮时,程序会将recording变量设为False,停止录制循环。然后检查录制的帧数,如果少于2帧则无法生成GIF,会提示用户重新录制。如果帧数足够,会弹出文件保存对话框,让用户选择GIF的保存路径,最后使用imageio库的mimsave()方法将所有帧合成为一个完整的GIF文件。

完整可运行代码

import tkinter as tkfrom tkinter import ttk, filedialog, messageboximport pyautoguiimport timeimport imageiofrom PIL import ImageGrab, ImageTkimport threadingclassScreen2GifGUI:def__init__(self, root):        self.root = root        self.root.title("指定区域截图录屏转GIF")        self.root.geometry("400x280")        self.root.resizable(FalseFalse)# 变量        self.recording = False        self.frames = []        self.start_x = self.start_y = self.end_x = self.end_y = 0        self.region_selected = False        self.fps = tk.IntVar(value=10)# 区域选择相关变量        self.selection_window = None        self.canvas = None        self.rect_id = None        self.size_label = None        self.dragging = False# 界面布局        ttk.Label(root, text="GIF帧率:").place(x=30, y=30)        ttk.Spinbox(root, from_=5, to=30, textvariable=self.fps, width=10).place(x=100, y=30)# 按钮        ttk.Button(root, text="1. 选择录制区域", command=self.select_region).place(x=30, y=80, width=140)        ttk.Button(root, text="2. 开始录制", command=self.start_record).place(x=200, y=80, width=140)        ttk.Button(root, text="3. 停止并生成GIF", command=self.stop_record).place(x=30, y=130, width=310)        ttk.Button(root, text="清空录制帧", command=self.clear_frames).place(x=30, y=180, width=310)defselect_region(self):"""无提示直接进入区域选择,实时显示拖拽框和大小"""        self.root.iconify()  # 最小化主窗口        time.sleep(0.2)  # 给窗口最小化留出时间# 创建全屏透明选择窗口        self.selection_window = tk.Toplevel(self.root)        self.selection_window.attributes("-fullscreen"True)        self.selection_window.attributes("-alpha"0.3)  # 半透明        self.selection_window.attributes("-topmost"True)        self.selection_window.overrideredirect(True)  # 无边框        self.selection_window.config(cursor="cross")  # 十字光标# 创建画布用于绘制选择框        self.canvas = tk.Canvas(self.selection_window, highlightthickness=0)        self.canvas.pack(fill=tk.BOTH, expand=True)# 绑定鼠标事件        self.canvas.bind("<ButtonPress-1>", self.on_mouse_down)        self.canvas.bind("<B1-Motion>", self.on_mouse_drag)        self.canvas.bind("<ButtonRelease-1>", self.on_mouse_up)        self.canvas.bind("<Escape>", self.cancel_selection)  # ESC键取消# 等待选择完成        self.selection_window.wait_window()        self.root.deiconify()  # 恢复主窗口defon_mouse_down(self, event):"""鼠标按下,开始拖拽"""        self.dragging = True        self.start_x = event.x        self.start_y = event.y# 创建初始矩形和尺寸标签        self.rect_id = self.canvas.create_rectangle(            self.start_x, self.start_y, self.start_x, self.start_y,            outline="#00ff00", width=2, dash=(42)        )        self.size_label = self.canvas.create_text(            self.start_x, self.start_y - 15,            text="0 x 0", fill="#00ff00", font=("Arial"12"bold")        )defon_mouse_drag(self, event):"""鼠标拖拽,更新选择框和尺寸"""ifnot self.dragging:return        self.end_x = event.x        self.end_y = event.y# 更新矩形位置        self.canvas.coords(            self.rect_id,             self.start_x, self.start_y,             self.end_x, self.end_y        )# 计算并显示尺寸        width = abs(self.end_x - self.start_x)        height = abs(self.end_y - self.start_y)        self.canvas.itemconfig(self.size_label, text=f"{width} x {height}")# 更新标签位置(跟随鼠标)        label_x = max(self.start_x, self.end_x) // 2        label_y = min(self.start_y, self.end_y) - 15        self.canvas.coords(self.size_label, label_x, label_y)defon_mouse_up(self, event):"""鼠标松开,完成选择"""ifnot self.dragging:return        self.dragging = False        self.end_x = event.x        self.end_y = event.y# 修正坐标(防止反向拖拽)        x1 = min(self.start_x, self.end_x)        y1 = min(self.start_y, self.end_y)        x2 = max(self.start_x, self.end_x)        y2 = max(self.start_y, self.end_y)# 检查是否选择了有效区域if x2 - x1 < 10or y2 - y1 < 10:            messagebox.showwarning("警告""选择区域太小,请重新选择")            self.cancel_selection()return        self.start_x, self.start_y, self.end_x, self.end_y = x1, y1, x2, y2        self.region_selected = True# 关闭选择窗口        self.selection_window.destroy()        messagebox.showinfo("完成"f"区域选择成功!\n尺寸: {x2-x1} x {y2-y1}")defcancel_selection(self, event=None):"""取消区域选择"""        self.dragging = False        self.region_selected = Falseif self.selection_window:            self.selection_window.destroy()defstart_record(self):ifnot self.region_selected:            messagebox.showwarning("警告""请先选择录制区域")returnif self.recording:            messagebox.showwarning("警告""正在录制中...")return        self.recording = True        self.frames.clear()# 子线程录制,不卡GUI        t = threading.Thread(target=self.record_loop)        t.daemon = True        t.start()        messagebox.showinfo("开始""已开始录制,操作你的屏幕即可")defrecord_loop(self):"""循环截取指定区域画面"""        interval = 1.0 / self.fps.get()while self.recording:# 截取指定区域            img = ImageGrab.grab(bbox=(self.start_x, self.start_y, self.end_x, self.end_y))            self.frames.append(img)            time.sleep(interval)defstop_record(self):ifnot self.recording:            messagebox.showwarning("警告""当前未录制")return        self.recording = False        time.sleep(0.3)if len(self.frames) < 2:            messagebox.showwarning("提示""录制帧数太少,无法生成GIF")return# 保存GIF        save_path = filedialog.asksaveasfilename(            defaultextension=".gif",            filetypes=[("GIF动图""*.gif")]        )ifnot save_path:return# 合成GIF        imageio.mimsave(save_path, self.frames, fps=self.fps.get())        messagebox.showinfo("完成"f"GIF已保存到:\n{save_path}")defclear_frames(self):        self.frames.clear()        self.recording = False        messagebox.showinfo("完成""已清空所有录制画面")if __name__ == "__main__":    root = tk.Tk()    app = Screen2GifGUI(root)    root.mainloop()

核心知识点总结

  1. tkinter高级GUI技巧:掌握了Toplevel顶层窗口的创建和属性配置,包括全屏显示、透明效果、窗口置顶和无边框模式;学会了使用Canvas组件进行实时绘图,以及鼠标和键盘事件的绑定与处理。
  2. 多线程编程实践:理解了GUI程序中使用多线程的必要性,掌握了threading模块的基本用法,学会了使用守护线程来执行后台任务,避免主线程阻塞。
  3. 屏幕截图与图像处理:熟悉了PIL库中ImageGrab模块的使用,能够实现指定区域的屏幕截图;了解了图像数据的存储格式和处理方式。
  4. GIF文件生成技术:掌握了使用imageio库合成GIF动图的方法,学会了通过调整帧率来平衡GIF的流畅度和文件体积。
  5. 面向对象程序设计:学会了将复杂的功能封装在类中,通过实例变量管理程序状态,通过方法实现具体功能,提高了代码的可读性、可维护性和可扩展性。

拓展应用场景与详细测试步骤

拓展应用场景

  1. 技术教程制作:录制软件操作步骤、编程代码演示、系统配置教程等,生成清晰的GIF动图插入到博客、公众号文章或文档中,比纯文字更直观易懂。
  2. bug反馈与沟通:向开发人员演示bug的复现过程,GIF能够准确展示操作步骤和异常现象,大大提高沟通效率,减少不必要的误解。
  3. 产品功能展示:录制产品的核心功能演示,用于产品介绍、营销推广或客户培训,让用户能够快速了解产品的使用方法和优势。
  4. 个性化表情包制作:截取电影、电视剧或网络视频中的精彩片段,制作成个性化的表情包,在聊天中使用。
  5. 操作流程记录:记录重要的电脑操作流程,方便以后查阅或分享给同事,避免重复讲解。

详细测试步骤

  1. 环境准备
    • 安装Python 3.7及以上版本
    • 打开命令提示符,执行以下命令安装依赖库:pip install pillow imageio pyautogui
  2. 运行程序
    • 将上面的代码复制到文本编辑器中,保存为screen2gif.py
    • 双击运行该文件,或者在命令行中执行python screen2gif.py
  3. 区域选择功能测试
    • 点击"1. 选择录制区域"按钮,观察主窗口是否自动最小化,是否出现全屏半透明遮罩,鼠标是否变为十字光标
    • 按住鼠标左键从左上向右下拖动,观察是否实时显示绿色虚线框和尺寸标签
    • 按住鼠标左键从右下向左上拖动,观察坐标是否自动修正,尺寸显示是否正确
    • 在选择过程中按ESC键,观察是否取消选择并返回主界面
    • 选择一个非常小的区域(小于10x10像素),观察是否弹出警告提示
  4. 录制与生成功能测试
    • 选择一个有效区域后,点击"2. 开始录制"按钮,观察是否弹出开始提示
    • 操作屏幕上的内容,等待5-10秒后点击"3. 停止并生成GIF"按钮
    • 在弹出的保存对话框中选择保存路径和文件名,点击保存
    • 找到生成的GIF文件,双击打开,观察播放是否流畅,内容是否正确
    • 分别测试5帧、15帧和30帧的帧率,观察GIF播放速度和文件体积的变化
  5. 其他功能测试
    • 录制一段内容后,点击"清空录制帧"按钮,然后直接点击生成GIF,观察是否提示帧数太少
    • 未选择任何区域直接点击"开始录制",观察是否弹出警告提示
    • 录制不到1秒就点击停止,观察是否提示帧数太少无法生成GIF

这个工具虽然简单,但完全能满足日常绝大多数的GIF录制需求。你可以根据自己的需要继续扩展功能,比如添加鼠标指针显示、添加文字水印、支持导出为MP4格式、添加录制倒计时等。希望这篇文章对你有帮助,赶紧动手试试吧!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 19:29:49 HTTP/2.0 GET : https://f.mffb.com.cn/a/493259.html
  2. 运行时间 : 0.278902s [ 吞吐率:3.59req/s ] 内存消耗:4,637.18kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=878b73691d6fc8573cc85290018282cd
  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.000559s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000786s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.007356s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.007550s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000723s ]
  6. SELECT * FROM `set` [ RunTime:0.002685s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000820s ]
  8. SELECT * FROM `article` WHERE `id` = 493259 LIMIT 1 [ RunTime:0.032642s ]
  9. UPDATE `article` SET `lasttime` = 1783078190 WHERE `id` = 493259 [ RunTime:0.058413s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000751s ]
  11. SELECT * FROM `article` WHERE `id` < 493259 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.003137s ]
  12. SELECT * FROM `article` WHERE `id` > 493259 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002353s ]
  13. SELECT * FROM `article` WHERE `id` < 493259 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.017642s ]
  14. SELECT * FROM `article` WHERE `id` < 493259 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.022372s ]
  15. SELECT * FROM `article` WHERE `id` < 493259 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.038762s ]
0.282700s