iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

今天是第十二天可以寫一個斑馬魚使用者介面的視窗,以下是程式碼

import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk
from tkinter import simpledialog
import os
import shutil

def yolo_calculate(image_path, weight_file_path):
    # 假設這是一個 YOLO 計算的函數
    # 這裡放置你的 YOLO 計算邏輯
    result_image_path = image_path  # 這是個假設,實際上應該返回處理過的圖片路徑
    return result_image_path

def select_file():
    file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.gif")])
    if file_path:
        file_path_var.set(file_path)

def select_weight_file():
    weight_file_path = filedialog.askopenfilename(filetypes=[("Weight Files", "*.weights")])
    if weight_file_path:
        weight_value_var.set(weight_file_path)

def perform_yolo():
    file_path = file_path_var.get()
    weight_file_path = weight_value_var.get()

    result_image_path = yolo_calculate(file_path, weight_file_path)
    load_image(result_image_path)
    show_zebrafish_window()

def load_image(image_path):
    try:
        img = tk.PhotoImage(file=image_path)
        image_label.config(image=img)
        image_label.image = img
    except Exception as e:
        messagebox.showerror("錯誤", f"無法加載圖片: {e}")

def show_zebrafish_window():
    new_window = tk.Toplevel(root)
    new_window.title("斑馬魚分析")
    new_window.configure(bg='lightblue')
    
    # 設置新視窗的列和行,使其可以動態調整大小
    for i in range(2):
        new_window.grid_columnconfigure(i, weight=1)
    for i in range(4):  # 增加一行用來顯示下載按鈕
        new_window.grid_rowconfigure(i, weight=1)
    
    ttk.Button(new_window, text="斑馬魚運動軌跡影片", command=zebrafish_video).grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="ew")

    ttk.Button(new_window, text="正常佔比", command=lambda: zebrafish_behavior("Normal")).grid(row=1, column=0, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="害怕佔比", command=lambda: zebrafish_behavior("Fear")).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="焦慮佔比", command=lambda: zebrafish_behavior("Anxiety")).grid(row=2, column=0, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="壓抑佔比", command=lambda: zebrafish_behavior("Depression")).grid(row=2, column=1, padx=5, pady=5, sticky="ew")

    ttk.Button(new_window, text="下載影片", command=download_video).grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="ew")

def zebrafish_video():
    # Placeholder for zebrafish video tracking logic
    messagebox.showinfo("斑馬魚影片", "斑馬魚運動軌跡計算完成。")

def zebrafish_behavior(behavior_type):
    # Placeholder for zebrafish behavior calculation logic
    messagebox.showinfo("斑馬魚行為", f"斑馬魚行為 ({behavior_type}) 計算完成。")

def download_video():
    # Placeholder for video download logic
    video_path = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 Files", "*.mp4")])
    if video_path:
        # 假設這裡有個虛擬的影片路徑
        temp_video_path = "path_to_your_video.mp4"  # 替換為實際的影片路徑
        if os.path.exists(temp_video_path):
            try:
                shutil.copy(temp_video_path, video_path)
                messagebox.showinfo("成功", "影片已成功下載。")
            except Exception as e:
                messagebox.showerror("錯誤", f"下載影片時發生錯誤: {e}")
        else:
            messagebox.showerror("錯誤", "找不到影片文件。")

# 建立主視窗
root = tk.Tk()
root.title("YOLO 和 LSTM 圖形界面")
root.configure(bg='lightblue')  # 設定背景顏色為淺藍色

# 檔案路徑變數
file_path_var = tk.StringVar()
weight_value_var = tk.StringVar()
result_var = tk.StringVar()

# 設置根容器的列和行,使其可以動態調整大小
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

# 創建一個框架以容納所有的小部件
main_frame = ttk.Frame(root, padding="10")
main_frame.grid(row=0, column=0, sticky="nsew")
main_frame.configure(style="Main.TFrame")

# 設置 main_frame 的列和行,使其可以動態調整大小
for i in range(3):
    main_frame.grid_columnconfigure(i, weight=1)
for i in range(9):
    main_frame.grid_rowconfigure(i, weight=1)

# 設置樣式
style = ttk.Style()
style.configure("TFrame", background='lightblue')
style.configure("TLabel", background='lightblue')
style.configure("TButton", background='lightblue')

# 檔案選擇
ttk.Label(main_frame, text="Select Image/Video:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
ttk.Entry(main_frame, textvariable=file_path_var, width=50).grid(row=0, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(main_frame, text="Browse", command=select_file).grid(row=0, column=2, padx=5, pady=5, sticky="w")

# 權重值選擇
ttk.Label(main_frame, text="Select Weight Value:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
ttk.Entry(main_frame, textvariable=weight_value_var, width=50).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
ttk.Button(main_frame, text="Browse", command=select_weight_file).grid(row=1, column=2, padx=5, pady=5, sticky="w")

# YOLO 計算按鈕
ttk.Button(main_frame, text="YOLO 辨識結果", command=perform_yolo).grid(row=2, column=1, padx=5, pady=5, sticky="ew")

# 圖像顯示
image_label = ttk.Label(main_frame)
image_label.grid(row=4, column=0, columnspan=3, padx=5, pady=5, sticky="nsew")

# 啟動主迴圈
root.mainloop()

1. 匯入模組

import tkinter as tk
from tkinter import filedialog, messagebox, ttk, simpledialog
import os
import shutil

這些匯入語句導入了 tkinter 模組中的不同組件以及一些標準 Python 庫,用於建立 GUI、處理文件對話框、顯示消息框、操作文件系統等。

2. YOLO 計算的假設函數

def yolo_calculate(image_path, weight_file_path):
    # 假設這是一個 YOLO 計算的函數
    # 這裡放置你的 YOLO 計算邏輯
    result_image_path = image_path  # 這是個假設,實際上應該返回處理過的圖片路徑
    return result_image_path

這是一個假設的 YOLO 計算函數。實際的 YOLO 計算邏輯應該放在這裡,當前它只是返回輸入的圖像路徑。

3. 選擇文件的函數

def select_file():
    file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.gif")])
    if file_path:
        file_path_var.set(file_path)

這個函數打開一個文件選擇對話框,讓用戶選擇一個圖像文件(限制為 .gif 格式)。選擇後,將文件路徑存儲在 file_path_var 變數中。

4. 選擇權重文件的函數

def select_weight_file():
    weight_file_path = filedialog.askopenfilename(filetypes=[("Weight Files", "*.weights")])
    if weight_file_path:
        weight_value_var.set(weight_file_path)

這個函數打開一個文件選擇對話框,讓用戶選擇一個權重文件(.weights 格式)。選擇後,將文件路徑存儲在 weight_value_var 變數中。

5. 執行 YOLO 計算的函數

def perform_yolo():
    file_path = file_path_var.get()
    weight_file_path = weight_value_var.get()

    result_image_path = yolo_calculate(file_path, weight_file_path)
    load_image(result_image_path)
    show_zebrafish_window()

這個函數會根據用戶選擇的圖像和權重文件路徑,執行 YOLO 計算,然後顯示處理後的圖像,並打開一個新的視窗進行斑馬魚行為分析。

6. 加載圖像的函數

def load_image(image_path):
    try:
        img = tk.PhotoImage(file=image_path)
        image_label.config(image=img)
        image_label.image = img
    except Exception as e:
        messagebox.showerror("錯誤", f"無法加載圖片: {e}")

這個函數試圖加載並顯示處理後的圖像。如果加載失敗,將顯示錯誤消息。

7. 顯示斑馬魚分析視窗的函數

def show_zebrafish_window():
    new_window = tk.Toplevel(root)
    new_window.title("斑馬魚分析")
    new_window.configure(bg='lightblue')
    
    # 設置新視窗的列和行,使其可以動態調整大小
    for i in range(2):
        new_window.grid_columnconfigure(i, weight=1)
    for i in range(4):  # 增加一行用來顯示下載按鈕
        new_window.grid_rowconfigure(i, weight=1)
    
    ttk.Button(new_window, text="斑馬魚運動軌跡影片", command=zebrafish_video).grid(row=0, column=0, columnspan=2, padx=10, pady=10, sticky="ew")

    ttk.Button(new_window, text="正常佔比", command=lambda: zebrafish_behavior("Normal")).grid(row=1, column=0, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="害怕佔比", command=lambda: zebrafish_behavior("Fear")).grid(row=1, column=1, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="焦慮佔比", command=lambda: zebrafish_behavior("Anxiety")).grid(row=2, column=0, padx=5, pady=5, sticky="ew")
    ttk.Button(new_window, text="壓抑佔比", command=lambda: zebrafish_behavior("Depression")).grid(row=2, column=1, padx=5, pady=5, sticky="ew")

    ttk.Button(new_window, text="下載影片", command=download_video).grid(row=3, column=0, columnspan=2, padx=10, pady=10, sticky="ew")

這個函數創建一個新的視窗,提供多個按鈕供用戶選擇,來計算並顯示斑馬魚的不同行為比例,並且增加了一個按鈕允許用戶下載影片。

8. 斑馬魚影片處理和行為分析的佔位函數

def zebrafish_video():
    messagebox.showinfo("斑馬魚影片", "斑馬魚運動軌跡計算完成。")

def zebrafish_behavior(behavior_type):
    messagebox.showinfo("斑馬魚行為", f"斑馬魚行為 ({behavior_type}) 計算完成。")

這些是用於斑馬魚影片處理和行為分析的佔位函數,當前只是顯示消息,實際的處理邏輯應該在這裡實現。

9. 下載影片的函數

def download_video():
    video_path = filedialog.asksaveasfilename(defaultextension=".mp4", filetypes=[("MP4 Files", "*.mp4")])
    if video_path:
        temp_video_path = "path_to_your_video.mp4"  # 替換為實際的影片路徑
        if os.path.exists(temp_video_path):
            try:
                shutil.copy(temp_video_path, video_path)
                messagebox.showinfo("成功", "影片已成功下載。")
            except Exception as e:
                messagebox.showerror("錯誤", f"下載影片時發生錯誤: {e}")
        else:
            messagebox.showerror("錯誤", "找不到影片文件。")

這個函數允許用戶下載影片。用戶可以選擇保存位置,如果影片存在,將其複製到用戶指定的位置;否則,顯示錯誤消息。

10. 主視窗的設置

root = tk.Tk()
root.title("YOLO 和 LSTM 圖形界面")
root.configure(bg='lightblue')

這段程式碼創建了主視窗,並設置了視窗的標題和背景顏色。

11. 主視窗內部的框架和控件設置

# 創建框架和設置控件

這些代碼設置了主視窗內的布局和各種控件,包括文件選擇、權重選擇以及 YOLO 計算按鈕等。

12. 啟動主迴圈

root.mainloop()

最後,這行程式碼啟動了 GUI 的主事件循環,使得視窗可以保持顯示並回應用戶的操作。


上一篇
day 11 yolo 辨識養殖豬隻系統
下一篇
Day 13 yolo四隻斑馬魚辨識行為
系列文
基於人工智慧與深度學習對斑馬魚做行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言