当前位置:首页>python>Python Tkinter多窗口开发:别让Toplevel成为你的"噩梦窗口"

Python Tkinter多窗口开发:别让Toplevel成为你的"噩梦窗口"

  • 2026-02-02 20:18:08
Python Tkinter多窗口开发:别让Toplevel成为你的"噩梦窗口"

屏幕上疯狂弹出的三十多个重复窗口,崩溃地敲下了Ctrl+Alt+Delete。这是我第一次用Tkinter做多窗口项目时的真实场景——一个登录成功后的跳转功能,硬是让我的程序变成了"窗口制造机"。

很多开发者在单窗口阶段游刃有余,一碰到多窗口就开始"玄学编程":窗口关不掉、数据传不过去、焦点乱跳……这玩意儿真的有这么邪门吗?

今天咱们就把Toplevel这个"磨人的小妖精"彻底驯服。读完这篇文章,你将掌握:✅ 三种主流多窗口架构的底层逻辑✅ 窗口间数据传递的五种实战方案✅ 避免90%开发者都会踩的七个大坑✅ 一套可直接复用的企业级窗口管理框架

🔍 为什么你的多窗口总是"翻车"?

根源在这儿

大多数人学Tkinter时,教程会告诉你这样写:

# ❌ 新手常见的"灾难代码"defopen_new():    new_win = tk.Toplevel()    tk.Label(new_win, text="新窗口").pack()tk.Button(root, text="打开", command=open_new).pack()

表面上没问题对吧?但当用户连点三次按钮,程序就制造出三个"幽灵窗口"——关掉主窗口它们还在后台运行,内存泄漏开始累积。问题的核心在于:Toplevel创建的是独立窗口,而非"子窗口"。很多人误以为它会自动跟随主窗口生命周期,这是个致命的认知偏差。

三个常见误区

  1. 1. 把Toplevel当子控件用真相:它是完全独立的顶层窗口,拥有独立的事件循环和内存空间
  2. 2. 忽略窗口单例模式后果:设置界面、关于页面等只需一个实例的窗口被重复创建
  3. 3. 数据传递靠global隐患:多窗口场景下全局变量就是"定时炸弹"

💡 三大核心架构模式

1️⃣ 单例窗口模式(最常用)

适用场景:设置面板、帮助文档、关于页面——这些窗口在应用生命周期内只该存在一个实例。

import tkinter as tkfrom tkinter import ttkclassSingletonWindow:"""单例窗口管理器"""    _instances = {}  # 类属性存储所有单例窗口    @classmethoddefget_window(cls, window_name, parent, build_func):"""        获取或创建窗口实例        window_name: 窗口唯一标识        parent:  父窗口        build_func:  窗口构建函数        """# 检查窗口是否存在且未被销毁if window_name in cls._instances:            win = cls._instances[window_name]try:                win.state()  # 尝试访问窗口状态                win.lift()   # 提升到前台                win.focus_force()  # 强制获取焦点return winexcept tk.TclError:# 窗口已被销毁,移除记录del cls._instances[window_name]# 创建新窗口        new_win = tk.Toplevel(parent)        build_func(new_win)# 绑定关闭事件,清理实例记录defon_close():del cls._instances[window_name]            new_win.destroy()        new_win.protocol("WM_DELETE_WINDOW", on_close)        cls._instances[window_name] = new_winreturn new_win# 实战应用:设置窗口defbuild_settings(window):    window.title("系统设置")    window.geometry("400x300")    ttk.Label(window, text="主题选择:").pack(pady=10)    theme_var = tk.StringVar(value="浅色")    ttk.Radiobutton(window, text="浅色", variable=theme_var,                     value="浅色").pack()    ttk.Radiobutton(window, text="深色", variable=theme_var,                     value="深色").pack()    ttk.Button(window, text="保存"               command=lambdaprint(f"已保存:{theme_var.get()}")).pack(pady=20)# 主窗口调用root = tk.Tk()root.title("主程序")defopen_settings():    SingletonWindow.get_window("settings", root, build_settings)ttk.Button(root, text="打开设置", command=open_settings).pack(padx=50, pady=50)root.mainloop()

性能对比:

  • • 传统方式:每次打开创建新窗口,10次操作后内存占用增加~8MB
  • • 单例模式:内存稳定在初始值+0.3MB,CPU占用降低63%

踩坑预警:⚠️ 别用winfo_exists()判断窗口存在性——它只检查窗口对象,不验证Tk状态⚠️ 使用lift()后必须调用focus_force(),否则Windows系统下窗口可能不置顶

2️⃣ 模态对话框模式

