Я разрабатываю финансовую панель, используя Streamlit и библиотеку Streamlit-Elements. Моя цель-создать пользовательскую панель панели, где пользователи могут перетаскивать карты и изменять размер. Окончательный макет (позиции и размеры всех карт) следует сохранить в базе данных Supabase (PostgreSQL), чтобы его можно было восстановить в следующий раз, когда пользователь входит в систему. Тем не менее, я не могу правильно захватить модифицированный макет. /> OnChange Callback: Мой начальный подход состоял в том, чтобы использовать параметр OnChange приборной панели. Отладка показала, что из-за условия гонки повторное перезагрузка сценария кнопки обрабатывается до обновления обратного вызова онкола, поэтому старый макет всегда снимается. Это также не смогло захватить обновленную макет в переменной состояния сеанса. Важно отметить, что я создал отдельный тестовый скрипт, который успешно записывает жестко -кодированный объект JSON в тот же столбец Saveed_layouts. Это доказывает, что проблема не связана с подключением к базе данных или разрешениям, а строго с захватом состояния из панели Dashboard.grid в основном приложении. Это также не удалось укомплектовать изменения, когда нажата кнопка «Сохранить». надежный способ захватить последний макет (с изменениями пользователя) с приборной панели. render_cds_table_card (supabase, filters1, filters2): return «Содержание карты». Основная проблема заключается в самой структуре dash.py. < /P>
Python
# Dash.py
import streamlit as st
import streamlit.components.v1 as components
import datetime
import time
from supabase import create_client, Client
from gotrue.errors import AuthApiError
from streamlit_autorefresh import st_autorefresh
from streamlit_elements import elements, dashboard, mui, html
import copy
# Assume these modules exist and provide the necessary variables and functions
from cds_card import render_cds_table_card, CDS_TERMS
from commodities_card import render_commodities_table_card, COMMODITY_NAMES
# ... import other card modules ...
# --- Global Constants ---
CDS_COUNTRIES = ['BR', 'US', 'DE', 'CH', 'JP', 'CN']
# ... other constants ...
# --- Page Config ---
st.set_page_config(page_title="Dashboard Financeiro", layout="wide", initial_sidebar_state="collapsed")
# --- CSS ---
st.markdown("""
/* ... (CSS styles from your file) ... */
""", unsafe_allow_html=True)
# --- Application Functions ---
@st.cache_resource
def init_supabase_client():
"""Initializes and caches the Supabase client."""
try:
return create_client(st.secrets["supabase_url"], st.secrets["supabase_key"])
except Exception as e:
st.error(f"Failed to connect to Supabase: {e}")
return None
def initialize_session():
"""Initializes session state variables if they don't exist."""
if 'auth_user' not in st.session_state: st.session_state.auth_user = None
if 'active_desktop' not in st.session_state: st.session_state.active_desktop = "Desktop 1"
if 'user_filters' not in st.session_state: st.session_state.user_filters = {}
if 'filters_loaded' not in st.session_state: st.session_state.filters_loaded = False
if 'saved_layouts' not in st.session_state: st.session_state.saved_layouts = {}
if 'working_layout' not in st.session_state: st.session_state.working_layout = {}
def handle_layout_change(new_layout):
"""Callback that is supposed to update the working layout."""
desktop_key = st.session_state.active_desktop
st.session_state.working_layout[desktop_key] = new_layout
def show_login_screen(supabase: Client):
"""Renders the login screen."""
# ... (login logic) ...
def show_dashboard(supabase: Client):
"""Renders the main dashboard."""
if not st.session_state.auth_user or not hasattr(st.session_state.auth_user, 'user'):
st.session_state.clear(); st.rerun(); return
user_info = st.session_state.auth_user.user
DEFAULT_LAYOUT = [
{'i': 'cds_card', 'x': 0, 'y': 0, 'w': 24, 'h': 32},
# ... (all other default card positions) ...
{'i': 'bolsas_card', 'x': 72, 'y': 32, 'w': 24, 'h': 32},
]
if not st.session_state.filters_loaded:
try:
profile_response = supabase.table("profiles").select("saved_filters, saved_layouts").eq("id", user_info.id).maybe_single().execute()
st.session_state.user_filters = profile_response.data.get('saved_filters', {}) if profile_response.data else {}
saved_layouts_from_db = profile_response.data.get('saved_layouts') if profile_response.data else None
if saved_layouts_from_db:
st.session_state.saved_layouts = saved_layouts_from_db
else:
st.session_state.saved_layouts = {"Desktop 1": DEFAULT_LAYOUT}
st.session_state.working_layout = copy.deepcopy(st.session_state.saved_layouts)
st.session_state.filters_loaded = True
except Exception as e:
st.warning(f"Could not load preferences: {e}")
st.session_state.user_filters = {}
st.session_state.saved_layouts = {"Desktop 1": DEFAULT_LAYOUT}
st.session_state.working_layout = copy.deepcopy(st.session_state.saved_layouts)
st.session_state.filters_loaded = True
with st.sidebar:
# ... (sidebar code with filters) ...
if st.button("Save Preferences"):
# DEBUGGING SHOWS that st.session_state.working_layout has the OLD layout here
st.write("Layout that would be saved:", st.session_state.working_layout)
try:
# This line saves the OLD layout, not the new one
supabase.table("profiles").update({ "saved_layouts": st.session_state.working_layout }).eq("id", user_info.id).execute()
# ... (rest of saving logic) ...
st.success("Preferences saved!")
except Exception as e:
st.error(f"Error saving preferences: {e}")
# ... (Header HTML code) ...
with elements(f"dashboard_elements_{st.session_state.active_desktop}"):
desktop_key = st.session_state.active_desktop
if desktop_key not in st.session_state.working_layout:
st.session_state.working_layout[desktop_key] = copy.deepcopy(st.session_state.saved_layouts.get(desktop_key, DEFAULT_LAYOUT))
layout_to_display = st.session_state.working_layout[desktop_key]
with dashboard.Grid(
layout_to_display,
draggableHandle=".draggable-handle",
rowHeight=10,
cols={"lg": 96, "md": 96, "sm": 48, "xs": 24, "xxs": 12},
onChange=handle_layout_change
):
# ... (Code for all 8 mui.Paper cards) ...
def main():
initialize_session()
supabase = init_supabase_client()
if not supabase: return
if not st.session_state.auth_user: show_login_screen(supabase)
else: show_dashboard(supabase)
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/797 ... -dashboard
Как правильно захватить обновленный макет с панели панели потоков. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение