Spaces:
Running
Running
import gradio as gr | |
import datetime | |
import pandas as pd | |
import json | |
import os | |
# 數據存儲文件 | |
data_file = "dog_activity_data.json" | |
# 初始化數據文件 | |
def init_data_file(): | |
if not os.path.exists(data_file): | |
with open(data_file, "w") as file: | |
json.dump([], file) | |
# 加載活動記錄 | |
def load_data(): | |
try: | |
with open(data_file, "r") as file: | |
return json.load(file) | |
except: | |
return [] | |
# 保存活動記錄 | |
def save_activity(activity): | |
timestamp = datetime.datetime.now() | |
record = {"活動": activity, "時間": timestamp.strftime("%Y-%m-%d %H:%M:%S")} | |
data = load_data() | |
data.append(record) | |
with open(data_file, "w") as file: | |
json.dump(data, file) | |
return update_activity_display() | |
# 更新顯示活動記錄 (增加索引列) | |
def update_activity_display(show_all=False): | |
data = load_data() | |
if not data: | |
return pd.DataFrame(columns=["No.", "活動", "時間"]) | |
# 添加索引列 | |
df = pd.DataFrame(data) | |
df.insert(0, "#(行號)", range(0, len(df))) | |
if not show_all: | |
df = df.tail(5) # 顯示最近 5 條 | |
return df | |
# 刪除記錄功能 | |
def delete_activity(row_index): | |
data = load_data() | |
try: | |
row_index = int(row_index) | |
if 0 <= row_index < len(data): | |
del data[row_index] | |
with open(data_file, "w") as file: | |
json.dump(data, file) | |
return "記錄刪除成功", update_activity_display() | |
else: | |
return "錯誤: 行號超出範圍", update_activity_display() | |
except ValueError: | |
return "錯誤: 請輸入有效的數字行號", update_activity_display() | |
# 主界面 | |
def main_interface(): | |
init_data_file() | |
custom_css = """ | |
.custom-btn { | |
width: 100%; | |
padding: 10px; | |
margin: 5px 0; | |
color: white; | |
border: none; | |
font-size: 16px; | |
text-align: center; | |
cursor: pointer; | |
border-radius: 5px; | |
} | |
.btn-poop { background-color: #FF6347; } /* Tomato */ | |
.btn-pee { background-color: #4682B4; } /* SteelBlue */ | |
.btn-eat { background-color: #32CD32; } /* LimeGreen */ | |
.btn-half { background-color: #FFD700; } /* Gold */ | |
.btn-no-eat { background-color: #D3D3D3; } /* LightGray */ | |
""" | |
with gr.Blocks(css=custom_css) as app: | |
gr.Markdown("## 🐾 狗狗活動記錄器") | |
# 記錄活動按鈕 (不同顏色 + icon) | |
with gr.Row(): | |
poop_btn = gr.Button("💩 拉屎", elem_classes="custom-btn btn-poop") | |
pee_btn = gr.Button("💦 尿尿", elem_classes="custom-btn btn-pee") | |
eat_btn = gr.Button("🍽️ 全吃了", elem_classes="custom-btn btn-eat") | |
half_eat_btn = gr.Button("🍛 吃了一半", elem_classes="custom-btn btn-half") | |
no_eat_btn = gr.Button("🥄 沒怎麼吃", elem_classes="custom-btn btn-no-eat") | |
# 活動記錄表格 | |
gr.Markdown("### 📊 最近活動記錄 (僅顯示最近5條)") | |
data_table = gr.Dataframe(update_activity_display(), interactive=False) | |
# 顯示更多按鈕 | |
show_more_btn = gr.Button("顯示更多記錄") | |
show_less_btn = gr.Button("顯示最近5條", visible=False) | |
# 刪除記錄功能 | |
gr.Markdown("### 🗑️ 刪除記錄") | |
row_to_delete = gr.Textbox(label="輸入要刪除的行號 (從 0 開始)") | |
delete_btn = gr.Button("刪除記錄") | |
delete_msg = gr.Textbox(label="刪除狀態", interactive=False) | |
# 綁定活動按鈕邏輯 | |
poop_btn.click(lambda: save_activity("拉屎"), outputs=[data_table]) | |
pee_btn.click(lambda: save_activity("尿尿"), outputs=[data_table]) | |
eat_btn.click(lambda: save_activity("全吃了"), outputs=[data_table]) | |
half_eat_btn.click(lambda: save_activity("吃了一半"), outputs=[data_table]) | |
no_eat_btn.click(lambda: save_activity("沒怎麼吃"), outputs=[data_table]) | |
# 綁定顯示更多邏輯 | |
show_more_btn.click( | |
lambda: (update_activity_display(show_all=True), gr.update(visible=False), gr.update(visible=True)), | |
inputs=[], | |
outputs=[data_table, show_more_btn, show_less_btn] | |
) | |
show_less_btn.click( | |
lambda: (update_activity_display(show_all=False), gr.update(visible=True), gr.update(visible=False)), | |
inputs=[], | |
outputs=[data_table, show_more_btn, show_less_btn] | |
) | |
# 刪除記錄邏輯 | |
delete_btn.click( | |
delete_activity, | |
inputs=[row_to_delete], | |
outputs=[delete_msg, data_table] | |
) | |
return app | |
# 啟動應用 | |
main_interface().launch(share=True, server_name="0.0.0.0", server_port=7860) | |