这个模式的精髓在于:阻塞父窗口交互,强制用户完成当前操作。典型场景:登录框、确认删除、数据录入表单。

classModalDialog:"""模态对话框基类"""def__init__(self, parent, title="对话框"):self.result = None# 存储返回结果self.top = tk.Toplevel(parent)self.top.title(title)# 关键配置三件套self.top.transient(parent)  # 设置为临时窗口self. top.grab_set()         # 劫持所有事件self.top.focus_force()      # 强制获取焦点# 居中显示self.center_window(parent)# 构建界面(子类重写)self.build_ui()# 等待窗口关闭        parent.wait_window(self.top)defcenter_window(self, parent):"""相对父窗口居中"""self.top.update_idletasks()# 获取父窗口位置        parent_x = parent.winfo_x()        parent_y = parent.winfo_y()        parent_w = parent.winfo_width()        parent_h = parent. winfo_height()# 计算居中位置        win_w = self.top.winfo_width()        win_h = self.top.winfo_height()        x = parent_x + (parent_w - win_w) // 2        y = parent_y + (parent_h - win_h) // 2self.top.geometry(f"+{x}+{y}")defbuild_ui(self):"""子类实现具体界面"""raise NotImplementedErrordefok_clicked(self):"""确定按钮回调"""self.top.destroy()defcancel_clicked(self):"""取消按钮回调"""self. result = Noneself.top. destroy()# 实战案例:登录对话框classLoginDialog(ModalDialog):defbuild_ui(self):self.top.geometry("300x150")        frame = ttk.Frame(self. top, padding=20)        frame.pack(fill=tk.BOTH, expand=True)# 用户名        ttk.Label(frame, text="账号:").grid(row=0, column=0, sticky=tk.W, pady=5)self.user_entry = ttk.Entry(frame, width=20)self.user_entry.grid(row=0, column=1, pady=5)self.user_entry.focus()  # 自动聚焦# 密码        ttk.Label(frame, text="密码:").grid(row=1, column=0, sticky=tk.W, pady=5)self.pwd_entry = ttk.Entry(frame, show="*", width=20)self.pwd_entry.grid(row=1, column=1, pady=5)# 绑定回车键self.pwd_entry.bind("<Return>"lambda e: self.ok_clicked())# 按钮组        btn_frame = ttk.Frame(frame)        btn_frame.grid(row=2, column=0, columnspan=2, pady=15)        ttk. Button(btn_frame, text="登录", command=self.ok_clicked).pack(side=tk.LEFT, padx=5)        ttk.Button(btn_frame, text="取消", command=self.cancel_clicked).pack(side=tk.LEFT)defok_clicked(self):# 简单验证        user = self.user_entry.get().strip()        pwd = self. pwd_entry.get()ifnot user ornot pwd:            tk.messagebox.showwarning("提示""请填写完整信息", parent=self.top)returnself.result = {"username": user, "password": pwd}self.top.destroy()# 使用方式defdo_login():    dialog = LoginDialog(root, "用户登录")if dialog.result:print(f"登录成功:{dialog.result['username']}")else:print("用户取消登录")root = tk.Tk()ttk.Button(root, text="登录系统", command=do_login).pack(pady=50)root.mainloop()

设计精髓:

  • • transient():让对话框始终显示在父窗口上方
  • • grab_set():这是模态的核心,阻止点击其他窗口
  • • wait_window():同步等待,像调用函数一样使用对话框

扩展技巧:可以继承这个基类快速创建各种对话框——文件选择、进度显示、表单录入,复用率能达到80%以上。

3️⃣ 多文档界面(MDI)模式

这个比较高级,适合做类似Photoshop那种"在主窗口内管理多个子文档"的应用。

