Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import random
|
| 3 |
|
| 4 |
-
# 1.
|
| 5 |
projects_data = {
|
| 6 |
"🌊 地震與波形展示": [
|
| 7 |
{"title": "📡 地震目錄搜尋 API", "url": "https://cwadayi-python-app.hf.space/"},
|
|
@@ -33,20 +33,19 @@ projects_data = {
|
|
| 33 |
]
|
| 34 |
}
|
| 35 |
|
| 36 |
-
# 2.
|
| 37 |
def recommend_project():
|
| 38 |
"""從所有專案中隨機挑選一個並回傳 Markdown 格式的推薦"""
|
| 39 |
all_projects = [item for sublist in projects_data.values() for item in sublist]
|
| 40 |
recommendation = random.choice(all_projects)
|
| 41 |
|
| 42 |
-
# 回傳精美的 Markdown 格式
|
| 43 |
return f"""
|
| 44 |
### {recommendation['title']}
|
| 45 |
|
| 46 |
[**點此立即前往 🚀**]({recommendation['url']})
|
| 47 |
"""
|
| 48 |
|
| 49 |
-
# 3.
|
| 50 |
css = """
|
| 51 |
/* 標頭樣式 */
|
| 52 |
#main-header {
|
|
@@ -69,11 +68,10 @@ css = """
|
|
| 69 |
margin: 0 auto;
|
| 70 |
text-align: center;
|
| 71 |
}
|
| 72 |
-
/* 標頭圖片 */
|
| 73 |
#header-image {
|
| 74 |
width: 100%;
|
| 75 |
-
max-height: 250px;
|
| 76 |
-
object-fit: cover;
|
| 77 |
border-radius: 12px;
|
| 78 |
margin-bottom: 1rem;
|
| 79 |
box-shadow: 0 4px 10px rgba(0,0,0,0.2);
|
|
@@ -81,7 +79,7 @@ css = """
|
|
| 81 |
|
| 82 |
/* 推薦按鈕 */
|
| 83 |
#recommend-button {
|
| 84 |
-
background: linear-gradient(135deg, #1abc9c, #16a085);
|
| 85 |
color: white !important;
|
| 86 |
font-size: 1.1rem !important;
|
| 87 |
font-weight: bold !important;
|
|
@@ -101,33 +99,14 @@ css = """
|
|
| 101 |
border-radius: 10px;
|
| 102 |
padding: 1.5rem;
|
| 103 |
text-align: center;
|
| 104 |
-
background-color: #f8fdfc;
|
| 105 |
-
}
|
| 106 |
-
#recommend-output h3 {
|
| 107 |
-
margin-top: 0.5rem;
|
| 108 |
-
margin-bottom: 1.2rem;
|
| 109 |
-
color: #2c3e50;
|
| 110 |
-
font-size: 1.4rem;
|
| 111 |
-
}
|
| 112 |
-
#recommend-output a {
|
| 113 |
-
font-size: 1.1rem;
|
| 114 |
-
font-weight: bold;
|
| 115 |
-
color: #2980b9;
|
| 116 |
-
text-decoration: none;
|
| 117 |
-
transition: color 0.3s ease;
|
| 118 |
-
}
|
| 119 |
-
#recommend-output a:hover {
|
| 120 |
-
color: #3498db;
|
| 121 |
-
text-decoration: underline;
|
| 122 |
}
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
/* 專案標題 */
|
| 125 |
-
.project-title h3 {
|
| 126 |
-
margin: 0;
|
| 127 |
-
padding: 0.5rem 0;
|
| 128 |
-
font-size: 1.2rem;
|
| 129 |
-
color: #2c3e50;
|
| 130 |
-
}
|
| 131 |
|
| 132 |
/* 專案按鈕 */
|
| 133 |
.project-button a {
|
|
@@ -136,35 +115,40 @@ css = """
|
|
| 136 |
border-radius: 8px !important;
|
| 137 |
transition: background-color 0.3s ease, transform 0.2s ease !important;
|
| 138 |
}
|
| 139 |
-
.project-button a:hover {
|
| 140 |
-
background-color: #2980b9 !important;
|
| 141 |
-
transform: scale(1.03);
|
| 142 |
-
}
|
| 143 |
|
| 144 |
-
/*
|
| 145 |
-
#
|
| 146 |
-
|
| 147 |
-
color: #
|
|
|
|
|
|
|
|
|
|
| 148 |
font-size: 0.9rem;
|
| 149 |
-
|
|
|
|
|
|
|
|
|
|
| 150 |
}
|
|
|
|
|
|
|
|
|
|
| 151 |
"""
|
| 152 |
|
| 153 |
-
# 4.
|
| 154 |
with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as demo:
|
| 155 |
|
| 156 |
-
# 標頭區 (
|
| 157 |
with gr.Row(elem_id="main-header"):
|
| 158 |
gr.Markdown(
|
| 159 |
"""
|
| 160 |
<img id="header-image" src="https://images.pexels.com/photos/220201/pexels-photo-220201.jpeg" alt="Abstract seismic waves banner">
|
| 161 |
-
|
| 162 |
<h1>地球物理 x Hugging Face 專案展示</h1>
|
| 163 |
<p>一個地球物理學家的數位百寶箱:探索一系列由 cwadayi 打造的地震與地科應用!</p>
|
| 164 |
"""
|
| 165 |
)
|
| 166 |
|
| 167 |
-
# 介紹區
|
| 168 |
with gr.Accordion("🚀 關於 Hugging Face Spaces (點我展開)", open=False):
|
| 169 |
with gr.Row():
|
| 170 |
with gr.Column():
|
|
@@ -173,7 +157,7 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 173 |
### 什麼是 Hugging Face Spaces?
|
| 174 |
Hugging Face Spaces 是一個由 Hugging Face 提供的免費平台,讓開發者和創作者可以輕鬆地建立、分享和展示他們的機器學習 Demo 或網頁應用程式。
|
| 175 |
|
| 176 |
-
它就像是 AI 應用的「YouTube」!您可以使用 Gradio、Streamlit 等 Python
|
| 177 |
"""
|
| 178 |
)
|
| 179 |
with gr.Column():
|
|
@@ -189,8 +173,97 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 189 |
6. **完成!** 您的Gradio應用程式將自動建置並上線。
|
| 190 |
"""
|
| 191 |
)
|
| 192 |
-
|
| 193 |
-
# [
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 194 |
gr.Markdown("---")
|
| 195 |
with gr.Blocks():
|
| 196 |
gr.Markdown("## ✨ 幸運推薦 ✨")
|
|
@@ -198,11 +271,9 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 198 |
recommend_out = gr.Markdown("點擊上方按鈕,讓我為您挑選一個有趣的專案!", elem_id="recommend-output")
|
| 199 |
gr.Markdown("---")
|
| 200 |
|
| 201 |
-
|
| 202 |
# 專案列表區
|
| 203 |
gr.Markdown("## 📚 專案總覽")
|
| 204 |
|
| 205 |
-
# 動態生成所有專案 (現在會顯示帶有 Emoji 的標題)
|
| 206 |
for category, items in projects_data.items():
|
| 207 |
with gr.Accordion(category, open=True):
|
| 208 |
for item in items:
|
|
@@ -223,11 +294,11 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 223 |
"""
|
| 224 |
)
|
| 225 |
|
| 226 |
-
# 5.
|
| 227 |
recommend_btn.click(
|
| 228 |
-
fn=recommend_project,
|
| 229 |
-
inputs=None,
|
| 230 |
-
outputs=recommend_out
|
| 231 |
)
|
| 232 |
|
| 233 |
# 6. 啟動應用程式
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import random
|
| 3 |
|
| 4 |
+
# 1. 專案資料 (帶有 Emoji)
|
| 5 |
projects_data = {
|
| 6 |
"🌊 地震與波形展示": [
|
| 7 |
{"title": "📡 地震目錄搜尋 API", "url": "https://cwadayi-python-app.hf.space/"},
|
|
|
|
| 33 |
]
|
| 34 |
}
|
| 35 |
|
| 36 |
+
# 2. 隨機推薦函式
|
| 37 |
def recommend_project():
|
| 38 |
"""從所有專案中隨機挑選一個並回傳 Markdown 格式的推薦"""
|
| 39 |
all_projects = [item for sublist in projects_data.values() for item in sublist]
|
| 40 |
recommendation = random.choice(all_projects)
|
| 41 |
|
|
|
|
| 42 |
return f"""
|
| 43 |
### {recommendation['title']}
|
| 44 |
|
| 45 |
[**點此立即前往 🚀**]({recommendation['url']})
|
| 46 |
"""
|
| 47 |
|
| 48 |
+
# 3. 自訂 CSS 樣式
|
| 49 |
css = """
|
| 50 |
/* 標頭樣式 */
|
| 51 |
#main-header {
|
|
|
|
| 68 |
margin: 0 auto;
|
| 69 |
text-align: center;
|
| 70 |
}
|
|
|
|
| 71 |
#header-image {
|
| 72 |
width: 100%;
|
| 73 |
+
max-height: 250px;
|
| 74 |
+
object-fit: cover;
|
| 75 |
border-radius: 12px;
|
| 76 |
margin-bottom: 1rem;
|
| 77 |
box-shadow: 0 4px 10px rgba(0,0,0,0.2);
|
|
|
|
| 79 |
|
| 80 |
/* 推薦按鈕 */
|
| 81 |
#recommend-button {
|
| 82 |
+
background: linear-gradient(135deg, #1abc9c, #16a085);
|
| 83 |
color: white !important;
|
| 84 |
font-size: 1.1rem !important;
|
| 85 |
font-weight: bold !important;
|
|
|
|
| 99 |
border-radius: 10px;
|
| 100 |
padding: 1.5rem;
|
| 101 |
text-align: center;
|
| 102 |
+
background-color: #f8fdfc;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
}
|
| 104 |
+
#recommend-output h3 { margin-top: 0.5rem; margin-bottom: 1.2rem; color: #2c3e50; font-size: 1.4rem; }
|
| 105 |
+
#recommend-output a { font-size: 1.1rem; font-weight: bold; color: #2980b9; text-decoration: none; transition: color 0.3s ease; }
|
| 106 |
+
#recommend-output a:hover { color: #3498db; text-decoration: underline; }
|
| 107 |
|
| 108 |
/* 專案標題 */
|
| 109 |
+
.project-title h3 { margin: 0; padding: 0.5rem 0; font-size: 1.2rem; color: #2c3e50; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
/* 專案按鈕 */
|
| 112 |
.project-button a {
|
|
|
|
| 115 |
border-radius: 8px !important;
|
| 116 |
transition: background-color 0.3s ease, transform 0.2s ease !important;
|
| 117 |
}
|
| 118 |
+
.project-button a:hover { background-color: #2980b9 !important; transform: scale(1.03); }
|
|
|
|
|
|
|
|
|
|
| 119 |
|
| 120 |
+
/* [新增] 教學區塊的程式碼樣式 */
|
| 121 |
+
#tutorial-code-block pre {
|
| 122 |
+
background-color: #2b2b2b; /* 深色背景 */
|
| 123 |
+
color: #f8f8f2; /* 亮色文字 */
|
| 124 |
+
padding: 1.5rem;
|
| 125 |
+
border-radius: 10px;
|
| 126 |
+
font-family: 'Courier New', Courier, monospace;
|
| 127 |
font-size: 0.9rem;
|
| 128 |
+
line-height: 1.5;
|
| 129 |
+
white-space: pre-wrap; /* 自動換行 */
|
| 130 |
+
overflow-x: auto; /* 水平滾動 */
|
| 131 |
+
border: 2px solid #444;
|
| 132 |
}
|
| 133 |
+
|
| 134 |
+
/* 頁腳 */
|
| 135 |
+
#footer { text-align: center; color: #777; font-size: 0.9rem; margin-top: 2rem; }
|
| 136 |
"""
|
| 137 |
|
| 138 |
+
# 4. 使用 gr.Blocks() 建構介面
|
| 139 |
with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as demo:
|
| 140 |
|
| 141 |
+
# 標頭區 (含圖片)
|
| 142 |
with gr.Row(elem_id="main-header"):
|
| 143 |
gr.Markdown(
|
| 144 |
"""
|
| 145 |
<img id="header-image" src="https://images.pexels.com/photos/220201/pexels-photo-220201.jpeg" alt="Abstract seismic waves banner">
|
|
|
|
| 146 |
<h1>地球物理 x Hugging Face 專案展示</h1>
|
| 147 |
<p>一個地球物理學家的數位百寶箱:探索一系列由 cwadayi 打造的地震與地科應用!</p>
|
| 148 |
"""
|
| 149 |
)
|
| 150 |
|
| 151 |
+
# 介紹區
|
| 152 |
with gr.Accordion("🚀 關於 Hugging Face Spaces (點我展開)", open=False):
|
| 153 |
with gr.Row():
|
| 154 |
with gr.Column():
|
|
|
|
| 157 |
### 什麼是 Hugging Face Spaces?
|
| 158 |
Hugging Face Spaces 是一個由 Hugging Face 提供的免費平台,讓開發者和創作者可以輕鬆地建立、分享和展示他們的機器學習 Demo 或網頁應用程式。
|
| 159 |
|
| 160 |
+
它就像是 AI 應用的「YouTube」!您可以使用 Gradio、Streamlit 等 Python 套件快速打造互動介面,或者部署靜T態網頁 (HTML/CSS/JS),甚至運行 Docker 容器。
|
| 161 |
"""
|
| 162 |
)
|
| 163 |
with gr.Column():
|
|
|
|
| 173 |
6. **完成!** 您的Gradio應用程式將自動建置並上線。
|
| 174 |
"""
|
| 175 |
)
|
| 176 |
+
|
| 177 |
+
# [新增] 學生教學區塊
|
| 178 |
+
with gr.Accordion("🎓 學生的 AI 創客空間:5 步驟打造你的地科 App!", open=True):
|
| 179 |
+
gr.Markdown(
|
| 180 |
+
"""
|
| 181 |
+
<div style="padding: 1rem;">
|
| 182 |
+
<h3>想自己動手做一個酷酷的 App 嗎?跟著 AI 一起,你也能在 5 分鐘內上線!</h3>
|
| 183 |
+
<p>這是一個教你如何「跟 AI (例如 Gemini) 協作」來快速打造並部署應用程式的SOP:</p>
|
| 184 |
+
|
| 185 |
+
<hr style="margin: 1.5rem 0;">
|
| 186 |
+
|
| 187 |
+
<h3>Step 1: 點子發想 🧠</h3>
|
| 188 |
+
<p>先想一個簡單的點子。例如:「我想做一個查詢『地科名詞』的字典!」</p>
|
| 189 |
+
|
| 190 |
+
<h3>Step 2: 詠唱 AI 咒語 🧙</h3>
|
| 191 |
+
<p>打開你最愛的 AI 助手,對它說出清晰的指令 (Prompt),例如:</p>
|
| 192 |
+
<blockquote>
|
| 193 |
+
"請幫我用 Python 和 Gradio 寫一個簡單的應用。我需要一個下拉式選單,選項有「板塊構造」、「地震波」、「海嘯」。當我選擇一個選項時,下方要顯示對應的中文解釋。請給我完整的 `app.py` 程式碼。"
|
| 194 |
+
</blockquote>
|
| 195 |
+
|
| 196 |
+
<h3>Step 3: 取得程式碼 📜</h3>
|
| 197 |
+
<p>AI 會給你一份完整的程式碼。下面這份就是 AI 可能會產生的答案,你可以直接複製它來進行下一步!</p>
|
| 198 |
+
|
| 199 |
+
<div id="tutorial-code-block">
|
| 200 |
+
<pre>
|
| 201 |
+
import gradio as gr
|
| 202 |
+
|
| 203 |
+
# 1. 知識庫 (你的地科字典)
|
| 204 |
+
geo_dict = {
|
| 205 |
+
"板塊構造 (Plate Tectonics)": "地球的岩石圈被分成許多稱為「板塊」的巨大板塊,這些板塊在軟流圈上緩慢移動,彼此碰撞或分離,形成了火山、地震和山脈。",
|
| 206 |
+
"地震波 (Seismic Wave)": "地震時從震源向四面八方傳播的能量波。主要分為 P 波(壓縮波,速度快)和 S 波(剪力波,速度慢),它們是我們研究地球內部的主要工具。",
|
| 207 |
+
"海嘯 (Tsunami)": "由海底地震、火山爆發或山崩引起的巨大海浪。它在深海中傳播速度極快(可達時速 800 公里),但波高很低;當它靠近淺海岸時,速度減慢,波高則急遽增加。"
|
| 208 |
+
}
|
| 209 |
+
|
| 210 |
+
# 2. 定義介面函式
|
| 211 |
+
def get_definition(term):
|
| 212 |
+
# 從字典中查找解釋
|
| 213 |
+
return geo_dict.get(term, "查無此名詞")
|
| 214 |
+
|
| 215 |
+
# 3. 建立 Gradio 介面
|
| 216 |
+
with gr.Blocks(title="我的地科字典") as demo:
|
| 217 |
+
gr.Markdown("# 🚀 我的第一個地科 App")
|
| 218 |
+
gr.Markdown("這是一個由 AI 協助產生的 Gradio 應用程式!")
|
| 219 |
+
|
| 220 |
+
# 輸入元件:下拉式選單
|
| 221 |
+
dropdown = gr.Dropdown(
|
| 222 |
+
label="請選擇一個地科名詞",
|
| 223 |
+
choices=list(geo_dict.keys()) # 選項來自字典的 "key"
|
| 224 |
+
)
|
| 225 |
+
|
| 226 |
+
# 輸出元件:文字框
|
| 227 |
+
output_textbox = gr.Textbox(
|
| 228 |
+
label="名詞解釋",
|
| 229 |
+
lines=5, # 顯示 5 行的高度
|
| 230 |
+
interactive=False # 使用者不能編輯
|
| 231 |
+
)
|
| 232 |
+
|
| 233 |
+
# 4. 綁定互動
|
| 234 |
+
dropdown.change(
|
| 235 |
+
fn=get_definition, # 當下拉選單改變時,呼叫 get_definition 函式
|
| 236 |
+
inputs=dropdown, # 輸入是下拉選單的 "值"
|
| 237 |
+
outputs=output_textbox # 輸出到文字框
|
| 238 |
+
)
|
| 239 |
+
|
| 240 |
+
# 5. 啟動 App
|
| 241 |
+
demo.launch()
|
| 242 |
+
|
| 243 |
+
</pre>
|
| 244 |
+
</div>
|
| 245 |
+
|
| 246 |
+
<h3>Step 4: 部署到 Space 🚀</h3>
|
| 247 |
+
<p>這是最神奇的一步!</p>
|
| 248 |
+
<ol>
|
| 249 |
+
<li>到 Hugging Face 網站,點選你的頭像,選擇 <strong>"New Space"</strong>。</li>
|
| 250 |
+
<li>為你的 Space 命名 (例如: <code>my-geo-dictionary</code>)。</li>
|
| 251 |
+
<li>在 "Space SDK" 中選擇 <strong>"Gradio"</strong> (很重要!)。</li>
|
| 252 |
+
<li>點擊 "Create Space"。</li>
|
| 253 |
+
<li>在你的 Space 頁面,點選 "Files and versions" -> "Add file" -> "Create new file"。</li>
|
| 254 |
+
<li>將檔案命名為 <strong><code>app.py</code></strong> (必須是這個名字!)。</li>
|
| 255 |
+
<li><strong>將上面 "Step 3" 的整段程式碼,完整貼到 `app.py` 的編輯器中。</strong></li>
|
| 256 |
+
<li>點擊 "Commit new file" (提交檔案)。</li>
|
| 257 |
+
</ol>
|
| 258 |
+
|
| 259 |
+
<h3>Step 5: 恭喜你!🎉</h3>
|
| 260 |
+
<p>等待幾分鐘,Hugging Face 會自動幫你把 App "建置" (Building) 起來。當你看到 "Running" 狀態時,恭喜你!你的第一個地科 App 已經上線,全世界都可以透過網址來使用了!</p>
|
| 261 |
+
|
| 262 |
+
</div>
|
| 263 |
+
"""
|
| 264 |
+
)
|
| 265 |
+
|
| 266 |
+
# 隨機推薦區
|
| 267 |
gr.Markdown("---")
|
| 268 |
with gr.Blocks():
|
| 269 |
gr.Markdown("## ✨ 幸運推薦 ✨")
|
|
|
|
| 271 |
recommend_out = gr.Markdown("點擊上方按鈕,讓我為您挑選一個有趣的專案!", elem_id="recommend-output")
|
| 272 |
gr.Markdown("---")
|
| 273 |
|
|
|
|
| 274 |
# 專案列表區
|
| 275 |
gr.Markdown("## 📚 專案總覽")
|
| 276 |
|
|
|
|
| 277 |
for category, items in projects_data.items():
|
| 278 |
with gr.Accordion(category, open=True):
|
| 279 |
for item in items:
|
|
|
|
| 294 |
"""
|
| 295 |
)
|
| 296 |
|
| 297 |
+
# 5. 綁定按鈕點擊事件
|
| 298 |
recommend_btn.click(
|
| 299 |
+
fn=recommend_project,
|
| 300 |
+
inputs=None,
|
| 301 |
+
outputs=recommend_out
|
| 302 |
)
|
| 303 |
|
| 304 |
# 6. 啟動應用程式
|