当前位置:首页>python>Python 用Tkinter打造数据采集仪表盘——老司机的实战笔记

Python 用Tkinter打造数据采集仪表盘——老司机的实战笔记

  • 2026-02-26 10:06:17
Python 用Tkinter打造数据采集仪表盘——老司机的实战笔记

说实话,每次提到GUI开发,总有人跳出来diss Tkinter。

"界面太丑"、"功能太弱"、"还不如用Web"——这些话我听了不下百遍。但你知道吗?上个月我用Tkinter给工厂做了个设备监控仪表盘,老板看完直接拍板:比那些动辄几万的工控软件好用多了

为啥?三个字:够轻量

不需要部署服务器,不用担心浏览器兼容性,双击exe就能跑。对于很多中小企业的数据采集场景来说,这才是真正的刚需。今天咱们就聊聊,怎么用Python自带的这个"老古董",做出一个能打的实时数据仪表盘。

💡 先搞清楚:仪表盘到底要干啥

很多人上来就写代码。错了。

我之前带的实习生就犯过这错误——花两周写了一堆花里胡哨的控件,结果客户看完说:"我只想知道温度超标了没有"。白忙活。

一个合格的数据采集仪表盘,核心就三件事:

  1. 1. 实时显示:数据得刷新,而且不能卡
  2. 2. 状态预警:超阈值要能第一时间发现
  3. 3. 历史追溯:出了问题得能回查数据

搞明白这三点,咱们再动手。

🚀 方案一:最简单的实时数字显示

先来个最基础的。假设你要监控CPU温度和内存使用率(当然实际项目中可能是传感器数据,原理一样)。

import tkinter as tkimport psutilimport threadingimport timeclassSimpleMonitor:def__init__(self, root):self.root = rootself.root.title("设备监控仪表盘 v1.0")self.root.geometry("400x250")self.root.configure(bg='#2C3E50')# 标题区域        title = tk.Label(root, text="实时监控面板"                        font=("微软雅黑"18"bold"),                        bg='#2C3E50', fg='#ECF0F1')        title.pack(pady=20)# CPU温度显示self.cpu_frame = self._create_metric_frame("CPU温度")self.cpu_value = tk.Label(self.cpu_frame, text="--°C",                                 font=("Arial"32"bold"),                                 bg='#34495E', fg='#3498DB')self.cpu_value.pack()# 内存使用率显示self.mem_frame = self._create_metric_frame("内存使用")self.mem_value = tk.Label(self.mem_frame, text="--%",                                 font=("Arial"32"bold"),                                 bg='#34495E', fg='#2ECC71')self.mem_value.pack()# 启动数据更新线程self.running = Trueself.update_thread = threading.Thread(target=self._update_data, daemon=True)self.update_thread.start()def_create_metric_frame(self, title):"""创建指标显示框架"""        frame = tk.Frame(self.root, bg='#34495E', padx=20, pady=15)        frame.pack(fill='x', padx=20, pady=10)        label = tk.Label(frame, text=title,                         font=("微软雅黑"12),                        bg='#34495E', fg='#BDC3C7')        label.pack()return framedef_update_data(self):"""后台线程:持续采集数据"""whileself.running:try:# 模拟获取CPU温度(实际项目中替换为真实传感器读取)                cpu_temp = psutil.sensors_temperatures().get('coretemp', [{}])[0].current ifhasattr(psutil, "sensors_temperatures"else45.0                mem_percent = psutil.virtual_memory().percent# 更新UI(必须通过after方法在主线程中执行)self.root.after(0self._refresh_ui, cpu_temp, mem_percent)                time.sleep(1)  # 1秒刷新一次except Exception as e:print(f"数据采集异常: {e}")def_refresh_ui(self, cpu_temp, mem_percent):"""刷新界面显示"""# 根据数值改变颜色(预警机制)        cpu_color = '#E74C3C'if cpu_temp > 70else'#3498DB'        mem_color = '#E74C3C'if mem_percent > 80else'#2ECC71'self.cpu_value.config(text=f"{cpu_temp:.1f}°C", fg=cpu_color)self.mem_value.config(text=f"{mem_percent:.1f}%", fg=mem_color)if __name__ == "__main__":    root = tk.Tk()    app = SimpleMonitor(root)    root.mainloop()

🎯 这个方案的精髓在哪?

线程分离是关键。很多新手直接在主线程里while循环读数据,结果界面直接卡死。记住:Tkinter的UI更新必须在主线程,但数据采集可以扔后台

我用threading.Thread创建守护线程,配合root.after(0, ...)把UI刷新操作丢回主线程。这招在我做过的七八个项目里屡试不爽。

⚠️ 踩坑预警

  1. 1. 别用time.sleep阻塞主线程:新手常犯的错误,界面会假死
  2. 2. 记得设置daemon=True:不然关闭窗口程序还在后台跑
  3. 3. Windows下psutil可能没有温度接口:需要用模拟数据或者第三方库(像OpenHardwareMonitor)

