Spaces:
Sleeping
Sleeping
import streamlit as st | |
from streamlit.components.v1 import html | |
from streamlit_cookies_controller import CookieController | |
st.set_page_config('Cookie QuickStart', 'πͺ', layout='wide') | |
controller = CookieController() | |
# Set a cookie | |
controller.set('cookie_name', 'testing') | |
# Get all cookies | |
cookies = controller.getAll() | |
# Get a cookie | |
cookie = controller.get('cookie_name') | |
# Remove a cookie | |
controller.remove('cookie_name') | |
# Debugging Headers and Cookies | |
st.write("Headers:", st.context.headers) | |
st.write("Cookies:", st.context.cookies) | |
# Define JavaScript code | |
javascript_code = """ | |
<script> | |
// Function to return a string | |
function myJavaScriptFunction() { | |
return "Hello from JavaScript!"; | |
} | |
// Function to call and send data back to Python | |
function callAndCapture() { | |
const result = myJavaScriptFunction(); | |
// Send the result back to Streamlit | |
window.parent.postMessage({ isStreamlitMessage: true, type: 'streamlit:js_return', data: result }, '*'); | |
} | |
// Add an event listener to listen for messages from Streamlit | |
window.addEventListener('message', function(event) { | |
if (event.data && event.data.type === 'streamlit:buttonClick') { | |
callAndCapture(); | |
} | |
}); | |
</script> | |
<button onclick="callAndCapture()">Run JavaScript Function</button> | |
""" | |
# Embed JavaScript into Streamlit app | |
html(javascript_code, height=300) | |
# Placeholder to display results | |
result_placeholder = st.empty() | |
# Add Streamlit button to trigger JavaScript function | |
if st.button("Call JavaScript Function"): | |
st.write("Waiting for JavaScript response...") | |
trigger_js = """ | |
<script> | |
// Trigger the JavaScript function via a postMessage event | |
window.parent.postMessage({ type: 'streamlit:buttonClick' }, '*'); | |
</script> | |
""" | |
html(trigger_js, height=0) | |
# Add a listener for JavaScript responses | |
st.markdown( | |
""" | |
<script> | |
// Listen for messages from JavaScript | |
window.addEventListener('message', (event) => { | |
if (event.data && event.data.type === 'streamlit:js_return') { | |
// Pass the data back to Streamlit as a new message | |
const result = event.data.data; | |
document.dispatchEvent(new CustomEvent('StreamlitResult', { detail: result })); | |
} | |
}); | |
// Dispatch data from CustomEvent to Streamlit | |
document.addEventListener('StreamlitResult', (e) => { | |
const data = e.detail; | |
window.parent.postMessage({ type: 'streamlit:result', data: data }, '*'); | |
}); | |
</script> | |
""", | |
unsafe_allow_html=True, | |
) | |
# Use an iframe for communication | |
if "js_result" not in st.session_state: | |
st.session_state["js_result"] = "" | |
try: | |
# Listen for result data from JavaScript | |
received_result = html( | |
""" | |
<script> | |
window.addEventListener('message', (event) => { | |
if (event.data && event.data.type === 'streamlit:result') { | |
const data = event.data.data; | |
// Send the result back to Streamlit | |
document.dispatchEvent(new CustomEvent('PythonReceivedResult', { detail: data })); | |
} | |
}); | |
document.addEventListener('PythonReceivedResult', (e) => { | |
const received = e.detail; | |
document.getElementById('result-placeholder').innerText = received; | |
}); | |
</script> | |
<div id="result-placeholder"></div> | |
""", | |
height=0, | |
) | |
# If there's a new result, update it in session state | |
if received_result and received_result != st.session_state["js_result"]: | |
st.session_state["js_result"] = received_result | |
result_placeholder.write(f"Result from JavaScript: {received_result}") | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |