Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
import random
|
|
|
|
| 3 |
|
| 4 |
# 1. 專案資料 (帶有 Emoji)
|
| 5 |
projects_data = {
|
|
@@ -45,7 +46,53 @@ def recommend_project():
|
|
| 45 |
[**點此立即前往 🚀**]({recommendation['url']})
|
| 46 |
"""
|
| 47 |
|
| 48 |
-
# 3.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
css = """
|
| 50 |
/* 標頭樣式 */
|
| 51 |
#main-header {
|
|
@@ -77,7 +124,7 @@ css = """
|
|
| 77 |
box-shadow: 0 4px 10px rgba(0,0,0,0.2);
|
| 78 |
}
|
| 79 |
|
| 80 |
-
/*
|
| 81 |
#main-tabs > .tab-buttons > button {
|
| 82 |
background-color: #f0f2f5;
|
| 83 |
color: #555;
|
|
@@ -141,28 +188,16 @@ css = """
|
|
| 141 |
}
|
| 142 |
.project-button a:hover { background-color: #2980b9 !important; transform: scale(1.03); }
|
| 143 |
|
| 144 |
-
/*
|
| 145 |
-
#tutorial-code-block pre {
|
| 146 |
-
background-color: #2b2b2b;
|
| 147 |
-
color: #f8f8f2;
|
| 148 |
-
padding: 1.5rem;
|
| 149 |
-
border-radius: 10px;
|
| 150 |
-
font-family: 'Courier New', Courier, monospace;
|
| 151 |
-
font-size: 0.9rem;
|
| 152 |
-
line-height: 1.5;
|
| 153 |
-
white-space: pre-wrap;
|
| 154 |
-
overflow-x: auto;
|
| 155 |
-
border: 2px solid #444;
|
| 156 |
-
}
|
| 157 |
|
| 158 |
/* 頁腳 */
|
| 159 |
#footer { text-align: center; color: #777; font-size: 0.9rem; margin-top: 2rem; }
|
| 160 |
"""
|
| 161 |
|
| 162 |
-
#
|
| 163 |
with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as demo:
|
| 164 |
|
| 165 |
-
# 標頭區
|
| 166 |
with gr.Row(elem_id="main-header"):
|
| 167 |
gr.Markdown(
|
| 168 |
"""
|
|
@@ -172,12 +207,12 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 172 |
"""
|
| 173 |
)
|
| 174 |
|
| 175 |
-
#
|
| 176 |
with gr.Tabs(elem_id="main-tabs") as tabs:
|
| 177 |
|
| 178 |
# --- Tab 1: 專案總覽 ---
|
| 179 |
with gr.TabItem("📚 專案總覽", id=0):
|
| 180 |
-
# 幸運推薦區
|
| 181 |
gr.Markdown("---")
|
| 182 |
with gr.Blocks():
|
| 183 |
gr.Markdown("## ✨ 幸運推薦 ✨")
|
|
@@ -202,68 +237,40 @@ with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as dem
|
|
| 202 |
|
| 203 |
# --- Tab 2: AI 創客空間 (學生教學) ---
|
| 204 |
with gr.TabItem("🎓 AI 創客空間", id=1):
|
| 205 |
-
|
|
|
|
|
|
|
|
|
|
| 206 |
gr.Markdown(
|
| 207 |
"""
|
| 208 |
<div style="padding: 1rem 0;">
|
| 209 |
<h2>🚀 5 步驟打造你的地科 App!</h2>
|
| 210 |
<p>這是一個教你如何「跟 AI (例如 Gemini) 協作」來快速打造並部署應用程式的SOP:</p>
|
| 211 |
-
|
| 212 |
<hr style="margin: 1.5rem 0;">
|
| 213 |
-
|
| 214 |
<h3>Step 1: 點子發想 🧠</h3>
|
| 215 |
<p>先想一個簡單的點子。例如:「我想做一個查詢『地科名詞』的字典!」</p>
|
| 216 |
-
|
| 217 |
<h3>Step 2: 詠唱 AI 咒語 🧙</h3>
|
| 218 |
<p>打開你最愛的 AI 助手,對它說出清晰的指令 (Prompt),例如:</p>
|
| 219 |
<blockquote>
|
| 220 |
"請幫我用 Python 和 Gradio 寫一個簡單的應用。我需要一個下拉式選單,選項有「板塊構造」、「地震波」、「海嘯」。當我選擇一個選項時,下方要顯示對應的中文解釋。請給我完整的 `app.py` 程式碼。"
|
| 221 |
</blockquote>
|
| 222 |
-
|
| 223 |
-
<h3>Step 3: 取得程式碼 📜</h3>
|
| 224 |
-
<p>AI 會給你一份完整的程式碼。下面這份就是 AI 可能會產生的答案,你可以直接複製它來進行下一步!</p>
|
| 225 |
-
|
| 226 |
-
<div id="tutorial-code-block">
|
| 227 |
-
<pre>
|
| 228 |
-
import gradio as gr
|
| 229 |
-
|
| 230 |
-
# 1. 知識庫 (你的地科字典)
|
| 231 |
-
geo_dict = {
|
| 232 |
-
"板塊構造 (Plate Tectonics)": "地球的岩石圈被分成許多稱為「板塊」的巨大板塊,這些板塊在軟流圈上緩慢移動,彼此碰撞或分離,形成了火山、地震和山脈。",
|
| 233 |
-
"地震波 (Seismic Wave)": "地震時從震源向四面八方傳播的能量波。主要分為 P 波(壓縮波,速度快)和 S 波(剪力波,速度慢),它們是我們研究地球內部的主要工具。",
|
| 234 |
-
"海嘯 (Tsunami)": "由海底地震、火山爆發或山崩引起的巨大海浪。它在深海中傳播速度極快(可達時速 800 公里),但波高很低;當它靠近淺海岸時,速度減慢,波高則急遽增加。"
|
| 235 |
-
}
|
| 236 |
-
|
| 237 |
-
# 2. 定義介面函式
|
| 238 |
-
def get_definition(term):
|
| 239 |
-
return geo_dict.get(term, "查無此名詞")
|
| 240 |
-
|
| 241 |
-
# 3. 建立 Gradio 介面
|
| 242 |
-
with gr.Blocks(title="我的地科字典") as demo:
|
| 243 |
-
gr.Markdown("# 🚀 我的第一個地科 App")
|
| 244 |
-
gr.Markdown("這是一個由 AI 協助產生的 Gradio 應用程式!")
|
| 245 |
-
|
| 246 |
-
dropdown = gr.Dropdown(
|
| 247 |
-
label="請選擇一個地科名詞",
|
| 248 |
-
choices=list(geo_dict.keys())
|
| 249 |
-
)
|
| 250 |
-
|
| 251 |
-
output_textbox = gr.Textbox(
|
| 252 |
-
label="名詞解釋",
|
| 253 |
-
lines=5,
|
| 254 |
-
interactive=False
|
| 255 |
-
)
|
| 256 |
-
|
| 257 |
-
dropdown.change(
|
| 258 |
-
fn=get_definition,
|
| 259 |
-
inputs=dropdown,
|
| 260 |
-
outputs=output_textbox
|
| 261 |
-
)
|
| 262 |
-
|
| 263 |
-
demo.launch()
|
| 264 |
-
</pre>
|
| 265 |
</div>
|
| 266 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 267 |
<h3>Step 4: 部署到 Space 🚀</h3>
|
| 268 |
<p>這是最神奇的一步!</p>
|
| 269 |
<ol>
|
|
@@ -279,14 +286,12 @@ demo.launch()
|
|
| 279 |
|
| 280 |
<h3>Step 5: 恭喜你!🎉</h3>
|
| 281 |
<p>等待幾分鐘,Hugging Face 會自動幫你把 App "建置" (Building) 起來。當你看到 "Running" 狀態時,恭喜你!你的第一個地科 App 已經上線,全世界都可以透過網址來使用了!</p>
|
| 282 |
-
|
| 283 |
</div>
|
| 284 |
"""
|
| 285 |
)
|
| 286 |
|
| 287 |
# --- Tab 3: 關於 Spaces ---
|
| 288 |
with gr.TabItem("ℹ️ 關於 Spaces", id=2):
|
| 289 |
-
# (移除 Accordion 包裝,直接顯示內容)
|
| 290 |
with gr.Row(equal_height=True, variant="panel"):
|
| 291 |
with gr.Column():
|
| 292 |
gr.Markdown(
|
|
@@ -311,7 +316,7 @@ demo.launch()
|
|
| 311 |
"""
|
| 312 |
)
|
| 313 |
|
| 314 |
-
# 頁腳
|
| 315 |
gr.Markdown(
|
| 316 |
"""
|
| 317 |
<hr>
|
|
@@ -319,13 +324,13 @@ demo.launch()
|
|
| 319 |
"""
|
| 320 |
)
|
| 321 |
|
| 322 |
-
#
|
| 323 |
recommend_btn.click(
|
| 324 |
fn=recommend_project,
|
| 325 |
inputs=None,
|
| 326 |
outputs=recommend_out
|
| 327 |
)
|
| 328 |
|
| 329 |
-
#
|
| 330 |
if __name__ == "__main__":
|
| 331 |
demo.launch()
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import random
|
| 3 |
+
import textwrap # [新增] 用於處理程式碼字串的縮排
|
| 4 |
|
| 5 |
# 1. 專案資料 (帶有 Emoji)
|
| 6 |
projects_data = {
|
|
|
|
| 46 |
[**點此立即前往 🚀**]({recommendation['url']})
|
| 47 |
"""
|
| 48 |
|
| 49 |
+
# 3. [新增] 學生教學範例程式碼 (使用 textwrap.dedent 確保格式正確)
|
| 50 |
+
TUTORIAL_CODE = textwrap.dedent("""
|
| 51 |
+
import gradio as gr
|
| 52 |
+
|
| 53 |
+
# 1. 知識庫 (你的地科字典)
|
| 54 |
+
geo_dict = {
|
| 55 |
+
"板塊構造 (Plate Tectonics)": "地球的岩石圈被分成許多稱為「板塊」的巨大板塊,這些板塊在軟流圈上緩慢移動,彼此碰撞或分離,形成了火山、地震和山脈。",
|
| 56 |
+
"地震波 (Seismic Wave)": "地震時從震源向四面八方傳播的能量波。主要分為 P 波(壓縮波,速度快)和 S 波(剪力波,速度慢),它們是我們研究地球內部的主要工具。",
|
| 57 |
+
"海嘯 (Tsunami)": "由海底地震、火山爆發或山崩引起的巨大海浪。它在深海中傳播速度極快(可達時速 800 公里),但波高很低;當它靠近淺海岸時,速度減慢,波高則急遽增加。"
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
# 2. 定義介面函式
|
| 61 |
+
def get_definition(term):
|
| 62 |
+
# 從字典中查找解釋
|
| 63 |
+
return geo_dict.get(term, "查無此名詞")
|
| 64 |
+
|
| 65 |
+
# 3. 建立 Gradio 介面
|
| 66 |
+
with gr.Blocks(title="我的地科字典") as demo:
|
| 67 |
+
gr.Markdown("# 🚀 我的第一個地科 App")
|
| 68 |
+
gr.Markdown("這是一個由 AI 協助產生的 Gradio 應用程式!")
|
| 69 |
+
|
| 70 |
+
# 輸入元件:下拉式選單
|
| 71 |
+
dropdown = gr.Dropdown(
|
| 72 |
+
label="請選擇一個地科名詞",
|
| 73 |
+
choices=list(geo_dict.keys()) # 選項來自字典的 "key"
|
| 74 |
+
)
|
| 75 |
+
|
| 76 |
+
# 輸出元件:文字框
|
| 77 |
+
output_textbox = gr.Textbox(
|
| 78 |
+
label="名詞解釋",
|
| 79 |
+
lines=5, # 顯示 5 行的高度
|
| 80 |
+
interactive=False # 使用者不能編輯
|
| 81 |
+
)
|
| 82 |
+
|
| 83 |
+
# 4. 綁定互動
|
| 84 |
+
dropdown.change(
|
| 85 |
+
fn=get_definition, # 當下拉選單改變時,呼叫 get_definition 函式
|
| 86 |
+
inputs=dropdown, # 輸入是下拉選單的 "值"
|
| 87 |
+
outputs=output_textbox # 輸出到文字框
|
| 88 |
+
)
|
| 89 |
+
|
| 90 |
+
# 5. 啟動 App
|
| 91 |
+
demo.launch()
|
| 92 |
+
""")
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
# 4. 自訂 CSS 樣式
|
| 96 |
css = """
|
| 97 |
/* 標頭樣式 */
|
| 98 |
#main-header {
|
|
|
|
| 124 |
box-shadow: 0 4px 10px rgba(0,0,0,0.2);
|
| 125 |
}
|
| 126 |
|
| 127 |
+
/* Tab 按鈕美化 */
|
| 128 |
#main-tabs > .tab-buttons > button {
|
| 129 |
background-color: #f0f2f5;
|
| 130 |
color: #555;
|
|
|
|
| 188 |
}
|
| 189 |
.project-button a:hover { background-color: #2980b9 !important; transform: scale(1.03); }
|
| 190 |
|
| 191 |
+
/* [刪除] 移除了 #tutorial-code-block 的 CSS,因為不再需要 */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
/* 頁腳 */
|
| 194 |
#footer { text-align: center; color: #777; font-size: 0.9rem; margin-top: 2rem; }
|
| 195 |
"""
|
| 196 |
|
| 197 |
+
# 5. 使用 gr.Blocks() 建構介面
|
| 198 |
with gr.Blocks(css=css, title="地球物理 x Hugging Face 專案展示") as demo:
|
| 199 |
|
| 200 |
+
# 標頭區
|
| 201 |
with gr.Row(elem_id="main-header"):
|
| 202 |
gr.Markdown(
|
| 203 |
"""
|
|
|
|
| 207 |
"""
|
| 208 |
)
|
| 209 |
|
| 210 |
+
# 主內容區:Tab 介面
|
| 211 |
with gr.Tabs(elem_id="main-tabs") as tabs:
|
| 212 |
|
| 213 |
# --- Tab 1: 專案總覽 ---
|
| 214 |
with gr.TabItem("📚 專案總覽", id=0):
|
| 215 |
+
# 幸運推薦區
|
| 216 |
gr.Markdown("---")
|
| 217 |
with gr.Blocks():
|
| 218 |
gr.Markdown("## ✨ 幸運推薦 ✨")
|
|
|
|
| 237 |
|
| 238 |
# --- Tab 2: AI 創客空間 (學生教學) ---
|
| 239 |
with gr.TabItem("🎓 AI 創客空間", id=1):
|
| 240 |
+
|
| 241 |
+
# [修復] 將教學內容拆分為 Markdown 和 Code 元件
|
| 242 |
+
|
| 243 |
+
# (教學文字 - Step 1 & 2)
|
| 244 |
gr.Markdown(
|
| 245 |
"""
|
| 246 |
<div style="padding: 1rem 0;">
|
| 247 |
<h2>🚀 5 步驟打造你的地科 App!</h2>
|
| 248 |
<p>這是一個教你如何「跟 AI (例如 Gemini) 協作」來快速打造並部署應用程式的SOP:</p>
|
|
|
|
| 249 |
<hr style="margin: 1.5rem 0;">
|
|
|
|
| 250 |
<h3>Step 1: 點子發想 🧠</h3>
|
| 251 |
<p>先想一個簡單的點子。例如:「我想做一個查詢『地科名詞』的字典!」</p>
|
|
|
|
| 252 |
<h3>Step 2: 詠唱 AI 咒語 🧙</h3>
|
| 253 |
<p>打開你最愛的 AI 助手,對它說出清晰的指令 (Prompt),例如:</p>
|
| 254 |
<blockquote>
|
| 255 |
"請幫我用 Python 和 Gradio 寫一個簡單的應用。我需要一個下拉式選單,選項有「板塊構造」、「地震波」、「海嘯」。當我選擇一個選項時,下方要顯示對應的中文解釋。請給我完整的 `app.py` 程式碼。"
|
| 256 |
</blockquote>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
</div>
|
| 258 |
+
"""
|
| 259 |
+
)
|
| 260 |
+
|
| 261 |
+
# (教學程式碼 - Step 3)
|
| 262 |
+
# [修復] 使用 gr.Code 元件取代原本的 <pre> 標籤
|
| 263 |
+
gr.Code(
|
| 264 |
+
label="Step 3: 取得程式碼 📜 (app.py 範例)",
|
| 265 |
+
value=TUTORIAL_CODE,
|
| 266 |
+
language="python",
|
| 267 |
+
interactive=False # 讓它不可編輯
|
| 268 |
+
)
|
| 269 |
+
|
| 270 |
+
# (教學文字 - Step 4 & 5)
|
| 271 |
+
gr.Markdown(
|
| 272 |
+
"""
|
| 273 |
+
<div style="padding: 1rem 0;">
|
| 274 |
<h3>Step 4: 部署到 Space 🚀</h3>
|
| 275 |
<p>這是最神奇的一步!</p>
|
| 276 |
<ol>
|
|
|
|
| 286 |
|
| 287 |
<h3>Step 5: 恭喜你!🎉</h3>
|
| 288 |
<p>等待幾分鐘,Hugging Face 會自動幫你把 App "建置" (Building) 起來。當你看到 "Running" 狀態時,恭喜你!你的第一個地科 App 已經上線,全世界都可以透過網址來使用了!</p>
|
|
|
|
| 289 |
</div>
|
| 290 |
"""
|
| 291 |
)
|
| 292 |
|
| 293 |
# --- Tab 3: 關於 Spaces ---
|
| 294 |
with gr.TabItem("ℹ️ 關於 Spaces", id=2):
|
|
|
|
| 295 |
with gr.Row(equal_height=True, variant="panel"):
|
| 296 |
with gr.Column():
|
| 297 |
gr.Markdown(
|
|
|
|
| 316 |
"""
|
| 317 |
)
|
| 318 |
|
| 319 |
+
# 頁腳
|
| 320 |
gr.Markdown(
|
| 321 |
"""
|
| 322 |
<hr>
|
|
|
|
| 324 |
"""
|
| 325 |
)
|
| 326 |
|
| 327 |
+
# 6. 綁定按鈕點擊事件
|
| 328 |
recommend_btn.click(
|
| 329 |
fn=recommend_project,
|
| 330 |
inputs=None,
|
| 331 |
outputs=recommend_out
|
| 332 |
)
|
| 333 |
|
| 334 |
+
# 7. 啟動應用程式
|
| 335 |
if __name__ == "__main__":
|
| 336 |
demo.launch()
|