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
相关产品推荐
相关产品推荐

