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>
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()
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 [url=viewtopic.php?t=26065]Problem[/url] 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]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 ...
# --- 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_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
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}
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))
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)
Ich versuche, einen Telegramm -Workflow mit Telethon in Python zu automatisieren. Ich interagiere mit einem Drittanbieter-Telegrammbot als normales Benutzerkonto. Der Bot verfügt über Inline...
Ich habe Probleme, meine Streamlit-App zu verwenden, da ein Problem mit dem Paket Streamlit-Card ist. Dies ist die Fehlermeldung, die ich sehe:
2023-12-04 11:07:31.911 ComponentRequestHandler: GET...
Ich arbeite in einem Shop für meine App und habe versucht, eine Gitterlayoutgruppe für die Artikel zu verwenden. Mein Problem ist, dass die Zellen im Gitter ihre Größe nicht dynamisch ändern, so dass...
Ich arbeite in einem Shop für meine App und habe versucht, eine Gitterlayoutgruppe für die Artikel zu verwenden. Mein Problem ist, dass die Zellen im Gitter ihre Größe nicht dynamisch ändern, so dass...
Ich versuche, Grenzen zwischen den einzelnen Spalten in einem Gitterlayout in CSS hinzuzufügen. In meiner Wrapper Div enthalten die Divs, die ich habe, jedoch nicht den gleichen Inhalt. Wenn ich also...