정보통신기술(ICT)

조화진동자의 시간 진화 함수 그래프

해머슴 2024. 10. 21. 10:48
import tkinter as tk
from tkinter import messagebox, ttk
import matplotlib.pyplot as plt

# 데이터 리스트 초기화
time = []
input_values = []
output_values = []

# 데이터 추가 함수
def add_data():
    try:
        t = float(entry_time.get())
        input_val = float(entry_input.get())
        output_val = float(entry_output.get())

        # 데이터 추가
        time.append(t)
        input_values.append(input_val)
        output_values.append(output_val)

        # 입력 필드 초기화
        entry_time.delete(0, tk.END)
        entry_input.delete(0, tk.END)
        entry_output.delete(0, tk.END)

        # 테이블에 데이터 추가
        tree.insert("", tk.END, values=(t, input_val, output_val))

        # 데이터가 추가되었다는 메시지 표시
        messagebox.showinfo("성공", "데이터가 추가되었습니다.")
    except ValueError:
        messagebox.showerror("입력 오류", "숫자를 입력하세요.")

# 그래프 표시 함수
def show_graph():
    if len(time) == 0:
        messagebox.showwarning("데이터 없음", "입력된 데이터가 없습니다.")
        return

    # 그래프 그리기
    plt.figure()  # 새로운 Figure를 생성하여 중복 그래프를 방지
    plt.plot(time, input_values, label='Input', color='b', marker='o')
    plt.plot(time, output_values, label='Output', color='r', linestyle='--', marker='x')

    # 그래프 제목 및 레이블 설정
    plt.title('Graph of Input and Output Over Time')
    plt.xlabel('Time')
    plt.ylabel('Values')

    # 범례 추가
    plt.legend()
    plt.grid(True)

    # 그래프 표시
    plt.show()

# 데이터 초기화 함수
def clear_data():
    global time, input_values, output_values
    time.clear()
    input_values.clear()
    output_values.clear()
    tree.delete(*tree.get_children())
    messagebox.showinfo("초기화", "데이터가 초기화되었습니다.")

# 메인 윈도우 설정
root = tk.Tk()
root.title("데이터 입력 및 그래프 표시")
root.geometry("400x400")  # 창 크기 설정

# 입력 필드 및 레이블
label_time = tk.Label(root, text="시간:")
label_time.grid(row=0, column=0, padx=10, pady=5)
entry_time = tk.Entry(root)
entry_time.grid(row=0, column=1, padx=10, pady=5)

label_input = tk.Label(root, text="입력값:")
label_input.grid(row=1, column=0, padx=10, pady=5)
entry_input = tk.Entry(root)
entry_input.grid(row=1, column=1, padx=10, pady=5)

label_output = tk.Label(root, text="출력값:")
label_output.grid(row=2, column=0, padx=10, pady=5)
entry_output = tk.Entry(root)
entry_output.grid(row=2, column=1, padx=10, pady=5)

# 버튼 추가
button_add = tk.Button(root, text="데이터 추가", command=add_data)
button_add.grid(row=3, column=0, columnspan=2, pady=10)

button_show = tk.Button(root, text="그래프 표시", command=show_graph)
button_show.grid(row=4, column=0, columnspan=2, pady=5)

button_clear = tk.Button(root, text="데이터 초기화", command=clear_data)
button_clear.grid(row=5, column=0, columnspan=2, pady=5)

# 데이터 확인용 테이블
columns = ("시간", "입력값", "출력값")
tree = ttk.Treeview(root, columns=columns, show='headings')
tree.heading("시간", text="시간")
tree.heading("입력값", text="입력값")
tree.heading("출력값", text="출력값")
tree.grid(row=6, column=0, columnspan=2, padx=10, pady=10)

# 메인 루프 실행
root.mainloop()