cwadayi commited on
Commit
a09a96e
·
verified ·
1 Parent(s): 1fb00fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -72
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. 自訂 CSS 樣式 (新增 Tab 樣式)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- /* [新增] Tab 按鈕美化 */
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
- # 4. [優化] 使用 gr.Blocks() 建構介面
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
- # [優化] 主內容區:改用 Tab 介面
176
  with gr.Tabs(elem_id="main-tabs") as tabs:
177
 
178
  # --- Tab 1: 專案總覽 ---
179
  with gr.TabItem("📚 專案總覽", id=0):
180
- # 幸運推薦區 (移到此 Tab 頂部)
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
- # (移除 Accordion 包裝,直接顯示內容)
 
 
 
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
- # 頁腳 (放置在 Tabs 之外,保持恆定)
315
  gr.Markdown(
316
  """
317
  <hr>
@@ -319,13 +324,13 @@ demo.launch()
319
  """
320
  )
321
 
322
- # 5. 綁定按鈕點擊事件 (保持不變)
323
  recommend_btn.click(
324
  fn=recommend_project,
325
  inputs=None,
326
  outputs=recommend_out
327
  )
328
 
329
- # 6. 啟動應用程式
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()