📊 方案二:加上图表的进阶版

数字看着不直观?咱们加个实时曲线图。

这里要用到matplotlib——是的,它能嵌入Tkinter,而且效果出奇的好。

import tkinter as tk  from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg  from matplotlib.figure import Figure  import numpy as np  from collections import deque  import threading  import time  import random  classChartMonitor:  def__init__(self, root):  self.root = root  self.root.title("数据采集仪表盘 Pro")  self.root.geometry("900x600")  # 数据缓冲区(保留最近100个数据点)  self.max_points = 100self.time_data = deque(maxlen=self.max_points)  self.temp_data = deque(maxlen=self.max_points)  self.pressure_data = deque(maxlen=self.max_points)  self._setup_ui()  self._start_monitoring()  def_setup_ui(self):  """构建界面布局"""# 顶部控制栏          control_frame = tk.Frame(self.root, bg='#34495E', height=60)          control_frame.pack(fill='x', side='top')          tk.Label(control_frame, text="🎛️ 实时监控",                   font=("微软雅黑"16"bold"),                   bg='#34495E', fg='white').pack(side='left', padx=20, pady=10)  self.status_label = tk.Label(control_frame, text="● 运行中",                                       font=("微软雅黑"10),                                       bg='#34495E', fg='#2ECC71')  self.status_label.pack(side='right', padx=20)  # 图表区域          chart_frame = tk.Frame(self.root)          chart_frame.pack(fill='both', expand=True, padx=10, pady=10)  # 创建matplotlib图表  self.fig = Figure(figsize=(95), dpi=100, facecolor='#ECF0F1')  self.ax1 = self.fig.add_subplot(211)  self.ax2 = self.fig.add_subplot(212)  # 配置图表样式  for ax in [self.ax1, self.ax2]:              ax.set_facecolor('#FFFFFF')              ax.grid(True, linestyle='--', alpha=0.3)  self.ax1.set_ylabel('温度 (°C)', fontsize=10, fontproperties='Microsoft YaHei')  self.ax2.set_ylabel('压力 (kPa)', fontsize=10, fontproperties='Microsoft YaHei')  self.ax2.set_xlabel('时间 (秒)', fontsize=10, fontproperties='Microsoft YaHei')  # 嵌入Tkinter  self.canvas = FigureCanvasTkAgg(self.fig, master=chart_frame)  self.canvas.draw()  self.canvas.get_tk_widget().pack(fill='both', expand=True)  def_start_monitoring(self):  """启动监控线程"""self.running = Trueself.data_thread = threading.Thread(target=self._collect_data, daemon=True)  self.data_thread.start()  # 启动UI更新循环  self._update_chart()  def_collect_data(self):  """模拟数据采集(实际项目中替换为真实数据源)"""        t = 0whileself.running:  # 模拟传感器数据(带一点噪声)              temp = 25 + 10 * np.sin(t / 10) + random.uniform(-11)              pressure = 101 + 5 * np.cos(t / 15) + random.uniform(-0.50.5)  self.time_data.append(t)  self.temp_data.append(temp)  self.pressure_data.append(pressure)              t += 1            time.sleep(0.1)  # 100ms采样一次  def_update_chart(self):  """更新图表显示"""iflen(self.time_data) > 0:  # 清空旧图  self.ax1.clear()  self.ax2.clear()  # 绘制新数据  self.ax1.plot(list(self.time_data), list(self.temp_data),                            color='#E74C3C', linewidth=2, label='温度')  self.ax2.plot(list(self.time_data), list(self.pressure_data),                            color='#3498DB', linewidth=2, label='压力')  # 添加阈值线  self.ax1.axhline(y=30, color='orange', linestyle='--',                               linewidth=1, alpha=0.7, label='警戒线')  # 重新设置样式  for ax in [self.ax1, self.ax2]:                  ax.set_facecolor('#FFFFFF')                  ax.grid(True, linestyle='--', alpha=0.3)                  ax.legend(loc='upper right', prop={'family''Microsoft YaHei''size'9})  self.ax1.set_ylabel('温度 (°C)', fontsize=10, fontproperties='Microsoft YaHei')  self.ax2.set_ylabel('压力 (kPa)', fontsize=10, fontproperties='Microsoft YaHei')  self.ax2.set_xlabel('时间 (秒)', fontsize=10, fontproperties='Microsoft YaHei')  self.fig.tight_layout()  self.canvas.draw()  # 每200ms刷新一次(不要太频繁,否则CPU占用高)  self.root.after(200self._update_chart)  if __name__ == "__main__":      root = tk.Tk()      app = ChartMonitor(root)      root.mainloop()

