import tkinter.messagebox as msgbox
import tkinter as tk
from numpy import array
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
from copy import deepcopy


N=0
A = []
L = []
U = []
I = []
B = []
temp = []
x = []
y = []

def resize(N):  # 테이블 재할당
    global A, L, U, temp, x, y
    A = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    L = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    U = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    temp = [deepcopy(0) for _ in range(N)]
    x = [deepcopy(0) for _ in range(N)]
    y = [deepcopy(0) for _ in range(N)]


root=Tk()
root.title("LU 분해법_1724572_안주형")
root.geometry("640x480+300+100") #가로*세로+x좌표+y좌표
root.resizable(False,False) #x,y너비 변경불가 (창크기 변경불가)


def result(): #결과 버튼 눌렸을때 동작하는 함수

    msgbox.showinfo("알림","정상적으로 출력했습니다")
    N=len(A)
    for i in range(N):  # 대각행렬 만들기
        for k in range(N):
            if i == k:
                temp[k] = 1
            else:
                temp[k] = 0

        I.append(deepcopy(temp))

    L = deepcopy(I)
    U = deepcopy(A)

    for i in range(0, N - 1):  # LU분해
        for k in range(i + 1, N):
            L[k][i] = U[k][i] / U[i][i]
        for k in range(i + 1, N):
            for z in range(i, N):
                U[k][z] = U[k][z] - L[k][i] * U[i][z]

    root.text = Text(root)
    root.text.insert(END,str('--------L행렬-------- \n'))
    root.text.insert(END,'\n')
    L=array(L)

    for i in range(N):  #L행렬 출력
        for k in range(N):
            root.text.insert(END,'%6s' % str(L[i][k]) + ' ')
        root.text.insert(END,'\n')
    root.text.insert(END, '\n')
    root.text.insert(END,str('--------U행렬-------- \n'))


    for i in range(N):  #U행렬 출력
        for k in range(N):
            root.text.insert(END,'%6s' % str(U[i][k]) + ' ')
        root.text.insert(END,'\n')
    root.text.insert(END, '\n')

    for i in range(N):  # 해 구하기
        y[i] = B[i]
        for k in range(i):
            y[i] = y[i] - (L[i][k] * y[k])
        y[i] = y[i] / L[i][i]

    for i in range(N - 1, -1, -1):
        x[i] = y[i]
        for k in range(i + 1, N):
            x[i] = x[i] - U[i][k] * x[k]
        x[i] = x[i] / U[i][i]

    root.text.insert(END,'\n --------해 출력--------\n')
    root.text.insert(END, '\n')


    for i in range(N):
        root.text.insert(END,"x[" + str(i + 1) + "] = " + str(x[i])+'\n')

    root.text.configure(state='disabled')
    root.text.pack()


def open_file(): #파일 불러오기 함수

        file=filedialog.askopenfile(parent=root,mode='rb',title="파일을 불러오세요")
        lines = file.readlines()
        N = int(lines[0].strip().split()[0])

        resize(N)

        for i, line in enumerate(lines):
            if i == 0:
                continue
            items = list(map(int, line.strip().split()))
            for k in range(len(items)):
                if k == N:
                    B.append(items[k])
                else:
                    A[i - 1][k] = items[k]

        file.close()

def save_file(): #파일 저장하기 함수
    file= filedialog.asksaveasfile(mode='w', defaultextension=".txt",initialfile="LU_Output")
    text2save = str(root.text.get(0.0, END))
    file.write(text2save)
    file.close

#메뉴 영역
menu=Menu(root)
menu_file=Menu(menu,tearoff=0)
menu_file.add_command(label="파일 불러오기",command=open_file)
menu_file.add_command(label="파일 저장하기",command=save_file)
menu_file.add_separator()
menu_file.add_command(label="끝내기",command=root.quit)
menu.add_cascade(label="파일",menu=menu_file)

#본문 영역
btn1=Button(root,command=result,padx=5,pady=15,text="LU 분해법 진행하기").pack()
label=ttk.Label(root, text="1.파일을 불러온다.",font=("Times",14)).pack()
label=ttk.Label(root, text="2.위 LU 분해법 진행하기 버튼을 누른다.",font=("Times",14)).pack()
label=ttk.Label(root, text="3.저장은 자동으로 .txt 형식으로 저장되므로 파일이름만 정해준다.",font=("Times",14)).pack()
root.config(menu=menu)
root.mainloop()



import tkinter.messagebox as msgbox
import tkinter as tk
from numpy import array
from tkinter import *
from tkinter import filedialog
from tkinter import ttk
from copy import deepcopy


N=0
A = []
L = []
U = []
I = []
B = []
temp = []
x = []
y = []

def resize(N):  # 테이블 재할당
    global A, L, U, temp, x, y
    A = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    L = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    U = [deepcopy([0 for _ in range(N)]) for _ in range(N)]
    temp = [deepcopy(0) for _ in range(N)]
    x = [deepcopy(0) for _ in range(N)]
    y = [deepcopy(0) for _ in range(N)]


root=Tk()
root.title("LU 분해법_1724572_안주형")
root.geometry("640x480+300+100") #가로*세로+x좌표+y좌표
root.resizable(False,False) #x,y너비 변경불가 (창크기 변경불가)


def result(): #결과 버튼 눌렸을때 동작하는 함수

    msgbox.showinfo("알림","정상적으로 출력했습니다")
    N=len(A)
    for i in range(N):  # 대각행렬 만들기
        for k in range(N):
            if i == k:
                temp[k] = 1
            else:
                temp[k] = 0

        I.append(deepcopy(temp))

    L = deepcopy(I)
    U = deepcopy(A)

    for i in range(0, N - 1):  # LU분해
        for k in range(i + 1, N):
            L[k][i] = U[k][i] / U[i][i]
        for k in range(i + 1, N):
            for z in range(i, N):
                U[k][z] = U[k][z] - L[k][i] * U[i][z]

    root.text = Text(root)
    root.text.insert(END,str('--------L행렬-------- \n'))
    root.text.insert(END,'\n')
    L=array(L)

    for i in range(N):  #L행렬 출력
        for k in range(N):
            root.text.insert(END,'%6s' % str(L[i][k]) + ' ')
        root.text.insert(END,'\n')
    root.text.insert(END, '\n')
    root.text.insert(END,str('--------U행렬-------- \n'))


    for i in range(N):  #U행렬 출력
        for k in range(N):
            root.text.insert(END,'%6s' % str(U[i][k]) + ' ')
        root.text.insert(END,'\n')
    root.text.insert(END, '\n')

    for i in range(N):  # 해 구하기
        y[i] = B[i]
        for k in range(i):
            y[i] = y[i] - (L[i][k] * y[k])
        y[i] = y[i] / L[i][i]

    for i in range(N - 1, -1, -1):
        x[i] = y[i]
        for k in range(i + 1, N):
            x[i] = x[i] - U[i][k] * x[k]
        x[i] = x[i] / U[i][i]

    root.text.insert(END,'\n --------해 출력--------\n')
    root.text.insert(END, '\n')


    for i in range(N):
        root.text.insert(END,"x[" + str(i + 1) + "] = " + str(x[i])+'\n')

    root.text.configure(state='disabled')
    root.text.pack()


def open_file(): #파일 불러오기 함수

        file=filedialog.askopenfile(parent=root,mode='rb',title="파일을 불러오세요")
        lines = file.readlines()
        N = int(lines[0].strip().split()[0])

        resize(N)

        for i, line in enumerate(lines):
            if i == 0:
                continue
            items = list(map(int, line.strip().split()))
            for k in range(len(items)):
                if k == N:
                    B.append(items[k])
                else:
                    A[i - 1][k] = items[k]

        file.close()

def save_file(): #파일 저장하기 함수
    file= filedialog.asksaveasfile(mode='w', defaultextension=".txt",initialfile="LU_Output")
    text2save = str(root.text.get(0.0, END))
    file.write(text2save)
    file.close

#메뉴 영역
menu=Menu(root)
menu_file=Menu(menu,tearoff=0)
menu_file.add_command(label="파일 불러오기",command=open_file)
menu_file.add_command(label="파일 저장하기",command=save_file)
menu_file.add_separator()
menu_file.add_command(label="끝내기",command=root.quit)
menu.add_cascade(label="파일",menu=menu_file)

#본문 영역
btn1=Button(root,command=result,padx=5,pady=15,text="LU 분해법 진행하기").pack()
label=ttk.Label(root, text="1.파일을 불러온다.",font=("Times",14)).pack()
label=ttk.Label(root, text="2.위 LU 분해법 진행하기 버튼을 누른다.",font=("Times",14)).pack()
label=ttk.Label(root, text="3.저장은 자동으로 .txt 형식으로 저장되므로 파일이름만 정해준다.",font=("Times",14)).pack()
root.config(menu=menu)
root.mainloop()



# 테이블 재할당 #가로*세로+x좌표+y좌표 #x,y너비 변경불가 (창크기 변경불가) #결과 버튼 눌렸을때 동작하는 함수 # 대각행렬 만들기 # LU분해 #L행렬 출력 #U행렬 출력 # 해 구하기 #파일 불러오기 함수 #파일 저장하기 함수 #메뉴 영역 #본문 영역