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"按钮手动刷新数据库数据的功能。
问题根源
- 页面直接引用全局变量
filtered_df,Taipy无法追踪全局变量的变化,导致UI无法同步更新 - 手动刷新按钮调用
update_data时未传递state参数,无法触发Taipy的UI刷新机制 - 自动刷新线程中直接更新
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}")
关键修改说明
- 移除全局变量依赖:删除
get_data.py中的全局data和filtered_df,直接通过state传递数据,让Taipy能够追踪变量变化并同步更新UI - 手动刷新传递state:root.py中的按钮使用lambda函数传递
state给update_data,确保触发Taipy的UI刷新机制 - 强制刷新变量:在
update_data中调用state.refresh()强制更新所有页面绑定的变量,保证数据同步 - UI线程安全更新:自动刷新线程中使用
state.run_in_ui_thread(),确保更新操作在Taipy的UI线程中执行,避免线程冲突 - 修正页面导入路径:main.py中修正页面导入路径,确保从正确的模块位置加载页面组件
内容的提问来源于stack exchange,提问作者user3219244
相关产品推荐
相关产品推荐

