当前位置:首页>python>Python Tkinter搭建工业流程动画?这活儿比你想的有意思多了!

Python Tkinter搭建工业流程动画?这活儿比你想的有意思多了!

  • 2026-02-27 14:38:32
Python Tkinter搭建工业流程动画?这活儿比你想的有意思多了!

用纯Python的Tkinter搞了个动态工业流程模拟器。水箱里的液体会流动、泵会转、阀门能手动开关、流量计的数字跳得比股票行情还欢实。基本是一个简单的上位机样子了,只需要配合数据采集了。

今天咱就聊聊,怎么用最朴素的Tkinter画出这么个玩意儿。不需要PyQt5那套重装备,更不用碰Unity3D(太杀鸡用牛刀了)。


💡 为啥非得自己画?现成方案不香吗?

很多人会问:市面上不是有组态软件吗?对。但你考虑过这几个现实问题没:

成本账:一套正经的组态软件授权费,少说也得五位数起步。我们这种演示项目,预算就三千块。
定制难:那些软件的界面模板固定得要命,想改个颜色都得翻半天手册。
依赖重:客户现场可能只有台老旧Win7电脑,你让我装个几百兆的运行环境?

用Tkinter就不一样了——Python自带的库,零额外依赖。代码写完直接打包成exe,扔到U盘里就能跑。关键是完全可控,想加啥动画效果随便折腾。


🎯 整体思路拆解:工业流程的"表演逻辑"

在动手之前,咱得先理清楚这套系统的核心机制。工业流程不是随便画几个图标就完事的,它得符合物理常识逻辑因果

🔍 四个关键组件的交互链

水箱(储液) → 泵(动力) → 阀门(控制) → 流量计(监测)
     ↑____________反馈控制______________|

看着简单,但每个环节都有门道:

  1. 1. 水箱:液位得根据流量实时变化,不能瞬间清空(物理不允许)
  2. 2. :转起来要有惯性,不能说停就停
  3. 3. 阀门:开度决定流量大小,这是个典型的PID控制场景
  4. 4. 流量计:数字得带点波动,真实设备都有读数抖动

🚀 代码实战:一步步搭建动态系统

第一步:画出静态骨架

先别急着搞动画。我之前就吃过这亏——上来就写运动逻辑,结果画面坐标都没对齐,调了两小时还是歪的。

import tkinter as tk
from tkinter import ttk
import math
import random

classIndustrialProcess:
def__init__(self, root):
self.root = root
self.root.title("工业流程模拟系统 | 演示版 v1.0")
self.root.geometry("1000x700")
self.root.config(bg="
#2C3E50")

# 创建画布 - 这是所有图形的舞台
self.canvas = tk.Canvas(root, width=1000, height=600
                                bg="#34495E", highlightthickness=0)
self.canvas.pack(pady=20)

# 状态变量(核心数据层)
self.tank_level = 80.0# 水箱液位(百分比)
self.pump_running = False# 泵运行状态
self.valve_open = False# 阀门状态
self.flow_rate = 0.0# 当前流量
self.pump_angle = 0# 泵叶片旋转角度

self.draw_static_elements()  # 先画不动的部分
self.create_controls()       # 再做控制按钮

这里藏着个小技巧:我把所有状态都集中存在类属性里,而不是散落在各个函数的局部变量。为啥?因为后面做动画更新时,你得频繁访问这些数据。集中管理,改起来不头疼。


第二步:水箱的"呼吸感"设计

真实的液位变化不是线性的——想象你往杯子里倒水,刚开始涨得快,越往上越慢(因为横截面积变大了)。

defdraw_static_elements(self):
"""绘制静态组件"""

# 【水箱】- 用多边形模拟真实罐体
    tank_x, tank_y = 100150
    tank_width, tank_height = 120300

# 外壳(渐变效果得手动做)
self.canvas.create_rectangle(
        tank_x, tank_y, tank_x + tank_width, tank_y + tank_height,
        outline="#ECF0F1", width=3, fill=""
    )

# 液体区域 - 这个会动态更新
self.liquid_rect = self.canvas.create_rectangle(
        tank_x + 5, tank_y + tank_height - 5,  # 底部坐标固定
        tank_x + tank_width - 5, tank_y + tank_height - 5,
        fill="#3498DB", outline=""
    )

# 液位刻度线(每20%一条)
for i inrange(010120):
        y_pos = tank_y + tank_height - (tank_height * i / 100)
self.canvas.create_line(
            tank_x - 10, y_pos, tank_x, y_pos, 
            fill="#BDC3C7", width=2
        )
self.canvas.create_text(
            tank_x - 25, y_pos, text=f"{i}%"
            fill="#ECF0F1", font=("Arial"10)
        )

# 管道连接(简单直线就够用)
self.canvas.create_line(
        tank_x + tank_width, tank_y + tank_height - 40,
300, tank_y + tank_height - 40,
        fill="#95A5A6", width=8
    )

注意这个细节:液体矩形的底部坐标是固定的,变化的只有顶部Y坐标。这样液位上升时,视觉效果才符合物理直觉。我第一次写的时候,傻乎乎地同时改上下坐标,结果液体像个电梯,整体上下飘……


第三步:泵的旋转动画(重头戏)

这是整个项目里最带感的部分。要实现流畅的旋转效果,关键在于极坐标变换 + 定时器驱动

defdraw_pump(self):
"""绘制泵体及叶片"""
    pump_x, pump_y = 350350
    pump_radius = 40

# 泵外壳(圆形)
self.canvas.create_oval(
        pump_x - pump_radius, pump_y - pump_radius,
        pump_x + pump_radius, pump_y + pump_radius,
        fill="#E74C3C", outline="#C0392B", width=3
    )

# 叶片(三片,每片间隔120度)
self.pump_blades = []
for i inrange(3):
        blade = self.canvas.create_line(
            pump_x, pump_y,
            pump_x + pump_radius * 0.7, pump_y,
            fill="#ECF0F1", width=5, capstyle=tk.ROUND
        )
self.pump_blades.append(blade)

# 中心轴
self.canvas.create_oval(
        pump_x - 8, pump_y - 8, pump_x + 8, pump_y + 8,
        fill="#2C3E50", outline=""
    )

defrotate_pump(self):
"""泵叶片旋转逻辑"""
ifnotself.pump_running:
return

    pump_x, pump_y = 350350
    pump_radius = 40

# 角度递增(速度由流量决定)
self.pump_angle += 10 * (self.flow_rate / 50)  # 归一化转速

for i, blade inenumerate(self.pump_blades):
# 计算每片叶片的当前角度
        angle = math.radians(self.pump_angle + i * 120)

# 极坐标转直角坐标
        end_x = pump_x + pump_radius * 0.7 * math.cos(angle)
        end_y = pump_y + pump_radius * 0.7 * math.sin(angle)

# 更新叶片位置
self.canvas.coords(blade, pump_x, pump_y, end_x, end_y)

# 递归调用(20ms刷新一次 = 50FPS)
self.root.after(20self.rotate_pump)

这里有个坑after方法的时间单位是毫秒。我一开始写成20秒,结果泵转一下要等半天,还以为代码哪里死循环了……

性能优化点:如果叶片更多(比如涡轮风扇),不要每次都重新计算所有三角函数。可以预先生成角度表,用查表法替代实时计算,帧率能提升30%。


第四步:阀门的双态切换

阀门的视觉设计要让人一眼看出开关状态。我用了颜色+形状的双重提示。

defdraw_valve(self):
"""绘制阀门"""
    valve_x, valve_y = 550310

# 管道
self.canvas.create_line(
        valve_x - 50, valve_y, valve_x + 50, valve_y,
        fill="#95A5A6", width=8
    )

# 阀门本体(菱形)
self.valve_body = self.canvas.create_polygon(
        valve_x, valve_y - 30,
        valve_x + 25, valve_y,
        valve_x, valve_y + 30,
        valve_x - 25, valve_y,
        fill="#7F8C8D", outline="#2C3E50", width=2
    )

# 状态指示器
self.valve_indicator = self.canvas.create_text(
        valve_x, valve_y - 50, text="● 关闭"
        fill="#E74C3C", font=("微软雅黑"12"bold")
    )

# 绑定点击事件
self.canvas.tag_bind(self.valve_body, "<Button-1>"self.toggle_valve)

deftoggle_valve(self, event=None):
"""切换阀门状态"""
self.valve_open = notself.valve_open

ifself.valve_open:
# 开启态:绿色+文字提示
self.canvas.itemconfig(self.valve_body, fill="#27AE60")
self.canvas.itemconfig(self.valve_indicator, 
                              text="● 开启", fill="#2ECC71")
ifself.pump_running:
self.flow_rate = 45.0# 基础流量
else:
# 关闭态:灰色
self.canvas.itemconfig(self.valve_body, fill="#7F8C8D")
self.canvas.itemconfig(self.valve_indicator, 
                              text="● 关闭", fill="#E74C3C")
self.flow_rate = 0.0

交互设计心得:不要用复杂的鼠标手势。点一下切换状态,这个逻辑三岁小孩都能懂。我之前试过做"拖拽开度调节",结果测试的时候,连我自己都操作不流畅。


第五步:流量计的"真实抖动"

真实传感器的读数永远在波动——电气噪声、流体湍流、测量精度……各种因素导致数字不可能静止。所以咱得加点随机扰动

defdraw_flowmeter(self):
"""绘制流量计"""
    meter_x, meter_y = 750310

# 仪表外框
self.canvas.create_rectangle(
        meter_x - 60, meter_y - 50,
        meter_x + 60, meter_y + 50,
        fill="#2C3E50", outline="#ECF0F1", width=3
    )

# 显示屏
self.canvas.create_rectangle(
        meter_x - 50, meter_y - 30,
        meter_x + 50, meter_y + 10,
        fill="#1C1C1C", outline=""
    )

# 数字显示
self.flow_display = self.canvas.create_text(
        meter_x, meter_y - 10, text="0.00",
        fill="#00FF00", font=("Consolas"20"bold")
    )

# 单位标签
self.canvas.create_text(
        meter_x, meter_y + 30, text="m³/h",
        fill="#BDC3C7", font=("Arial"10)
    )

defupdate_flow_display(self):
"""更新流量显示"""
ifself.valve_open andself.pump_running:
# 基础流量 + 随机波动(±5%)
        noise = random.uniform(-2.52.5)
        displayed_flow = max(0self.flow_rate + noise)
else:
        displayed_flow = 0.0

# 数字跳变效果(保留2位小数)
self.canvas.itemconfig(
self.flow_display, 
        text=f"{displayed_flow:.2f}"
    )

self.root.after(100self.update_flow_display)  # 100ms刷新

为什么刷新频率比泵动画慢? 人眼对数字变化的敏感度,远低于对运动物体的敏感度。100ms刷新一次(10Hz)就够了,更快反而会导致"数字看不清"。


第六步:液位的物理模拟

最后一块拼图——让水箱液位随着流量真实变化。这里要考虑流入流出平衡

defupdate_tank_level(self):
"""更新水箱液位"""
# 流出速率(取决于泵和阀门)
ifself.pump_running andself.valve_open:
        outflow = 0.15# 每次下降0.15%
else:
        outflow = 0.0

# 流入速率(模拟补水,防止水箱干涸)
ifself.tank_level < 30:
        inflow = 0.25# 低液位时自动补水
else:
        inflow = 0.05# 正常补水速率

# 液位变化
self.tank_level += (inflow - outflow)
self.tank_level = max(5min(95self.tank_level))  # 限幅[5%, 95%]

# 更新图形
    tank_x, tank_y = 100150
    tank_height = 300
    liquid_height = tank_height * (self.tank_level / 100)

self.canvas.coords(
self.liquid_rect,
105, tank_y + tank_height - liquid_height,  # 顶部Y
215, tank_y + tank_height - 5# 底部Y
    )

# 低液位报警(液位<20%时闪烁)
ifself.tank_level < 20:
        color = "#E74C3C"ifint(self.tank_level * 10) % 2 == 0else"#C0392B"
self.canvas.itemconfig(self.liquid_rect, fill=color)
else:
self.canvas.itemconfig(self.liquid_rect, fill="#3498DB")

self.root.after(200self.update_tank_level)  # 200ms刷新

这里有个彩蛋:低液位报警的闪烁效果。通过取液位值的余数来控制颜色切换,比用额外的标志位优雅多了。


完整控制面板

最后,给这套系统配上操作按钮:

defcreate_controls(self):
"""创建控制面板"""
    control_frame = tk.Frame(self.root, bg="#2C3E50")
    control_frame.pack()

# 泵启停按钮
self.pump_btn = tk.Button(
        control_frame, text="🔄 启动水泵"
        command=self.toggle_pump,
        bg="#27AE60", fg="white", font=("微软雅黑"12"bold"),
        width=12, height=2, relief=tk.RAISED, bd=3
    )
self.pump_btn.pack(side=tk.LEFT, padx=10)

# 阀门控制按钮
    valve_btn = tk.Button(
        control_frame, text="🔧 切换阀门",
        command=self.toggle_valve,
        bg="#3498DB", fg="white", font=("微软雅黑"12"bold"),
        width=12, height=2
    )
    valve_btn.pack(side=tk.LEFT, padx=10)

# 状态栏
self.status_label = tk.Label(
self.root, text="系统就绪 | 液位: 80% | 流量: 0 m³/h",
        bg="#34495E", fg="#ECF0F1", font=("Arial"11),
        pady=10
    )
self.status_label.pack()

deftoggle_pump(self):
"""泵启停控制"""
self.pump_running = notself.pump_running

ifself.pump_running:
self.pump_btn.config(text="⏸ 停止水泵", bg="#E74C3C")
self.rotate_pump()  # 启动旋转动画
ifself.valve_open:
self.flow_rate = 45.0
else:
self.pump_btn.config(text="🔄 启动水泵", bg="#27AE60")
self.flow_rate = 0.0

🎨 完整代码汇总(可直接运行)

import tkinter as tk
import math
import random

classIndustrialProcess:
def__init__(self, root):
self.root = root
self.root.title("工业流程模拟系统 v1.0")
self.root.geometry("1000x700")
self.root.config(bg="#2C3E50")

self.canvas = tk.Canvas(root, width=1000, height=600
                                bg="#34495E", highlightthickness=0)
self.canvas.pack(pady=20)

# 核心状态
self.tank_level = 80.0
self.pump_running = False
self.valve_open = False
self.flow_rate = 0.0
self.pump_angle = 0

self.draw_all_components()
self.create_controls()
self.start_animations()

defdraw_all_components(self):
"""绘制所有组件"""
# 水箱
self.canvas.create_rectangle(100150220450
                                     outline="#ECF0F1", width=3)
self.liquid_rect = self.canvas.create_rectangle(
105445215445, fill="#3498DB", outline=""
        )

for i inrange(010120):
            y = 450 - 300 * i / 100
self.canvas.create_line(90, y, 100, y, fill="#BDC3C7", width=2)
self.canvas.create_text(75, y, text=f"{i}%", fill="#ECF0F1")

# 管道
self.canvas.create_line(220410310410, fill="#95A5A6", width=8)
self.canvas.create_line(390410500410, fill="#95A5A6", width=8)
self.canvas.create_line(600410700410, fill="#95A5A6", width=8)

# 泵
self.canvas.create_oval(310370390450
                               fill="#E74C3C", outline="#C0392B", width=3)
self.pump_blades = []
for i inrange(3):
            blade = self.canvas.create_line(
350410378410, fill="#ECF0F1", width=5
            )
self.pump_blades.append(blade)
self.canvas.create_oval(342402358418, fill="#2C3E50")

# 阀门
self.valve_body = self.canvas.create_polygon(
550380575410550440525410,
            fill="#7F8C8D", outline="#2C3E50", width=2
        )
self.valve_indicator = self.canvas.create_text(
550360, text="● 关闭", fill="#E74C3C"
            font=("微软雅黑"12"bold")
        )
self.canvas.tag_bind(self.valve_body, "<Button-1>"self.toggle_valve)

# 流量计
self.canvas.create_rectangle(700360820460
                                     fill="#2C3E50", outline="#ECF0F1", width=3)
self.canvas.create_rectangle(710380810420, fill="#1C1C1C")
self.flow_display = self.canvas.create_text(
760400, text="0.00", fill="#00FF00"
            font=("Consolas"20"bold")
        )
self.canvas.create_text(760440, text="m³/h"
                               fill="#BDC3C7", font=("Arial"10))

defcreate_controls(self):
"""控制面板"""
        frame = tk.Frame(self.root, bg="#2C3E50")
        frame.pack()

self.pump_btn = tk.Button(
            frame, text="🔄 启动水泵", command=self.toggle_pump,
            bg="#27AE60", fg="white", font=("微软雅黑"12"bold"),
            width=12, height=2
        )
self.pump_btn.pack(side=tk.LEFT, padx=10)

        valve_btn = tk.Button(
            frame, text="🔧 切换阀门", command=self.toggle_valve,
            bg="#3498DB", fg="white", font=("微软雅黑"12"bold"),
            width=12, height=2
        )
        valve_btn.pack(side=tk.LEFT, padx=10)

self.status_label = tk.Label(
self.root, text="系统就绪", bg="#34495E"
            fg="#ECF0F1", font=("Arial"11), pady=10
        )
self.status_label.pack()

deftoggle_pump(self):
"""泵控制"""
self.pump_running = notself.pump_running
ifself.pump_running:
self.pump_btn.config(text="⏸ 停止水泵", bg="#E74C3C")
ifself.valve_open:
self.flow_rate = 45.0
else:
self.pump_btn.config(text="🔄 启动水泵", bg="#27AE60")
self.flow_rate = 0.0

deftoggle_valve(self, event=None):
"""阀门控制"""
self.valve_open = notself.valve_open
ifself.valve_open:
self.canvas.itemconfig(self.valve_body, fill="#27AE60")
self.canvas.itemconfig(self.valve_indicator, 
                                  text="● 开启", fill="#2ECC71")
ifself.pump_running:
self.flow_rate = 45.0
else:
self.canvas.itemconfig(self.valve_body, fill="#7F8C8D")
self.canvas.itemconfig(self.valve_indicator, 
                                  text="● 关闭", fill="#E74C3C")
self.flow_rate = 0.0

defstart_animations(self):
"""启动所有动画"""
self.rotate_pump()
self.update_tank()
self.update_flow()

defrotate_pump(self):
"""泵旋转"""
ifself.pump_running:
self.pump_angle += 10
for i, blade inenumerate(self.pump_blades):
                angle = math.radians(self.pump_angle + i * 120)
                x = 350 + 28 * math.cos(angle)
                y = 410 + 28 * math.sin(angle)
self.canvas.coords(blade, 350410, x, y)
self.root.after(20self.rotate_pump)

defupdate_tank(self):
"""液位更新"""
ifself.pump_running andself.valve_open:
self.tank_level -= 0.15
ifself.tank_level < 30:
self.tank_level += 0.25
else:
self.tank_level += 0.05

self.tank_level = max(5min(95self.tank_level))

        liquid_height = 300 * (self.tank_level / 100)
self.canvas.coords(self.liquid_rect, 105450 - liquid_height, 215445)

ifself.tank_level < 20:
            color = "#E74C3C"ifint(self.tank_level * 10) % 2else"#C0392B"
self.canvas.itemconfig(self.liquid_rect, fill=color)
else:
self.canvas.itemconfig(self.liquid_rect, fill="#3498DB")

self.root.after(200self.update_tank)

defupdate_flow(self):
"""流量显示更新"""
ifself.valve_open andself.pump_running:
            noise = random.uniform(-2.52.5)
            display = max(0self.flow_rate + noise)
else:
            display = 0.0

self.canvas.itemconfig(self.flow_display, text=f"{display:.2f}")

        status_text = (f"液位: {self.tank_level:.1f}% | "
f"泵: {'运行'if self.pump_running else'停止'} | "
f"阀门: {'开启'if self.valve_open else'关闭'} | "
f"流量: {display:.2f} m³/h")
self.status_label.config(text=status_text)

self.root.after(100self.update_flow)

if __name__ == "__main__":
    root = tk.Tk()
    app = IndustrialProcess(root)
    root.mainloop()

运行效果:把代码复制到.py文件,双击运行。你会看到一个深色主题的界面,水箱里的蓝色液体在缓慢变化,点击"启动水泵"后,红色泵开始旋转,再点"切换阀门",流量计的绿色数字开始跳动。


🔥 进阶优化方向(我踩过的坑)

1️⃣ 性能优化:减少重绘次数

如果你打算加更多组件,会发现界面开始卡顿。原因是canvas.coords()��然轻量,但频繁调用还是有开销。

解决方案:把不变的元素画到PhotoImage上,只更新动态部分。我在另一个项目里用这招,组件数从50个增加到200个,帧率依然稳定在30FPS。

2️⃣ 真实物理:加入PID控制

现在的流量是固定值。想更逼真?可以加个PID算法,让流量根据液位自动调节。比如液位低于50%时,自动降低泵速。

# 简易PID伪代码
error = target_level - current_level
self.flow_rate = Kp * error + Ki * integral + Kd * derivative

这块内容比较硬核,如果感兴趣,咱们下次单开一篇讲。

3️⃣ 数据记录:接入SQLite

客户后来提了个需求:"能不能把每小时的流量存下来?"这时候就得上数据库了。好在Python的sqlite3是内置的,几行代码就能搞定:

import sqlite3

conn = sqlite3.connect('process_data.db')
cursor = conn.cursor()
cursor.execute('''
    CREATE TABLE IF NOT EXISTS flow_records (
        timestamp TEXT,
        flow_rate REAL,
        tank_level REAL
    )
'''
)

每隔一段时间,把数据插进去,后期导出Excel分析也方便。


💬 几个常见问题答疑

Q1: 为啥不用PyQt5?它不是更强大吗?
强大归强大,但学习曲线陡峭。Tkinter的API设计很直白,半天就能上手。而且PyQt5打包后的exe至少30MB起步,Tkinter只要几兆。

Q2: 动画卡顿怎么办?
检查after的时间间隔。如果设置成1ms,反而会因为来不及执行导致队列堆积。一般20-50ms是最佳区间。

Q3: 能接入真实传感器吗?
当然!用pyserial读串口数据,或者通过Modbus协议连PLC。只需把模拟的随机数,替换成真实读数就行。


🎯 三点核心总结

  1. 1. 先静后动:别急着写动画,先把静态图形的坐标对齐了。
  2. 2. 状态集中:所有变量放在类属性里,方便跨函数访问和调试。
  3. 3. 刷新分层:快速运动的用20ms刷新,慢速的可以200ms,减少计算负担。

📚 如果你想继续深挖……

这套系统可以扩展的方向还有很多:

  • • 报警系统:液位异常时弹窗+发邮件
  • • 历史曲线:用matplotlib嵌入实时趋势图
  • • 远程监控:Flask+WebSocket做个网页版
  • • 3D效果:试试VPython(虽然有点杀鸡用牛刀)

最近我在琢磨把这套东西移植到树莓派上,配个7寸触摸屏,直接挂在车间墙上当监控大屏。成本不到五百块,比买现成的监控设备划算太多了。

最后抛个问题:如果让你设计一个"锅炉+汽轮机+发电机"的动态系统,你会怎么处理蒸汽的流动效果?欢迎留言讨论!


标签#Python#Tkinter#工业自动化#可视化#动画编程

(收藏本文,下次遇到演示需求时,直接复制代码改改参数就能用!分享给同样在工控领域摸爬滚打的朋友们吧~)

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-28 14:26:27 HTTP/2.0 GET : https://f.mffb.com.cn/a/476211.html
  2. 运行时间 : 0.208736s [ 吞吐率:4.79req/s ] 内存消耗:4,662.55kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=543e1fe96fd859026ce7bd105e181556
  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.000877s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.002118s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000760s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000692s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001463s ]
  6. SELECT * FROM `set` [ RunTime:0.000507s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001621s ]
  8. SELECT * FROM `article` WHERE `id` = 476211 LIMIT 1 [ RunTime:0.001330s ]
  9. UPDATE `article` SET `lasttime` = 1772259987 WHERE `id` = 476211 [ RunTime:0.005705s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000633s ]
  11. SELECT * FROM `article` WHERE `id` < 476211 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001237s ]
  12. SELECT * FROM `article` WHERE `id` > 476211 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001104s ]
  13. SELECT * FROM `article` WHERE `id` < 476211 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.002130s ]
  14. SELECT * FROM `article` WHERE `id` < 476211 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.021682s ]
  15. SELECT * FROM `article` WHERE `id` < 476211 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.015767s ]
0.212572s