정보통신기술(ICT)

협동형 로봇 작업 시뮬레이션

해머슴 2024. 11. 22. 18:53
import tkinter as tk
from tkinter import messagebox
import time
import threading

class FactorySimulation:
    def __init__(self, master):
        self.master = master
        self.master.title("협동형 로봇 작업 시뮬레이션")
        self.master.geometry("500x400")

        self.robot_count = tk.IntVar(value=2)
        self.workload = tk.IntVar(value=0)
        self.progress = {}

        # GUI 구성
        tk.Label(master, text="로봇 수 (2~4):").pack(pady=5)
        tk.Entry(master, textvariable=self.robot_count).pack(pady=5)

        tk.Label(master, text="작업량 (부품 수):").pack(pady=5)
        tk.Entry(master, textvariable=self.workload).pack(pady=5)

        self.start_button = tk.Button(master, text="작업 시작", command=self.start_simulation)
        self.start_button.pack(pady=10)

        self.reset_button = tk.Button(master, text="초기화", command=self.reset_simulation)
        self.reset_button.pack(pady=5)

        self.status_frame = tk.Frame(master)
        self.status_frame.pack(pady=10, fill="both", expand=True)

    def start_simulation(self):
        robot_count = self.robot_count.get()
        workload = self.workload.get()

        if not (2 <= robot_count <= 4):
            messagebox.showerror("입력 오류", "로봇 수는 2에서 4 사이여야 합니다.")
            return

        if workload <= 0:
            messagebox.showerror("입력 오류", "작업량은 1 이상이어야 합니다.")
            return

        # 초기화
        self.reset_simulation()

        # 작업 상태 표시 초기화
        for i in range(1, robot_count + 1):
            progress_label = tk.Label(self.status_frame, text=f"로봇 {i}: 대기 중")
            progress_label.pack(pady=2)
            self.progress[i] = progress_label

        # 작업 시작 (스레드로 작업 처리)
        threading.Thread(target=self.run_simulation, args=(robot_count, workload)).start()

    def run_simulation(self, robot_count, workload):
        tasks_per_robot = workload // robot_count
        extra_tasks = workload % robot_count

        for robot in range(1, robot_count + 1):
            tasks = tasks_per_robot + (1 if robot <= extra_tasks else 0)
            self.progress[robot].config(text=f"로봇 {robot}: 작업 시작 (총 {tasks}개)")
            for task in range(1, tasks + 1):
                time.sleep(0.5)  # 작업 소요 시간 시뮬레이션
                self.progress[robot].config(text=f"로봇 {robot}: {task}/{tasks} 작업 완료")
            self.progress[robot].config(text=f"로봇 {robot}: 작업 완료")

    def reset_simulation(self):
        for widget in self.status_frame.winfo_children():
            widget.destroy()
        self.progress.clear()

# GUI 실행
if __name__ == "__main__":
    root = tk.Tk()
    app = FactorySimulation(root)
    root.mainloop()