You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Taipy+Postgres应用无法刷新数据:自动/手动刷新方案求助

问题描述

我的应用根目录为data_visulization,目录结构如下:

data_visulization/
├── main.py
├── data/
│   └── get_data.py
└── pages/
    ├── __init__.py
    ├── root.py
    ├── Analysis/
    │   └── analysis.py
    └── Overview/
        └── overview.py

main.py负责加载所有页面,root.py用于展示KPI头部模块,所有页面的数据均通过get_data.py从PostgreSQL数据库获取。当前应用无法刷新数据,始终显示旧会话缓存内容,尝试过自动刷新线程和手动刷新按钮的实现但均无效,需要实现每5分钟自动刷新和root.py头部"Refresh Now"按钮手动刷新数据库数据的功能。

问题根源
  1. 页面直接引用全局变量filtered_df,Taipy无法追踪全局变量的变化,导致UI无法同步更新
  2. 手动刷新按钮调用update_data时未传递state参数,无法触发Taipy的UI刷新机制
  3. 自动刷新线程中直接更新state,未确保操作在Taipy的UI线程中执行,可能导致更新失效
修改后的代码实现

1. data/get_data.py

# data/get_data.py
import psycopg2
import pandas as pd
from datetime import datetime, timedelta

DB_HOST = "localhost"
DB_PORT = "5432"
DB_NAME = "test"
DB_USER = "pg_db"
DB_PASS = "Admin"

def fetch_data():
    conn = psycopg2.connect(
        host=DB_HOST,
        port=DB_PORT,
        dbname=DB_NAME,
        user=DB_USER,
        password=DB_PASS
    )
    query = "SELECT * FROM prod_db"
    data = pd.read_sql(query, conn)
    data['date'] = pd.to_datetime(data['date'])
    data.columns = ['Date', 'Location', 'Tower Name', 'Zone', 'Stage Label', 'Class Stage Label']
    # 获取昨天日期
    yesterday = (datetime.now() - timedelta(days=1)).date()

    # 筛选昨天的数据
    filtered_df = data[data['Date'].dt.date == yesterday]
    filtered_df = filtered_df.sort_values(by='Class Stage Label', ascending=False)
    conn.close()
    return data, filtered_df 

def update_data(state):
    # 直接更新state中的变量,不再依赖全局变量
    state.data, state.filtered_df = fetch_data()
    # 强制刷新所有页面绑定的变量
    state.refresh("data")
    state.refresh("filtered_df")

2. main.py

from taipy.gui import Gui
import threading
import time
from data.get_data import update_data
from pages.root import root_page
from pages.Analysis.analysis import analysis_page
from pages.Overview.overview import overview_page

# 自动刷新循环
def auto_refresh(state):
    while True:
        time.sleep(300)  # 每5分钟刷新一次
        # 确保在Taipy UI线程中执行更新操作
        state.run_in_ui_thread(lambda: update_data(state))

# 初始化时加载数据并启动自动刷新
def start_auto_refresh(state):
    update_data(state)  # 加载初始数据
    threading.Thread(target=auto_refresh, args=(state,), daemon=True).start()

pages = {
    "/": root_page,
    "Analysis": analysis_page,
    "Overview": overview_page
}

Gui(pages=pages).run(on_init=start_auto_refresh)

3. pages/root.py

import taipy.gui.builder as tgb
from data.get_data import update_data

with tgb.Page() as root_page:
    tgb.text('## Performance Insights', mode='md')
    # 按钮点击时传递state参数,触发UI刷新
    tgb.button('Refresh Now', on_action=lambda state: update_data(state))
    with tgb.layout("1 1 1 1 1 1"):
        with tgb.part():
            tgb.text('### 日期', mode='md')
            tgb.text("#### {','.join(filtered_df['Date'].dt.strftime('%Y-%m-%d').unique())}", mode='md')
        
        with tgb.part():
            tgb.text('### 总数', mode='md')
            tgb.text("#### {int(filtered_df['Class Stage Label'].count())}", mode='md')

        with tgb.part():
            tgb.text('### 正常阶段', mode='md')
            tgb.text("#### {int(filtered_df[filtered_df['Class Stage Label']=='Normal'].shape[0])}", mode='md')

        with tgb.part():
            tgb.text('### 第一阶段', mode='md')
            tgb.text("#### {int(filtered_df[filtered_df['Class Stage Label']=='Stage1'].shape[0])}", mode='md')
            
        with tgb.part():
            tgb.text('### 第二阶段', mode='md')
            tgb.text("#### {int(filtered_df[filtered_df['Class Stage Label']=='Stage2'].shape[0])}", class_name="lblink", mode='md')
            
        with tgb.part():
           tgb.text('### 第三阶段', mode='md')
           tgb.text("#### {int(filtered_df[filtered_df['Class Stage Label']=='Stage3'].shape[0])}", class_name="blink", mode='md')
        
    tgb.navbar()

    with tgb.expandable(title='数据', expanded=False):
        tgb.table("{filtered_df}")
关键修改说明
  1. 移除全局变量依赖:删除get_data.py中的全局data和filtered_df,直接通过state传递数据,让Taipy能够追踪变量变化并同步更新UI
  2. 手动刷新传递state:root.py中的按钮使用lambda函数传递state给update_data,确保触发Taipy的UI刷新机制
  3. 强制刷新变量:在update_data中调用state.refresh()强制更新所有页面绑定的变量,保证数据同步
  4. UI线程安全更新:自动刷新线程中使用state.run_in_ui_thread(),确保更新操作在Taipy的UI线程中执行,避免线程冲突
  5. 修正页面导入路径:main.py中修正页面导入路径,确保从正确的模块位置加载页面组件

内容的提问来源于stack exchange,提问作者user3219244

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:25:08