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

Taipy创建项目后下拉列表与项目总数不更新的解决问询

问题描述

我项目里采用多层页面文件夹结构,包含overview、create等页面模块。在overview.md中设置了文本Total projects : <|{total_projects}|>;在create.md里实现了创建项目功能,还有一个展示所有可用项目的下拉选择器。当前遇到的问题是:创建项目后,下拉列表的选项不会更新,同时overview.md中的项目总数也保持不变。

我尝试在点击创建按钮时通过state更新,但下拉列表仍未变化,请问如何在切换页面或刷新页面元素时更新变量值?


相关代码

home.py

from taipy.gui import Gui
import taipy as tp

from user_interface.taipy.pages.create.create import create_md
from user_interface.taipy.pages.overview.overview import overview_md
from user_interface.taipy.pages.upload.upload import upload_md
from user_interface.taipy.pages.root import root

pages = {
    '/':root,
    "Overview":overview_md,
    "create":create_md,
    "Upload":upload_md,
}

gui_multi_pages = Gui(pages=pages)

if __name__ == '__main__':
    tp.Core().run()
    
    gui_multi_pages.run(title="Dataforge",dark_mode=False)

overview.md

## Quick overview 

Total projects  : <|{total_projects}|>

overview.py

def get_no_collections():
    error,collections = shepard_client.get_all_collections()
    print("checked total_projects")
    if collections is not None:
        for collection in collections:
            #print(f"ID: {collection.id}, Name: {collection.name}")
            collections_list.append((collection.id, collection.name))
        return len(collections_list)
    else:
        print("Failed to fetch collections.")
        return "Error getting collections"
    
total_projects= get_no_collections()

create.md

<|{selected_projects}|selector|lov={available_projects}|type=Collection|adapter={lambda c: (str(c.id), c.name)}|label=Select Project|on_change=update_plist|dropdown|>

create.py

class Collection:
    def __init__(self, id, name):
        self.id = id
        self.name = name
error,collection = shepard_client.get_all_collections()
available_projects = [Collection(data.id, data.name) for data in collection]

尝试的更新函数

def update_plist(state) -> None:
    """
    Function to update the list of available projects.
    """
    try:
        error, u_collections = shepard_client.get_all_collections()
        if not error:
            # Update the state with the new list of collections
            state.available_projects = [Collection(data['id'], data['name']) for data in u_collections]
        else:
            print("Error fetching collections:", error)
    except Exception as e:
        print("Exception in update_plist:", e)

解决方法

1. 统一全局状态变量

Taipy中跨页面的变量需要通过全局状态共享,你当前的total_projects和available_projects是在各自模块初始化时赋值的,仅启动时执行一次,后续不会自动同步。需要将这些变量移到home.py中作为全局变量:

from taipy.gui import Gui
import taipy as tp
from user_interface.taipy.pages.create.create import create_md, Collection, update_plist
from user_interface.taipy.pages.overview.overview import get_no_collections
from user_interface.taipy.pages.upload.upload import upload_md
from user_interface.taipy.pages.root import root
import shepard_client

# 全局状态变量,所有页面共享
total_projects = get_no_collections()
error, collection = shepard_client.get_all_collections()
available_projects = [Collection(data.id, data.name) for data in collection]

pages = {
    '/':root,
    "Overview":overview_md,
    "create":create_md,
    "Upload":upload_md,
}

gui_multi_pages = Gui(pages=pages)

if __name__ == '__main__':
    tp.Core().run()
    gui_multi_pages.run(title="Dataforge",dark_mode=False)

同时删除overview.py中的total_projects= get_no_collections(),以及create.py中的available_projects初始化代码,避免重复定义。

2. 修复更新函数的对象访问错误

你的update_plist中误用了字典索引data['id'],但shepard_client返回的是对象,应该用.访问属性,同时补充更新项目总数:

def update_plist(state) -> None:
    try:
        error, u_collections = shepard_client.get_all_collections()
        if not error:
            state.available_projects = [Collection(data.id, data.name) for data in u_collections]
            state.total_projects = len(u_collections)  # 同步更新总数
        else:
            print("Error fetching collections:", error)
    except Exception as e:
        print("Exception in update_plist:", e)

3. 页面切换时自动刷新

给页面添加on_action回调,切换页面时自动拉取最新数据:

def refresh_overview(state):
    state.total_projects = get_no_collections()

def refresh_create(state):
    error, u_collections = shepard_client.get_all_collections()
    if not error:
        state.available_projects = [Collection(data.id, data.name) for data in u_collections]

pages = {
    '/':root,
    "Overview":(overview_md, {"on_action": refresh_overview}),
    "create":(create_md, {"on_action": refresh_create}),
    "Upload":upload_md,
}

4. 创建项目后立即触发更新

在创建项目的函数中,完成创建逻辑后直接调用更新函数:

def create_project(state):
    # 此处编写你的项目创建逻辑
    # ... 创建完成后 ...
    update_plist(state)  # 立即刷新下拉列表和总数

内容的提问来源于stack exchange,提问作者Aravind R K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:55:59