| import os |
| import sys |
| import gradio as gr |
| from threading import Thread |
| import time |
|
|
| |
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src')) |
|
|
| |
| from src.main import app |
|
|
| def run_flask(): |
| """在背景執行Flask應用程式""" |
| app.run(host='0.0.0.0', port=7860, debug=False) |
|
|
| def create_gradio_interface(): |
| """建立Gradio介面來包裝Flask應用程式""" |
| |
| |
| flask_thread = Thread(target=run_flask, daemon=True) |
| flask_thread.start() |
| |
| |
| time.sleep(3) |
| |
| |
| with gr.Blocks( |
| title="我們的旅遊清單", |
| theme=gr.themes.Soft(), |
| css=""" |
| .gradio-container { |
| max-width: 100% !important; |
| padding: 0 !important; |
| } |
| """ |
| ) as demo: |
| gr.HTML(""" |
| <div style="text-align: center; padding: 20px;"> |
| <h1>🗺️ 我們的旅遊清單</h1> |
| <p>和另一半一起規劃美好的旅程</p> |
| <p style="margin: 20px 0;"> |
| <a href="/" target="_blank" style=" |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| color: white; |
| padding: 12px 24px; |
| text-decoration: none; |
| border-radius: 8px; |
| font-weight: bold; |
| display: inline-block; |
| ">開始使用旅遊清單 →</a> |
| </p> |
| <div style="margin-top: 30px; padding: 20px; background: #f8f9fa; border-radius: 8px;"> |
| <h3>功能特色</h3> |
| <ul style="text-align: left; max-width: 400px; margin: 0 auto;"> |
| <li>🔐 使用代碼存取共同清單</li> |
| <li>✅ 完成項目自動移到底部</li> |
| <li>📝 雙方可即時編輯</li> |
| <li>🎨 美觀的響應式介面</li> |
| </ul> |
| </div> |
| <div style="margin-top: 20px; font-size: 14px; color: #666;"> |
| <p>💡 建立清單後,將代碼分享給另一半</p> |
| <p>🔄 雙方都可以即時編輯和更新清單</p> |
| <p>✅ 完成的項目會自動移到清單底部</p> |
| </div> |
| </div> |
| """) |
| |
| |
| gr.HTML(""" |
| <iframe |
| src="/" |
| width="100%" |
| height="800px" |
| frameborder="0" |
| style="border-radius: 8px; margin-top: 20px;" |
| ></iframe> |
| """) |
| |
| return demo |
|
|
| if __name__ == "__main__": |
| |
| demo = create_gradio_interface() |
| demo.launch( |
| server_name="0.0.0.0", |
| server_port=7860, |
| share=False, |
| show_error=True |
| ) |
|
|
|
|