So erfassen Sie das aktualisierte Layout korrekt von einem Streamlit-Elements Dashboard.grid im Sitzungszustand

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: So erfassen Sie das aktualisierte Layout korrekt von einem Streamlit-Elements Dashboard.grid im Sitzungszustand

by Anonymous » 08 Aug 2025, 02:41

Ich entwickle ein Finanz-Dashboard mit Streamlit und der Streamlit-Elements-Bibliothek. Mein Ziel ist es, ein benutzerorientierbares Dashboard zu erstellen, in dem Benutzer Karten anziehen und die Größenänderung ziehen können. Das endgültige Layout (die Positionen und Größen aller Karten) sollte in einer Supabase -Datenbank (PostgreSQL) gespeichert werden, damit sie beim nächsten Mal wiederhergestellt werden kann. Ich kann das modifizierte Layout jedoch nicht korrekt erfassen. Rückruf: Mein erster Ansatz war es, den Onchange -Parameter des Dashboards zu verwenden. Das Debugging zeigte, dass der Skript-Wiederholungsverfahren der Schaltfläche aufgrund einer Rennbedingung vor dem Onchange-Rückruf über den Sitzungszustand verarbeitet wird. Daher wird das alte Layout immer erfasst. Dies konnte das aktualisierte Layout in der Sitzungszustandsvariablen auch nicht erfassen. Entscheidend ist, dass ich ein separates Testskript erstellt habe, das ein hartcodiertes JSON -Objekt erfolgreich in der Spalte SARED_LAYOUTS -Spalte schreibt. Dies beweist, dass das Problem nicht mit der Datenbankverbindung oder Berechtigungen besteht, sondern mit der Erfassung des Status aus dem Dashboard.Grid -Komponente innerhalb der Haupt -App. Dies konnte auch nicht die Änderungen erfassen, als die Save -Taste gedrückt wurde. Robuste Möglichkeit, das neueste Layout (mit den Änderungen des Benutzers) aus dem Dashboard zu erfassen. Grid und in einer Sitzungszustandsvariable verfügbar ist, wird die Schaltfläche "Einstellungen Speichern" verfügbar? render_cds_table_card (supabase, filters1, filter2): zurück "karteninhalte" zurückgeben. Das Kernproblem liegt in der Dash.Py -Struktur selbst. < /P>

Code: Select all

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()

Top