当前位置:首页>python>Python CustomTkinter 多窗口与弹窗管理:模态、非模态与对话流程

Python CustomTkinter 多窗口与弹窗管理:模态、非模态与对话流程

  • 2026-07-01 17:54:48
Python CustomTkinter 多窗口与弹窗管理:模态、非模态与对话流程

🪟 一个让人抓狂的场景

用户点了"设置"按钮。新窗口弹出来了。

然后他没关设置窗口,又点了一次"设置"。又弹出来一个。再点,再弹。最后桌面上叠了五个一模一样的设置窗口,像俄罗斯套娃一样摞在那儿。

这不是假设。这是我在一个实际项目里遇到的真实 bug——用户反馈"软件有点怪",我远程看了一眼,好家伙,七个设置窗口。

多窗口管理,听起来简单。做起来,坑多得很。

这篇文章咱们就把这件事彻底聊清楚:模态窗口怎么做、非模态怎么管、对话流程怎么设计,附完整可运行代码,不绕弯子。


🧠 先把概念捋一遍

很多人分不清模态和非模态,用的时候全凭感觉。其实区别很直接——

模态窗口(Modal):弹出后,主窗口被"冻住",用户必须先处理弹窗才能继续操作。确认删除、填写表单、输入密码——这些场景用模态。

非模态窗口(Non-Modal):弹出后,主窗口照常可以操作,两个窗口互不干扰。日志查看器、悬浮工具栏、实时监控面板——这些适合非模态。

选错了,用户体验就会很奇怪。把一个"查看日志"做成模态,用户每次看日志都得先关掉它才能继续干活,那不是在帮用户,是在折磨用户。


🔒 模态窗口:grab_set() 才是关键

CTk里做模态窗口,很多人只知道用CTkToplevel,但少了一步——grab_set()

python1import customtkinter as ctk234class ConfirmDialog(ctk.CTkToplevel):5"""通用确认对话框(模态)"""67def __init__(self, master, title="确认", message="确定要执行此操作吗?"):8super().__init__(master)910        self.result = None  # 用来传递用户的选择1112        self.title(title)13        self.geometry("360x180")14        self.resizable(FalseFalse)1516# ⭐ 关键:设置模态,阻断主窗口输入17        self.grab_set()18# 让弹窗居中于父窗口19        self.transient(master)2021        self._build_ui(message)2223# 等待窗口关闭再返回24        self.wait_window()2526def _build_ui(self, message):27        ctk.CTkLabel(28            self,29            text=message,30            font=ctk.CTkFont(family="Microsoft YaHei", size=14),31            wraplength=30032        ).pack(pady=(2820), padx=20)3334        btn_frame = ctk.CTkFrame(self, fg_color="transparent")35        btn_frame.pack(pady=(020))3637        ctk.CTkButton(38            btn_frame, text="确认", width=100,39            fg_color="#4F46E5",40            command=self._on_confirm41        ).pack(side="left", padx=8)4243        ctk.CTkButton(44            btn_frame, text="取消", width=100,45            fg_color="#6B7280",46            command=self._on_cancel47        ).pack(side="left", padx=8)4849def _on_confirm(self):50        self.result = True51        self.destroy()5253def _on_cancel(self):54        self.result = False55        self.destroy()5657class App(ctk.CTk):58def __init__(self):59super().__init__()60        self.title("主窗口")61        self.geometry("400x300")6263# 按钮触发弹窗64        ctk.CTkButton(65            self, text="打开弹窗", command=self.open_confirm_dialog66        ).pack(pady=20)6768def open_confirm_dialog(self):69        dialog = ConfirmDialog(self, title="确认操作", message="你确定要继续吗?")70if dialog.result:71print("用户选择了确认")72else:73print("用户选择了取消")747576if __name__ == "__main__":77    app = App()78    app.mainloop()

这里有三个细节值得注意:

  • • grab_set() 把所有鼠标键盘事件"抢"过来,主窗口就收不到了——这才是真正的模态效果
  • • transient(master) 让弹窗跟随主窗口,最小化主窗口时弹窗也跟着消失,行为更自然
  • • wait_window() 让调用方"卡"在那一行,等弹窗关闭后再继续执行——这样dialog.result才能拿到值

少了grab_set(),窗口虽然弹出来了,但主窗口照样能点,那叫"看起来像模态",实际上不是。


🔓 非模态窗口:单例控制是重点

非模态的核心问题不是怎么弹,而是怎么防止重复弹

回到开头那个七个设置窗口的故事——根本原因就是没有做单例控制。解决方案也不复杂:

python1import customtkinter as ctk234class LogViewerWindow(ctk.CTkToplevel):5"""日志查看器(非模态,单例)"""67    _instance = None  # 类变量,记录唯一实例89def __new__(cls, master):10# 如果已有实例且窗口还活着,直接把它提到前台11if cls._instance is not None and cls._instance.winfo_exists():12            cls._instance.lift()13            cls._instance.focus()14return cls._instance1516# 否则创建新实例17        instance = super().__new__(cls)18        cls._instance = instance19return instance2021def __init__(self, master):22# 防止重复初始化(__new__返回旧实例时会再次触发__init__)23if hasattr(self, "_initialized"):24return25        self._initialized = True2627super().__init__(master)28        self.title("运行日志")29        self.geometry("600x400")3031# 窗口关闭时清除单例记录32        self.protocol("WM_DELETE_WINDOW", self._on_close)3334        self._build_ui()3536def _build_ui(self):37        self.textbox = ctk.CTkTextbox(self, font=ctk.CTkFont(family="Consolas", size=12))38        self.textbox.pack(fill="both", expand=True, padx=12, pady=12)3940def append_log(self, text: str):41"""向日志窗口追加内容(可从主窗口调用)"""42        self.textbox.insert("end", text + "\n")43        self.textbox.see("end")4445def _on_close(self):46LogViewerWindow._instance = None47        self.destroy()484950class App(ctk.CTk):51def __init__(self):52super().__init__()53        self.title("主窗口")54        self.geometry("400x300")5556# 按钮打开日志窗口57        ctk.CTkButton(58            self, text="打开日志窗口", command=self.open_log_viewer59        ).pack(pady=20)6061# 按钮追加日志62        ctk.CTkButton(63            self, text="追加日志", command=self.append_log64        ).pack(pady=20)6566def open_log_viewer(self):67"""打开日志窗口"""68        self.log_viewer = LogViewerWindow(self)6970def append_log(self):71"""向日志窗口追加日志"""72if hasattr(self, "log_viewer"and self.log_viewer.winfo_exists():73            self.log_viewer.append_log("这是一个日志条目。")74else:75print("日志窗口未打开!")767778if __name__ == "__main__":79    app = App()80    app.mainloop()

__new__做单例控制,是因为__init__每次都会被调用——如果在__init__里判断,会有重复初始化的问题。这个细节很多教程没提,实际踩坑才知道。

另外,_on_close里清除_instance这一步不能省。省了的话,窗口关掉之后,_instance还指着一个已销毁的对象,下次再打开就直接报错。


🔄 对话流程:多步骤弹窗怎么串起来

有些场景比简单的确认框复杂得多——比如"新建项目向导",需要用户一步一步填写信息,最后汇总提交。

这种多步骤对话流程,我倾向于用单窗口内切换帧的方式,而不是弹窗套弹窗:

python1import customtkinter as ctk234class SetupWizard(ctk.CTkToplevel):5"""多步骤向导对话框"""67def __init__(self, master):8super().__init__(master)9        self.title("新建项目向导")10        self.geometry("480x360")11        self.resizable(FalseFalse)12        self.grab_set()13        self.transient(master)1415        self.data = {}      # 收集各步骤的数据16        self.current_step = 017        self.steps = [18            self._build_step1,19            self._build_step2,20            self._build_step3,21        ]2223# 内容区域24        self.content_frame = ctk.CTkFrame(self, fg_color="transparent")25        self.content_frame.pack(fill="both", expand=True, padx=20, pady=(200))2627# 底部导航28        self._build_nav()2930# 渲染第一步31        self._render_step()3233        self.wait_window()3435def _build_nav(self):36        nav = ctk.CTkFrame(self, fg_color="transparent", height=56)37        nav.pack(fill="x", padx=20, pady=12)38        nav.pack_propagate(False)3940        self.btn_prev = ctk.CTkButton(41            nav, text="上一步", width=100, fg_color="#6B7280",42            command=self._prev_step43        )44        self.btn_prev.pack(side="left")4546        self.step_label = ctk.CTkLabel(nav, text="")47        self.step_label.pack(side="left", expand=True)4849        self.btn_next = ctk.CTkButton(50            nav, text="下一步", width=100, fg_color="#4F46E5",51            command=self._next_step52        )53        self.btn_next.pack(side="right")5455def _render_step(self):56# 清空内容区域57for widget in self.content_frame.winfo_children():58            widget.destroy()5960# 渲染当前步骤61        self.steps[self.current_step]()6263# 更新导航状态64        total = len(self.steps)65        self.step_label.configure(text=f"步骤 {self.current_step + 1} / {total}")66        self.btn_prev.configure(state="normal" if self.current_step > 0 else "disabled")67        is_last = self.current_step == total - 168        self.btn_next.configure(text="完成" if is_last else "下一步")6970def _build_step1(self):71        ctk.CTkLabel(self.content_frame, text="第一步:填写项目基本信息",72                     font=ctk.CTkFont(size=15, weight="bold")).pack(anchor="w", pady=(016))7374        ctk.CTkLabel(self.content_frame, text="项目名称").pack(anchor="w")75        self.entry_name = ctk.CTkEntry(self.content_frame, placeholder_text="请输入项目名称")76        self.entry_name.pack(fill="x", pady=(412))7778# 如果之前填过,回显数据79if "name" in self.data:80            self.entry_name.insert(0, self.data["name"])8182def _build_step2(self):83        ctk.CTkLabel(self.content_frame, text="第二步:选择项目类型",84                     font=ctk.CTkFont(size=15, weight="bold")).pack(anchor="w", pady=(016))8586        self.var_type = ctk.StringVar(value=self.data.get("type""桌面应用"))87for option in ["桌面应用""数据工具""自动化脚本"]:88            ctk.CTkRadioButton(89                self.content_frame, text=option,90                variable=self.var_type, value=option91            ).pack(anchor="w", pady=4)9293def _build_step3(self):94        ctk.CTkLabel(self.content_frame, text="第三步:确认信息",95                     font=ctk.CTkFont(size=15, weight="bold")).pack(anchor="w", pady=(016))9697        summary = f"项目名称:{self.data.get('name', '未填写')}\n项目类型:{self.data.get('type', '未选择')}"98        ctk.CTkLabel(self.content_frame, text=summary,99                     justify="left", anchor="w").pack(anchor="w")100101def _collect_current_data(self):102"""离开当前步骤前收集数据"""103if self.current_step == 0:104            self.data["name"] = self.entry_name.get().strip()105elif self.current_step == 1:106            self.data["type"] = self.var_type.get()107108def _next_step(self):109        self._collect_current_data()110111if self.current_step < len(self.steps) - 1:112            self.current_step += 1113            self._render_step()114else:115# 最后一步点"完成"116print("向导完成,收集到的数据:", self.data)117            self.destroy()118119def _prev_step(self):120        self._collect_current_data()121        self.current_step -= 1122        self._render_step()123124125class App(ctk.CTk):126"""主窗口"""127128def __init__(self):129super().__init__()130        self.title("主窗口")131        self.geometry("400x300")132133        ctk.CTkButton(134            self, text="打开向导", command=self.open_wizard135        ).pack(pady=20)136137def open_wizard(self):138"""打开向导窗口"""139        wizard = SetupWizard(self)140print("收集到的数据:", wizard.data)141142143if __name__ == "__main__":144    app = App()145    app.mainloop()

这个设计的核心思路是:用一个窗口,通过清空并重绘内容区域来模拟"翻页"。比弹窗套弹窗干净得多,数据也好管理——全都存在self.data字典里,哪步都能读写。


🚩 几个真实踩过的坑

坑一:CTkToplevel 在 Windows 上闪烁

CTk的CTkToplevel在Windows下初始化时有时会有短暂的白色闪烁。解决方法是在__init__里先调用self.withdraw()隐藏,布局完成后再self.deiconify()显示:

python1def __init__(self, master):2super().__init__(master)3    self.withdraw()          # 先藏起来4# ... 布局代码 ...5    self.after(10, self.deiconify)  # 短暂延迟后显示,避免闪烁

坑二:wait_window() 之后访问已销毁控件

模态弹窗关闭后,弹窗内的所有控件都已销毁。如果在wait_window()之后还试图读取弹窗内的Entry值,会报错。正确做法是在关闭前把数据存到实例变量(比如self.result),关闭后只读实例变量。

坑三:子窗口里开线程,主窗口崩了

Tkinter的UI操作必须在主线程。如果在CTkToplevel里启动了后台线程,线程里直接更新UI,大概率会崩。解决方案是用after()把UI更新调度回主线程:

python1# 线程里这样做2self.after(0lambda: self.label.configure(text="完成"))

💬 最后聊两句

多窗口管理这件事,本质上是在管理用户的注意力流。模态是在说"先处理这件事",非模态是在说"这个可以随时看",向导流程是在说"咱们一步一步来"。

搞清楚这三种意图,再对应到代码实现,就不会乱。

我见过不少桌面工具,功能挺强,但弹窗管理一塌糊涂——该模态的不模态,不该重复弹的到处弹,向导流程用了五个嵌套弹窗。用户用起来云里雾里,开发者维护起来也头疼。

窗口管理不是小事,它直接决定用户觉得软件"顺不顺手"。

本文涉及的完整代码结构可在 GitHub 搜索 ctk-window-management-demo 参考。欢迎在评论区分享你在多窗口开发中遇到的问题,或者聊聊你自己的解决思路。


#Python桌面开发#CustomTkinter#多窗口管理#模态弹窗#Windows应用开发

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 21:56:24 HTTP/2.0 GET : https://f.mffb.com.cn/a/492767.html
  2. 运行时间 : 0.102439s [ 吞吐率:9.76req/s ] 内存消耗:5,064.66kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=ac3f32eaae0a476874e3664dca2dd4c5
  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.000530s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000650s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000282s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000257s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000596s ]
  6. SELECT * FROM `set` [ RunTime:0.000250s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000680s ]
  8. SELECT * FROM `article` WHERE `id` = 492767 LIMIT 1 [ RunTime:0.006487s ]
  9. UPDATE `article` SET `lasttime` = 1783086984 WHERE `id` = 492767 [ RunTime:0.001391s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000269s ]
  11. SELECT * FROM `article` WHERE `id` < 492767 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000617s ]
  12. SELECT * FROM `article` WHERE `id` > 492767 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001360s ]
  13. SELECT * FROM `article` WHERE `id` < 492767 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003118s ]
  14. SELECT * FROM `article` WHERE `id` < 492767 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.014025s ]
  15. SELECT * FROM `article` WHERE `id` < 492767 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004940s ]
0.104343s