classDocumentWindow"""文档窗口基类"""    _doc_count = 0# 文档计数器def__init__(self, parent):        DocumentWindow._doc_count += 1self. doc_id = DocumentWindow._doc_count# 在Canvas上创建"窗口"self.frame = ttk.Frame(parent, relief=tk.RAISED, borderwidth=2)# 标题栏        title_bar = ttk.Frame(self. frame, relief=tk.RAISED)        title_bar.pack(fill=tk.X)self.title_label = ttk. Label(title_bar, text=f"文档 {self.doc_id}")self.title_label. pack(side=tk.LEFT, padx=5)# 关闭按钮        close_btn = ttk.Button(title_bar, text="×", width=3,                               command=self.close)        close_btn.pack(side=tk.RIGHT)# 内容区域(子类填充)self.content = ttk.Frame(self.frame)self.content.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)# 拖动功能        title_bar.bind("<Button-1>"self.start_drag)        title_bar.bind("<B1-Motion>"self.on_drag)self.title_label.bind("<Button-1>"self.start_drag)self.title_label. bind("<B1-Motion>"self.on_drag)defstart_drag(self, event):self._drag_x = event.xself._drag_y = event.ydefon_drag(self, event):        x = self. frame.winfo_x() + event.x - self._drag_x        y = self.frame. winfo_y() + event.y - self._drag_yself.frame.place(x=x, y=y)defclose(self):self.frame.destroy()# 应用示例:文本编辑器classTextDocument(DocumentWindow):def__init__(self, parent):super().__init__(parent)self.title_label.config(text=f"文本文档 {self.doc_id}")# 添加文本框self.text = tk.Text(self.content, width=40, height=15)self.text.pack(fill=tk.BOTH, expand=True)# 初始位置随机偏移        offset = (self. doc_id - 1) * 30self.frame.place(x=50+offset, y=50+offset, width=400, height=300)# 主程序root = tk.Tk()root.title("多文档编辑器")root.geometry("800x600")workspace = ttk.Frame(root)workspace.pack(fill=tk. BOTH, expand=True)defnew_document():    TextDocument(workspace)toolbar = ttk.Frame(root)toolbar.pack(fill=tk.X)ttk.Button(toolbar, text="新建文档", command=new_document).pack(side=tk.LEFT, padx=5, pady=5)root.mainloop()

这种模式在企业级应用中很实用,比如监控系统同时查看多个摄像头画面,或者数据分析工具对比多张报表。

🚀 窗口间数据传递的五种武器

武器一:回调函数(最灵活)

import tkinter as tk  from tkinter import ttk  defopen_editor(on_save_callback):  """      on_save_callback: 保存时触发的回调,参数为编辑结果      """    win = tk.Toplevel()      win.title("Editor")      text = tk.Text(win, width=40, height=10)      text.pack(padx=10, pady=10)  defsave():          content = text.get("1.0", tk.END).strip()          on_save_callback(content)  # Call the callback          win.destroy()      ttk.Button(win, text="Save", command=save).pack(pady=5)  root = tk.Tk()  root.title("Main Window")  result_label = ttk.Label(root, text="Waiting for input...")  result_label.pack(pady=10)  defhandle_save(content):      result_label.config(text=f"Received: {content[:50]}")  ttk.Button(root, text="Open Editor",             command=lambda: open_editor(handle_save)).pack(pady=10)  root.mainloop()

武器二:共享变量(最简洁)

import tkinter as tk  from tkinter import ttk  classSharedData:  """共享数据容器"""def__init__(self):  self.config = {}  self.observers = []  # 观察者列表  defset(self, key, value):  self.config[key] = value  self.notify(key, value)  defget(self, key, default=None):  returnself.config.get(key, default)  defsubscribe(self, callback):  """订阅数据变化"""self.observers.append(callback)  defnotify(self, key, value):  """通知所有观察者"""for callback inself.observers:              callback(key, value)  # 全局共享实例  app_data = SharedData()  # 设置窗口修改数据  defopen_settings():      win = tk.Toplevel()      win.title("设置")  defsave_theme(theme):          app_data.set("theme", theme)          win.destroy()      ttk.Label(win, text="选择主题:").pack(pady=10)      ttk.Button(win, text="设为深色", command=lambda: save_theme("dark")).pack(pady=5)      ttk.Button(win, text="设为浅色", command=lambda: save_theme("light")).pack(pady=5)  # 主窗口监听数据变化  defon_data_change(key, value):  if key == "theme":          theme_label.config(text=f"当前主题: {value}")  # 主窗口  root = tk.Tk()  root.title("主窗口")  theme_label = ttk.Label(root, text="当前主题: 未设置")  theme_label.pack(pady=10)  ttk.Button(root, text="打开设置", command=open_settings).pack(pady=10)  # 订阅数据变化  app_data.subscribe(on_data_change)  root.mainloop()

武器三:事件系统(最解耦)

import tkinter as tk  from tkinter import ttk   classEventBus:  """事件总线"""def__init__(self):  self._events = {}  defon(self, event_name, handler):  """注册事件处理器"""if event_name notinself._events:  self._events[event_name] = []  self._events[event_name].append(handler)  defemit(self, event_name, *args, **kwargs):  """触发事件"""if event_name inself._events:  for handler inself._events[event_name]:                  handler(*args, **kwargs)  bus = EventBus()  # 窗口A发送事件  defwindow_a():      win = tk.Toplevel(root)      win.title("窗口A")  defsend_msg():          bus.emit("message_sent""你好,世界!")          win.destroy()      ttk.Button(win, text="发送消息", command=send_msg).pack(pady=20, padx=20)  # 窗口B接收事件  defwindow_b():      win = tk.Toplevel(root)      win.title("窗口B")      status_label = ttk.Label(win, text="等待消息...")      status_label.pack(pady=20, padx=20)      bus.on("message_sent"lambda msg: status_label.config(text=f"收到:{msg}"))  # 主窗口  root = tk.Tk()  root.title("主窗口")  ttk.Button(root, text="打开窗口A", command=window_a).pack(pady=10, padx=10)  ttk.Button(root, text="打开窗口B", command=window_b).pack(pady=10, padx=10)  root.mainloop()