🔥 这里有几个细节值得说道

为什么用deque而不是list?

因为需要固定长度的滑动窗口。deque(maxlen=100)会自动丢弃最旧的数据,不用手动管理数组大小。我之前用list做过,结果数据越积越多,最后内存爆了。

图表刷新频率怎么定?

这是个trade-off。刷新太快(比如50ms一次)CPU会飙升;太慢(比如1秒一次)曲线不流畅。我测试下来200-300ms是甜点——既流畅又不耗资源。

中文显示问题?

matplotlib默认不支持中文,需要指定字体。我这里用fontproperties='SimHei'(Windows自带黑体),Linux的话换成'WenQuanYi Zen Hei'

🎨 方案三:加上数据导出和报警功能

光看还不够,得能存、能报警。

这是我给某制造企业做的完整版本(简化过):

import tkinter as tk  from tkinter import messagebox  import csv  from datetime import datetime  import os  classProductionMonitor:  def__init__(self, root):  self.root = root  self.root.title("生产线监控系统")  self.root.geometry("600x400")  self.alert_threshold = 75.0# 报警阈值  self.data_log = []  self._build_interface()  self._start_auto_save()  def_build_interface(self):  """构建完整界面"""# 主显示区          display_frame = tk.LabelFrame(self.root, text="当前状态",                                        font=("微软雅黑"12"bold"),                                        padx=20, pady=20)          display_frame.pack(fill='both', expand=True, padx=20, pady=20)  self.value_label = tk.Label(display_frame, text="0.0",                                      font=("Arial"48"bold"),                                      fg='#2ECC71')  self.value_label.pack()          tk.Label(display_frame, text="设备运行参数 (单位: %)",                   font=("微软雅黑"10)).pack()  # 控制按钮区          btn_frame = tk.Frame(self.root)          btn_frame.pack(pady=10)          tk.Button(btn_frame, text="📊 导出数据", command=self._export_data,                    bg='#3498DB', fg='white', font=("微软雅黑"10),                    padx=15, pady=8).pack(side='left', padx=5)          tk.Button(btn_frame, text="⚙️ 设置阈值", command=self._set_threshold,                    bg='#95A5A6', fg='white', font=("微软雅黑"10),                    padx=15, pady=8).pack(side='left', padx=5)  # 日志显示区(最近10条记录)          log_frame = tk.LabelFrame(self.root, text="操作日志",                                    font=("微软雅黑"10))          log_frame.pack(fill='both', padx=20, pady=(020))  self.log_text = tk.Text(log_frame, height=6, font=("Consolas"9),                                  bg='#F8F9FA', state='disabled')  self.log_text.pack(fill='both', padx=5, pady=5)  self._add_log("系统启动成功")  def_simulate_monitoring(self):  """模拟数据监控"""import random          current_value = random.uniform(6090)  # 更新显示          color = '#E74C3C'if current_value > self.alert_threshold else'#2ECC71'self.value_label.config(text=f"{current_value:.1f}", fg=color)  # 记录数据          timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")  self.data_log.append({  'time': timestamp,  'value': current_value,  'status''ALERT'if current_value > self.alert_threshold else'NORMAL'        })  # 超阈值报警  if current_value > self.alert_threshold:  self._add_log(f"⚠️ 警告: 超标 ({current_value:.1f}%)")  self.root.bell()  # 系统提示音  self.root.after(2000self._simulate_monitoring)  def_export_data(self):  """导出CSV数据"""ifnotself.data_log:              messagebox.showinfo("提示""暂无数据可导出")  return        filename = f"监控数据_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"try:  withopen(filename, 'w', newline='', encoding='utf-8-sig'as f:                  writer = csv.DictWriter(f, fieldnames=['time''value''status'])                  writer.writeheader()                  writer.writerows(self.data_log)  self._add_log(f"✓ 数据已导出: {filename}")              messagebox.showinfo("成功"f"数据已保存至:\n{os.path.abspath(filename)}")  except Exception as e:              messagebox.showerror("错误"f"导出失败: {str(e)}")  def_set_threshold(self):  """设置报警阈值"""        dialog = tk.Toplevel(self.root)          dialog.title("阈值设置")          dialog.geometry("300x150")          dialog.transient(self.root)          dialog.grab_set()          tk.Label(dialog, text="输入报警阈值:",                   font=("微软雅黑"10)).pack(pady=20)          entry = tk.Entry(dialog, font=("Arial"14), justify='center')          entry.insert(0str(self.alert_threshold))          entry.pack()  defsave():  try:                  new_value = float(entry.get())  if0 <= new_value <= 100:  self.alert_threshold = new_value  self._add_log(f"阈值已更新: {new_value}%")                      dialog.destroy()  else:                      messagebox.showwarning("无效输入""请输入0-100之间的数值")  except ValueError:                  messagebox.showerror("错误""请输入有效数字")          tk.Button(dialog, text="保存", command=save,                    bg='#2ECC71', fg='white', padx=30, pady=5).pack(pady=20)  def_add_log(self, message):  """添加日志信息"""self.log_text.config(state='normal')          timestamp = datetime.now().strftime("%H:%M:%S")  self.log_text.insert('1.0'f"[{timestamp}{message}\n")  self.log_text.config(state='disabled')  def_start_auto_save(self):  """启动自动保存(每小时一次)"""defauto_save():  ifself.data_log:  self._export_data()  self.root.after(3600000, auto_save)  # 1小时 = 3600000毫秒  self._simulate_monitoring()          auto_save()  if __name__ == "__main__":      root = tk.Tk()      app = ProductionMonitor(root)      root.mainloop()

