Spaces:
Sleeping
Sleeping
import streamlit as st | |
import gradio as gr | |
import importlib.util | |
import sys | |
import tempfile | |
import os | |
from pathlib import Path | |
import inspect | |
import types | |
import shutil | |
import uuid | |
# Configure the Streamlit page | |
st.set_page_config( | |
page_title="Gradio Examples Hub", | |
page_icon="🧩", | |
layout="wide" | |
) | |
# Directory structure | |
EXAMPLES_DIR = Path("gradio_examples") | |
EXAMPLES_DIR.mkdir(exist_ok=True) | |
# Make sure we have a __init__.py file in the examples directory | |
init_file = EXAMPLES_DIR / "__init__.py" | |
if not init_file.exists(): | |
init_file.touch() | |
# Ensure the examples directory is in the Python path | |
if str(EXAMPLES_DIR.absolute()) not in sys.path: | |
sys.path.insert(0, str(EXAMPLES_DIR.absolute())) | |
# Create session state for tracking the current app | |
if 'current_app' not in st.session_state: | |
st.session_state.current_app = None | |
st.session_state.current_app_module = None | |
st.session_state.app_interface = None | |
# Example Gradio apps as Python code | |
EXAMPLES = { | |
"hello_world": """ | |
import gradio as gr | |
def greet(name): | |
return f"Hello, {name}!" | |
demo = gr.Interface( | |
fn=greet, | |
inputs=gr.Textbox(label="Your Name", placeholder="Enter your name"), | |
outputs=gr.Textbox(label="Greeting"), | |
title="Hello World App", | |
description="A simple app that greets you by name", | |
examples=[["World"], ["Gradio"], ["Streamlit"]] | |
) | |
""", | |
"calculator": """ | |
import gradio as gr | |
import numpy as np | |
def calculate(num1, num2, operation): | |
if operation == "Add": | |
return num1 + num2 | |
elif operation == "Subtract": | |
return num1 - num2 | |
elif operation == "Multiply": | |
return num1 * num2 | |
elif operation == "Divide": | |
if num2 == 0: | |
return "Error: Division by zero" | |
return num1 / num2 | |
demo = gr.Interface( | |
fn=calculate, | |
inputs=[ | |
gr.Number(label="First Number"), | |
gr.Number(label="Second Number"), | |
gr.Radio(["Add", "Subtract", "Multiply", "Divide"], label="Operation") | |
], | |
outputs=gr.Textbox(label="Result"), | |
title="Simple Calculator", | |
description="Perform basic arithmetic operations", | |
examples=[ | |
[5, 3, "Add"], | |
[10, 4, "Subtract"], | |
[6, 7, "Multiply"], | |
[20, 4, "Divide"] | |
] | |
) | |
""", | |
"image_filter": """ | |
import gradio as gr | |
import numpy as np | |
from PIL import Image | |
def apply_filter(image, filter_type): | |
if image is None: | |
return None | |
img_array = np.array(image) | |
if filter_type == "Grayscale": | |
result = np.mean(img_array, axis=2).astype(np.uint8) | |
return Image.fromarray(result) | |
elif filter_type == "Invert": | |
result = 255 - img_array | |
return Image.fromarray(result) | |
elif filter_type == "Sepia": | |
sepia = np.array([[0.393, 0.769, 0.189], | |
[0.349, 0.686, 0.168], | |
[0.272, 0.534, 0.131]]) | |
sepia_img = img_array.dot(sepia.T) | |
sepia_img[sepia_img > 255] = 255 | |
return Image.fromarray(sepia_img.astype(np.uint8)) | |
return image | |
demo = gr.Interface( | |
fn=apply_filter, | |
inputs=[ | |
gr.Image(type="pil"), | |
gr.Radio(["Grayscale", "Invert", "Sepia"], label="Filter") | |
], | |
outputs=gr.Image(type="pil"), | |
title="Image Filter App", | |
description="Apply various filters to your images" | |
) | |
""", | |
"text_analysis": """ | |
import gradio as gr | |
def analyze_text(text): | |
if not text: | |
return "Please enter some text" | |
char_count = len(text) | |
word_count = len(text.split()) | |
line_count = len(text.splitlines()) | |
return f"Characters: {char_count}\\nWords: {word_count}\\nLines: {line_count}" | |
demo = gr.Interface( | |
fn=analyze_text, | |
inputs=gr.Textbox(label="Enter Text", lines=5), | |
outputs=gr.Textbox(label="Analysis"), | |
title="Text Analysis Tool", | |
description="Count characters, words, and lines in text", | |
examples=[ | |
["Hello, world!"], | |
["This is an example.\\nIt has multiple lines.\\nThree lines in total."], | |
["The quick brown fox jumps over the lazy dog."] | |
] | |
) | |
""", | |
"chatbot": """ | |
import gradio as gr | |
def respond(message, history): | |
# Simple echo bot for demonstration | |
return f"You said: {message}" | |
demo = gr.ChatInterface( | |
fn=respond, | |
title="Echo Bot", | |
description="A simple chatbot that echoes your messages", | |
examples=["Hello", "What's your name?", "Tell me a joke"] | |
) | |
""", | |
"audio_player": """ | |
import gradio as gr | |
import numpy as np | |
def generate_tone(frequency, duration): | |
sr = 44100 # Sample rate | |
t = np.linspace(0, duration, int(sr * duration), False) | |
tone = 0.5 * np.sin(2 * np.pi * frequency * t) | |
return sr, tone | |
demo = gr.Interface( | |
fn=generate_tone, | |
inputs=[ | |
gr.Slider(110, 880, 440, label="Frequency (Hz)"), | |
gr.Slider(0.1, 5, 1, label="Duration (seconds)") | |
], | |
outputs=gr.Audio(type="numpy"), | |
title="Tone Generator", | |
description="Generate a sine wave tone with the specified frequency and duration" | |
) | |
""" | |
} | |
def load_example(example_name): | |
"""Load a Gradio example from the examples directory or create it if it doesn't exist""" | |
# Generate a unique module name to avoid caching issues | |
module_name = f"gradio_examples.{example_name}_{uuid.uuid4().hex[:8]}" | |
file_path = EXAMPLES_DIR / f"{module_name.split('.')[-1]}.py" | |
# Write the example code to a file | |
with open(file_path, "w") as f: | |
f.write(EXAMPLES[example_name]) | |
# Import the module | |
spec = importlib.util.spec_from_file_location(module_name, file_path) | |
module = importlib.util.module_from_spec(spec) | |
sys.modules[module_name] = module | |
spec.loader.exec_module(module) | |
# Return the module and Gradio demo | |
return module, module.demo | |
def create_custom_example(code): | |
"""Create a custom Gradio example from code""" | |
# Generate a unique module name | |
module_name = f"gradio_examples.custom_{uuid.uuid4().hex[:8]}" | |
file_path = EXAMPLES_DIR / f"{module_name.split('.')[-1]}.py" | |
# Write the code to a file | |
with open(file_path, "w") as f: | |
f.write(code) | |
# Import the module | |
try: | |
spec = importlib.util.spec_from_file_location(module_name, file_path) | |
module = importlib.util.module_from_spec(spec) | |
sys.modules[module_name] = module | |
spec.loader.exec_module(module) | |
# Check if the module has a demo attribute | |
if hasattr(module, 'demo'): | |
return module, module.demo, None | |
else: | |
return None, None, "No 'demo' variable found in the code" | |
except Exception as e: | |
return None, None, f"Error loading code: {str(e)}" | |
def stop_current_app(): | |
"""Stop the currently running Gradio app""" | |
if st.session_state.app_interface: | |
# Close the Gradio interface | |
try: | |
st.session_state.app_interface.close() | |
except: | |
pass | |
# Clear the current app from session state | |
st.session_state.current_app = None | |
st.session_state.current_app_module = None | |
st.session_state.app_interface = None | |
# Create the Streamlit UI | |
st.title("🧩 Gradio Examples Hub") | |
st.write("Discover and run various Gradio examples directly in this app.") | |
# Create tabs for different sections | |
tab_examples, tab_custom = st.tabs(["Built-in Examples", "Custom Code"]) | |
# Built-in Examples tab | |
with tab_examples: | |
st.header("Built-in Examples") | |
# Example selection | |
example_options = list(EXAMPLES.keys()) | |
example_names = { | |
"hello_world": "Hello World", | |
"calculator": "Simple Calculator", | |
"image_filter": "Image Filter", | |
"text_analysis": "Text Analysis", | |
"chatbot": "Simple Chatbot", | |
"audio_player": "Audio Tone Generator" | |
} | |
selected_example = st.selectbox( | |
"Select an example", | |
example_options, | |
format_func=lambda x: example_names.get(x, x) | |
) | |
# Show description | |
example_descriptions = { | |
"hello_world": "A simple app that greets you by name.", | |
"calculator": "Perform basic arithmetic operations between two numbers.", | |
"image_filter": "Apply various filters to images (grayscale, invert, sepia).", | |
"text_analysis": "Count characters, words, and lines in text.", | |
"chatbot": "A simple echo chatbot example.", | |
"audio_player": "Generate audio tones with adjustable frequency and duration." | |
} | |
st.write(example_descriptions.get(selected_example, "")) | |
# Show code | |
with st.expander("View Code"): | |
st.code(EXAMPLES[selected_example], language="python") | |
# Run example button | |
if st.button("Run Example", key="run_example"): | |
stop_current_app() # Stop any running app | |
with st.spinner("Loading example..."): | |
# Load the example | |
module, demo = load_example(selected_example) | |
# Update session state | |
st.session_state.current_app = selected_example | |
st.session_state.current_app_module = module | |
st.session_state.app_interface = demo | |
# Rerun the app to refresh the UI | |
st.experimental_rerun() | |
# Custom Code tab | |
with tab_custom: | |
st.header("Custom Gradio Code") | |
st.write("Write or paste your own Gradio code here.") | |
# Code editor | |
custom_code = st.text_area( | |
"Gradio Code", | |
height=300, | |
placeholder="# Paste your Gradio code here\nimport gradio as gr\n\n# Define your functions\ndef my_function(input):\n return input\n\n# Create the interface\ndemo = gr.Interface(...)" | |
) | |
# Run custom code button | |
if st.button("Run Custom Code", key="run_custom"): | |
if not custom_code.strip(): | |
st.error("Please enter some code") | |
else: | |
stop_current_app() # Stop any running app | |
with st.spinner("Loading custom code..."): | |
# Create the custom example | |
module, demo, error = create_custom_example(custom_code) | |
if error: | |
st.error(error) | |
else: | |
# Update session state | |
st.session_state.current_app = "custom" | |
st.session_state.current_app_module = module | |
st.session_state.app_interface = demo | |
# Rerun the app to refresh the UI | |
st.experimental_rerun() | |
# Display the current app if there is one | |
st.header("Current App") | |
if st.session_state.current_app: | |
app_name = st.session_state.current_app | |
demo = st.session_state.app_interface | |
# Create a container for the app | |
app_container = st.container() | |
app_container.write(f"Running: {example_names.get(app_name, 'Custom App')}") | |
# Create a unique key for the app | |
app_key = f"app_{app_name}_{uuid.uuid4().hex[:8]}" | |
# Render the Gradio interface directly in Streamlit | |
with app_container: | |
gr.Interface.load( | |
fn=demo, | |
title=demo._title, | |
description=getattr(demo, "_description", ""), | |
).render() | |
# Stop button | |
if st.button("Stop App", key="stop_app"): | |
stop_current_app() | |
st.experimental_rerun() | |
else: | |
st.info("No app is currently running. Select an example or create a custom app to get started.") | |
# Footer | |
st.markdown("---") | |
st.markdown("### About this App") | |
st.write( | |
"This Streamlit app demonstrates how to dynamically load and run Gradio interfaces. " | |
"It showcases integration between Streamlit for the main application UI and Gradio for " | |
"interactive demos." | |
) |