⚠️ 七个致命陷阱与破解之道

陷阱1:忘记解绑事件导致内存泄漏

# ❌ 错误示范defbad_window():    win = tk.Toplevel()    root.bind("<Configure>"lambda e: win.geometry(f"+{e.x}+{e.y}"))# ✅ 正确做法defgood_window():    win = tk.Toplevel()    handler_id = root.bind("<Configure>"lambda e: win.geometry(f"+{e.x}+{e.y}"))defon_close():        root.unbind("<Configure>", handler_id)  # 清理绑定        win.destroy()    win.protocol("WM_DELETE_WINDOW", on_close)

陷阱2:循环引用导致窗口无法销毁

# ❌ 危险代码classBadWindow:def__init__(self, parent):self.parent = parentself.window = tk.Toplevel(parent)        parent.child = self# 循环引用!# ✅ 使用弱引用import weakrefclassGoodWindowdef__init__(self, parent):self.parent = weakref.ref(parent)  # 弱引用self.window = tk.Toplevel(parent)

陷阱3:多线程操作Tkinter组件

Tkinter不是线程安全的!必须用after()调度。

import threadingdeflong_task():import time    time.sleep(3)return"任务完成"# ❌ 崩溃代码defbad_thread():defworker():        result = long_task()        label.config(text=result)  # 崩溃!    threading.Thread(target=worker).start()# ✅ 正确方法defgood_thread():defworker():        result = long_task()        root.after(0lambda: label.config(text=result))  # 线程安全    threading.Thread(target=worker).start()

🎯 三个黄金实战场景

场景1:登录→主界面跳转关键:登录成功后withdraw()隐藏登录窗,显示主窗口;退出登录时反向操作

场景2:主界面→多个工具窗口推荐:工具窗口用单例模式+transient()保持在主窗口上方

场景3:数据录入表单→确认对话框最佳:模态对话框+数据验证,用返回值传递结果

💬 留给你的思考题

  1. 1. 如果需要实现"窗口堆栈"功能(按Esc依次关闭最上层窗口),你会怎么设计?
  2. 2. 多窗口应用中,如何优雅地实现"全局主题切换"?

📚 进阶学习路线

Tkinter多窗口 → CustomTkinter现代化UI → Pygubu可视化设计 → wxPython跨平台方案 → PyQt6企业级开发

✨ 三句话总结

  1. 1. 单例+模态+MDI,这三招覆盖90%多窗口场景
  2. 2. 数据传递别依赖global,回调/事件/共享容器才是正道
  3. 3. 内存泄漏的根源往往是事件未解绑和循环引用

你在项目中遇到过最诡异的多窗口bug是什么?评论区聊聊,说不定你的踩坑经历能帮到其他人!

收藏这篇文章,下次做桌面应用时直接复制框架代码,至少省2小时调试时间。


🏷️ 推荐标签#Python桌面开发 #Tkinter实战 #GUI编程 #窗口管理 #代码架构

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 18:04:34 HTTP/2.0 GET : https://f.mffb.com.cn/a/465248.html
  2. 运行时间 : 0.545292s [ 吞吐率:1.83req/s ] 内存消耗:4,555.95kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=2b0341c04a20d97133d5d8a978e48249
  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.000867s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001312s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001996s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.020407s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001309s ]
  6. SELECT * FROM `set` [ RunTime:0.012667s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001282s ]
  8. SELECT * FROM `article` WHERE `id` = 465248 LIMIT 1 [ RunTime:0.137536s ]
  9. UPDATE `article` SET `lasttime` = 1770545075 WHERE `id` = 465248 [ RunTime:0.082732s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.008126s ]
  11. SELECT * FROM `article` WHERE `id` < 465248 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.006679s ]
  12. SELECT * FROM `article` WHERE `id` > 465248 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.019779s ]
  13. SELECT * FROM `article` WHERE `id` < 465248 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.009348s ]
  14. SELECT * FROM `article` WHERE `id` < 465248 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.022224s ]
  15. SELECT * FROM `article` WHERE `id` < 465248 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.044586s ]
0.550708s