💎 这个版本的亮点

数据持久化不是摆设。很多演示代码到这就结束了,但实际应用中,客户最关心的就是"数据能不能保存"。我用CSV格式是因为:

  • • Excel能直接打开
  • • 文件小、读写快
  • • 不需要额外数据库

当然,如果数据量大(比如每秒上百条),建议上SQLite或者InfluxDB这种时序数据库。

报警机制要多样化root.bell()是系统提示音,但现实项目里我还会加:

  • • 弹窗提示(关键报警)
  • • 邮件通知(需要用smtplib)
  • • 微信推送(用企业微信webhook)

🤔 真实项目中还要考虑啥?

理论跟实践总有差距。这些是我踩过的坑:

1. 串口通信的坑

很多传感器是串口连接的。用pyserial库时注意:

  • • 波特率必须对上(9600还是115200?问硬件工程师)
  • • 数据格式要解析(是十六进制还是ASCII?)
  • • 异常处理要完善(拔插USB会触发异常)

2. 界面卡顿的优化

如果发现界面还是卡,检查这几点:

  • • 图表刷新频率降到500ms甚至1秒
  • • 用after_idle()代替after(0)
  • • 数据采集线程里加try-except,别让异常卡住

3. 打包部署

开发完要给客户用,Pyinstaller是首选:

pyinstaller --onefile --windowed --icon=app.ico monitor.py

注意--windowed参数会隐藏控制台黑框(很重要!客户看到黑框会以为是病毒)。

🎁 三个可以直接拿走的金句

  1. 1. "Tkinter的价值不在炫酷,在于可靠" —— 客户要的是稳定运行,不是PPT演示
  2. 2. "线程分离是GUI开发的铁律" —— 主线程卡死等于程序崩溃
  3. 3. "数据不落地,监控等于零" —— 必须有持久化方案

📚 想继续深入?

这三个方向值得研究:

  • • 高性能图表:试试PyQtGraph,比matplotlib快10倍
  • • 远程监控:把数据推到MQTT服务器,手机也能看
  • • 智能分析:接入numpy做数据统计,甚至简单的异常检测

✨ 最后聊两句

写这篇文章的时候,我回想起三年前第一次做类似项目的场景。那时候照着网上教程抄代码,结果到客户现场演示时界面直接卡死。现场那个尴尬啊...

后来才明白,技术选型没有高低贵贱,只有合不合适。Tkinter确实老,但对于很多场景来说,它就是最佳答案。

你在项目中遇到过什么有趣的监控需求吗?评论区聊聊?或者你有更好的实现方案,也欢迎来打脸(认真脸)。


实战模板已上传:文中三个完整代码可以直接运行测试相关标签#Python开发 #Tkinter #数据可视化 #工业监控 #GUI编程

💾 收藏理由:下次做监控界面直接复制粘贴改改就能用🔄 转发价值:你的同事可能正在为界面卡顿苦恼

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-03-01 03:11:12 HTTP/2.0 GET : https://f.mffb.com.cn/a/476004.html
  2. 运行时间 : 0.160722s [ 吞吐率:6.22req/s ] 内存消耗:4,797.41kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=cd5e424af3f0c29019c595888c3120db
  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.000897s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000860s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000447s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000389s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000586s ]
  6. SELECT * FROM `set` [ RunTime:0.000258s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000625s ]
  8. SELECT * FROM `article` WHERE `id` = 476004 LIMIT 1 [ RunTime:0.000598s ]
  9. UPDATE `article` SET `lasttime` = 1772305872 WHERE `id` = 476004 [ RunTime:0.000891s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000293s ]
  11. SELECT * FROM `article` WHERE `id` < 476004 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000503s ]
  12. SELECT * FROM `article` WHERE `id` > 476004 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000510s ]
  13. SELECT * FROM `article` WHERE `id` < 476004 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000968s ]
  14. SELECT * FROM `article` WHERE `id` < 476004 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001176s ]
  15. SELECT * FROM `article` WHERE `id` < 476004 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002581s ]
0.163074s