본문 바로가기

PYTHON-BACK

#파이썬 도서관 출납 시스템_18일차_var. 0.2.0

728x90
var. 0.2.0

 

  • tkinter를 사용해서 GUI를 추가
    처음 만들었을때 UI가 중구난방으로 위치해서 화면 중앙에 고정을 하고 싶었는데, 해당 내용을 잘 모르겠어서 인터넷 클론코딩을 통해서 해결함 (center_window)
  •  UI 크기를 맞출때 하나하나 실행해보면서 맞추는 것에 있어서 좀 더 효과적인 방법을 찾아보고 싶은 생각을 하게됨(버튼 크기와 위치가 내가 원하는데로 가는게 좀 어려움..)
  • 카테고리 관리, 출판사 관리를 통해서 추가/삭제를 진행해도 도서추가와는 관련이 없게 설정해서, 다음 버전에서는 이를 수정해서 따로 저장된 카테고리를 도서 추가쪽에 불러오는 식으로 수정할 필요가 보임
  • 이번 버전에서는 txt 파일 보다는 csv파일을 이용해서 파일 읽고 쓰는걸로 대체해서 진행
  • 주석의 경우 chatgpt를 이용해서 추가

main.py

  • 역할: 프로그램의 시작 화면을 설정
  • manage_boosk.py
    • 역할: 도서 정보 관리
      • 도서 추가 : 새로운 도서 추가하는 창
      • 도서 삭제 : 선택한 도서 삭제, ISBN 기준
      • 도서 검색 : 도서 검색 기능
      • 관리 창 : 도서 관리 기능
  • manage_members.py
    • 역할: 회원 정보를 관리
      • 회원 추가 : 새로운 회원 추가 창
      • 회원 삭제 : 선택한 회원 삭제
      • 회원 검색 : 회원 정보 검색 기능
      • 관리 창 : 회원 관리 기능
  • manage_boorrow_records.py
    • 역할: 대출 기록 관리
      • 대출 기록 추가 : 새로운 대출기록 추가 창
      • 대출 기록 삭제 : 선택한 대출기록 삭제
      • 대출 기록 검색 : 대출기록 검색 기능
      • 관리 창 : 대출 기록 관리 기능
  • manage_categories.py
    • 역할: 도서 카테고리 관리
      • 카테고리 추가 : 카테고리 추가 창
      • 카테고리 삭제 : 선택한 카테고리 삭제
  • manage_publishers.py
    • 역할: 출판사 정보 관리
      • 출판사 추가 : 새출판사 추가 창
      • 출판사 삭제 : 선택한 출판사 삭제
  • 각각 뒤로가기 버튼을 추가해서 뒤로가기 기능 제공

첫 동작 UI


코드

 

# main.py

import tkinter as tk
import manage_books
import manage_members
import manage_borrow_records

def center_window(window, width, height):
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def open_books():
    manage_books.manageBooks(root)

def open_members():
    manage_members.manageMembers(root)

def open_borrow_records():
    manage_borrow_records.manageBorrowRecords(root)

def main():
    global root
    root = tk.Tk()
    root.title("도서관리 프로그램 ver. 0.1.0")
    center_window(root, 600, 400)  # 메인 사이즈

    tk.Label(root, text="도서관리 프로그램 ver. 0.1.0", font=("Arial", 24)).pack(pady=10)
    # 버튼 추가
    tk.Button(root, text="도서정보 관리", command=open_books, width=30, height=3).pack(pady=10)
    tk.Button(root, text="회원 정보 관리", command=open_members, width=30, height=3).pack(pady=10)
    tk.Button(root, text="대출 기록 관리", command=open_borrow_records, width=30, height=3).pack(pady=10)
    tk.Button(root, text="종료", command=root.quit, width=30, height=3).pack(pady=10)

    root.mainloop()

if __name__ == '__main__':
    main()

 

# manage_books.py
import tkinter as tk
from tkinter import simpledialog, messagebox
import csv
import manage_categories
import manage_publishers

BOOKS_FILE = './csv/books.csv'

def center_window(window, width, height):
    # 윈도우의 중앙에 위치시키기 위한 함수
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def addBook():
    def save_book():
        # 책 정보를 CSV 파일에 추가하는 함수
        title = entry_title.get()
        author = entry_author.get()
        publisher = entry_publisher.get()
        isbn = entry_isbn.get()
        year = entry_year.get()
        category = entry_category.get()

        with open(BOOKS_FILE, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([isbn, title, author, publisher, year, category])

        messagebox.showinfo("정보", f"도서 '{title}'이(가) 추가되었습니다.")
        add_book_window.destroy()

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        add_book_window.destroy()

    # 책 추가를 위한 새 창 생성
    add_book_window = tk.Toplevel()
    add_book_window.title("도서 추가")
    center_window(add_book_window, 210, 200) # 창을 화면 중앙에 배치

    # 입력 필드와 레이블 생성
    tk.Label(add_book_window, text="도서명").grid(row=0, column=0)
    entry_title = tk.Entry(add_book_window)
    entry_title.grid(row=0, column=1)

    tk.Label(add_book_window, text="저자명").grid(row=1, column=0)
    entry_author = tk.Entry(add_book_window)
    entry_author.grid(row=1, column=1)

    tk.Label(add_book_window, text="출판사").grid(row=2, column=0)
    entry_publisher = tk.Entry(add_book_window)
    entry_publisher.grid(row=2, column=1)

    tk.Label(add_book_window, text="ISBN").grid(row=3, column=0)
    entry_isbn = tk.Entry(add_book_window)
    entry_isbn.grid(row=3, column=1)

    tk.Label(add_book_window, text="발행년도").grid(row=4, column=0)
    entry_year = tk.Entry(add_book_window)
    entry_year.grid(row=4, column=1)

    tk.Label(add_book_window, text="카테고리").grid(row=5, column=0)
    entry_category = tk.Entry(add_book_window)
    entry_category.grid(row=5, column=1)

    # 버튼 추가
    tk.Button(add_book_window, text="저장", command=save_book, width=8, height=1).grid(row=6, columnspan=2)
    tk.Button(add_book_window, text="뒤로가기", command=go_back, width=8, height=1).grid(row=7, columnspan=2)

def delBook():
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        del_book_window.destroy()

    # 삭제할 책의 ISBN을 입력받아 삭제
    isbn_to_delete = simpledialog.askstring("도서 삭제", "삭제할 도서의 ISBN:")
    if isbn_to_delete:
        # 기존 책 목록을 읽어와서 삭제할 ISBN을 가진 항목 제외
        with open(BOOKS_FILE, 'r') as file:
            lines = list(csv.reader(file))

        with open(BOOKS_FILE, 'w', newline='') as file:
            writer = csv.writer(file)
            for line in lines:
                if line[0] != isbn_to_delete:
                    writer.writerow(line)

        messagebox.showinfo("정보", f"도서 ISBN '{isbn_to_delete}'이(가) 삭제되었습니다.")

     # 책 삭제를 위한 새 창 생성
    del_book_window = tk.Toplevel()
    del_book_window.title("도서 삭제")
    center_window(del_book_window, 300, 200) # 창을 화면 중앙에 배치

    tk.Button(del_book_window, text="뒤로가기", command=go_back).pack()

def searchBook():
    def search():
        # 검색 쿼리를 입력받아 책 정보를 찾고 결과를 표시
        query = entry_query.get().lower()
        result_text.delete(1.0, tk.END)
        with open(BOOKS_FILE, 'r') as file:
            reader = csv.reader(file)
            for line in reader:
                if menu_var.get() == "도서명" and query in line[1].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "저자명" and query in line[2].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "출판사" and query in line[3].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "ISBN" and query in line[0]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "발행년도" and query in line[4]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "카테고리" and query in line[5].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        search_book_window.destroy()

     # 책 검색을 위한 새 창 생성
    search_book_window = tk.Toplevel()
    search_book_window.title("도서 검색")
    center_window(search_book_window, 580, 350)  # 창을 화면 중앙에 배치

    # 검색 조건을 선택할 수 있는 드롭다운 메뉴와 검색 입력 필드
    menu_var = tk.StringVar(value="도서명")
    options = ["도서명", "저자명", "출판사", "ISBN", "발행년도", "카테고리"]
    tk.OptionMenu(search_book_window, menu_var, *options).grid(row=0, column=0)
    entry_query = tk.Entry(search_book_window)
    entry_query.grid(row=0, column=1)
    tk.Button(search_book_window, text="검색", command=search).grid(row=0, column=2)

    # 검색 결과를 표시할 텍스트 영역
    result_text = tk.Text(search_book_window, width=80, height=20)
    result_text.grid(row=1, columnspan=3)

    tk.Button(search_book_window, text="뒤로가기", command=go_back).grid(row=2, columnspan=3)

def manageBooks(root):
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        manage_books_window.destroy()

    # 책 관리 기능을 제공하는 새 창 생성
    manage_books_window = tk.Toplevel(root)
    manage_books_window.title("도서정보 관리")
    center_window(manage_books_window, 400, 300)  # 창을 화면 중앙에 배치

    # 책 추가, 삭제, 검색 버튼 추가
    tk.Button(manage_books_window, text="도서 추가", command=addBook).pack(pady=5)
    tk.Button(manage_books_window, text="도서 삭제", command=delBook).pack(pady=5)
    tk.Button(manage_books_window, text="도서 검색", command=searchBook).pack(pady=5)
    tk.Button(manage_books_window, text="카테고리 관리", command=manage_categories.manageCategories).pack(pady=5)
    tk.Button(manage_books_window, text="출판사 관리", command=manage_publishers.managePublishers).pack(pady=5)
    tk.Button(manage_books_window, text="뒤로가기", command=go_back).pack(pady=5)

 

# manage_borrow_records.py
import tkinter as tk
from tkinter import simpledialog, messagebox
import csv

BORROW_RECORDS_FILE = './csv/borrow_records.csv'

def center_window(window, width, height):
     # 윈도우의 중앙에 위치시키기 위한 함수
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def addBorrowRecord():
    def save_record():
        # 대출 기록을 CSV 파일에 추가하는 함수
        isbn = entry_isbn.get()
        member_id = entry_member_id.get()
        borrow_date = entry_borrow_date.get()
        return_date = entry_return_date.get()

        with open(BORROW_RECORDS_FILE, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([isbn, member_id, borrow_date, return_date])

        messagebox.showinfo("정보", "대출 기록이 추가되었습니다.")
        add_record_window.destroy()

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        add_record_window.destroy()

    # 대출 기록 추가를 위한 새 창 생성
    add_record_window = tk.Toplevel()
    add_record_window.title("대출 기록 추가")
    center_window(add_record_window, 200, 150)  # 창을 화면 중앙에 배치

    # 입력 필드와 레이블 생성
    tk.Label(add_record_window, text="ISBN").grid(row=0, column=0)
    entry_isbn = tk.Entry(add_record_window)
    entry_isbn.grid(row=0, column=1)

    tk.Label(add_record_window, text="회원 ID").grid(row=1, column=0)
    entry_member_id = tk.Entry(add_record_window)
    entry_member_id.grid(row=1, column=1)

    tk.Label(add_record_window, text="대출일").grid(row=2, column=0)
    entry_borrow_date = tk.Entry(add_record_window)
    entry_borrow_date.grid(row=2, column=1)

    tk.Label(add_record_window, text="반납일").grid(row=3, column=0)
    entry_return_date = tk.Entry(add_record_window)
    entry_return_date.grid(row=3, column=1)

    # 버튼 추가
    tk.Button(add_record_window, text="저장", command=save_record, width=8, height=1).grid(row=4, columnspan=2)
    tk.Button(add_record_window, text="뒤로가기", command=go_back, width=8, height=1).grid(row=5, columnspan=2)

def delBorrowRecord():
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        del_record_window.destroy()

    # 삭제할 대출 기록의 ISBN을 입력받아 삭제
    isbn_to_delete = simpledialog.askstring("대출 기록 삭제", "삭제할 대출 기록의 ISBN:")
    if isbn_to_delete:
        # 기존 대출 기록을 읽어와서 삭제할 ISBN을 가진 항목 제외
        with open(BORROW_RECORDS_FILE, 'r') as file:
            lines = list(csv.reader(file))

        with open(BORROW_RECORDS_FILE, 'w', newline='') as file:
            writer = csv.writer(file)
            for line in lines:
                if line[0] != isbn_to_delete:
                    writer.writerow(line)

        messagebox.showinfo("정보", f"대출 기록 ISBN '{isbn_to_delete}'이(가) 삭제되었습니다.")

    # 대출 기록 삭제를 위한 새 창 생성
    del_record_window = tk.Toplevel()
    del_record_window.title("대출 기록 삭제")
    center_window(del_record_window, 300, 200) # 창을 화면 중앙에 배치

    tk.Button(del_record_window, text="뒤로가기", command=go_back).pack()

def searchBorrowRecord():
    def search():
        # 검색 쿼리를 입력받아 대출 기록을 찾고 결과를 표시
        query = entry_query.get().lower()
        result_text.delete(1.0, tk.END)
        with open(BORROW_RECORDS_FILE, 'r') as file:
            reader = csv.reader(file)
            for line in reader:
                if menu_var.get() == "ISBN" and query in line[0]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "회원 ID" and query in line[1]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "대출일" and query in line[2]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "반납일" and query in line[3]:
                    result_text.insert(tk.END, ','.join(line) + '\n')

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        search_record_window.destroy()

    # 대출 기록 검색을 위한 새 창 생성
    search_record_window = tk.Toplevel()
    search_record_window.title("대출 기록 검색")
    center_window(search_record_window, 580, 350)  # 창을 화면 중앙에 배치

    # 검색 조건을 선택할 수 있는 드롭다운 메뉴와 검색 입력 필드
    menu_var = tk.StringVar(value="ISBN")
    options = ["ISBN", "회원 ID", "대출일", "반납일"]
    tk.OptionMenu(search_record_window, menu_var, *options).grid(row=0, column=0)
    entry_query = tk.Entry(search_record_window)
    entry_query.grid(row=0, column=1)
    tk.Button(search_record_window, text="검색", command=search).grid(row=0, column=2)

     # 검색 결과를 표시할 텍스트 영역
    result_text = tk.Text(search_record_window, width=80, height=20)
    result_text.grid(row=1, columnspan=3)

    tk.Button(search_record_window, text="뒤로가기", command=go_back).grid(row=2, columnspan=3)

def manageBorrowRecords(root):
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        manage_borrow_records_window.destroy()

    # 대출 기록 관리 기능을 제공하는 새 창 생성
    manage_borrow_records_window = tk.Toplevel(root)
    manage_borrow_records_window.title("대출 기록 관리")
    center_window(manage_borrow_records_window, 400, 300) # 창을 화면 중앙에 배치

     # 대출 기록 추가, 삭제, 검색 버튼
    tk.Button(manage_borrow_records_window, text="대출 기록 추가", command=addBorrowRecord).pack(pady=5)
    tk.Button(manage_borrow_records_window, text="대출 기록 삭제", command=delBorrowRecord).pack(pady=5)
    tk.Button(manage_borrow_records_window, text="대출 기록 검색", command=searchBorrowRecord).pack(pady=5)
    tk.Button(manage_borrow_records_window, text="뒤로가기", command=go_back).pack(pady=5)

 

# manage_categories.py
import tkinter as tk
from tkinter import simpledialog, messagebox
import csv

CATEGORIES_FILE = './csv/categories.csv'

def center_window(window, width, height):
    # 창을 화면 중앙에 배치하는 함수
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def addCategory():
    def save_category():
        # 카테고리를 파일에 저장하는 함수
        category = entry_category.get()
        with open(CATEGORIES_FILE, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([category])
        messagebox.showinfo("정보", f"카테고리 '{category}'이(가) 추가되었습니다.")
        add_category_window.destroy()

    def go_back():
        # 뒤로가기 버튼 동작 정의
        add_category_window.destroy()

    # 카테고리 추가 창 생성
    add_category_window = tk.Toplevel()
    add_category_window.title("카테고리 추가")
    center_window(add_category_window, 225, 100)  # 카테고리 추가 창 크기 및 중앙 배치

    # 위젯 배치
    tk.Label(add_category_window, text="카테고리명").grid(row=0, column=0)
    entry_category = tk.Entry(add_category_window)
    entry_category.grid(row=0, column=1)

    tk.Button(add_category_window, text="저장", command=save_category).grid(row=1, columnspan=2)
    tk.Button(add_category_window, text="뒤로가기", command=go_back).grid(row=2, columnspan=2)

def delCategory():
    def go_back():
        # 뒤로가기 버튼 동작 정의
        del_category_window.destroy()

    # 삭제할 카테고리명 입력 받기
    category_to_delete = simpledialog.askstring("카테고리 삭제", "삭제할 카테고리명:")
    if category_to_delete:
        # 카테고리 파일에서 해당 카테고리를 삭제
        with open(CATEGORIES_FILE, 'r') as file:
            lines = list(csv.reader(file))

        with open(CATEGORIES_FILE, 'w', newline='') as file:
            writer = csv.writer(file)
            for line in lines:
                if line[0] != category_to_delete:
                    writer.writerow(line)

        messagebox.showinfo("정보", f"카테고리 '{category_to_delete}'이(가) 삭제되었습니다.")

    # 카테고리 삭제 창 생성
    del_category_window = tk.Toplevel()
    del_category_window.title("카테고리 삭제")
    center_window(del_category_window, 300, 200)  # 카테고리 삭제 창 크기 및 중앙 배치

    tk.Button(del_category_window, text="뒤로가기", command=go_back).pack()

def manageCategories():
    # 카테고리 관리 창 생성
    manage_categories_window = tk.Toplevel()
    manage_categories_window.title("카테고리 관리")
    center_window(manage_categories_window, 400, 300)  # 카테고리 관리 창 크기 및 중앙 배치

    # 위젯 배치
    tk.Button(manage_categories_window, text="카테고리 추가", command=addCategory).pack(pady=5)
    tk.Button(manage_categories_window, text="카테고리 삭제", command=delCategory).pack(pady=5)
    tk.Button(manage_categories_window, text="뒤로가기", command=manage_categories_window.destroy).pack(pady=5)

 

# manage_members.py
import tkinter as tk
from tkinter import simpledialog, messagebox
import csv

MEMBERS_FILE = './csv/members.csv'

def center_window(window, width, height):
    # 윈도우의 중앙에 위치시키기 위한 함수
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def addMember():
    def save_member():
        # 회원 정보를 CSV 파일에 추가하는 함수
        member_id = entry_member_id.get()
        name = entry_name.get()
        email = entry_email.get()

        with open(MEMBERS_FILE, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([member_id, name, email])

        messagebox.showinfo("정보", f"회원 '{name}'이(가) 추가되었습니다.")
        add_member_window.destroy()

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        add_member_window.destroy()

    # 회원 추가를 위한 새 창 생성
    add_member_window = tk.Toplevel()
    add_member_window.title("회원 추가")
    center_window(add_member_window, 400, 300)  # 창을 화면 중앙에 배치

    # 입력 필드와 레이블 생
    tk.Label(add_member_window, text="회원 ID").grid(row=0, column=0)
    entry_member_id = tk.Entry(add_member_window)
    entry_member_id.grid(row=0, column=1)

    tk.Label(add_member_window, text="이름").grid(row=1, column=0)
    entry_name = tk.Entry(add_member_window)
    entry_name.grid(row=1, column=1)

    tk.Label(add_member_window, text="이메일").grid(row=2, column=0)
    entry_email = tk.Entry(add_member_window)
    entry_email.grid(row=2, column=1)

    # 버튼 추가
    tk.Button(add_member_window, text="저장", command=save_member, width=8, height=1).grid(row=3, columnspan=2)
    tk.Button(add_member_window, text="뒤로가기", command=go_back, width=8, height=1).grid(row=4, columnspan=2)

def delMember():
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        del_member_window.destroy()

    # 삭제할 회원의 ID를 입력받아 삭제
    member_id_to_delete = simpledialog.askstring("회원 삭제", "삭제할 회원의 ID:")
    if member_id_to_delete:
        # 기존 회원 목록을 읽어와서 삭제할 ID를 가진 항목 제외
        with open(MEMBERS_FILE, 'r') as file:
            lines = list(csv.reader(file))

        with open(MEMBERS_FILE, 'w', newline='') as file:
            writer = csv.writer(file)
            for line in lines:
                if line[0] != member_id_to_delete:
                    writer.writerow(line)

        messagebox.showinfo("정보", f"회원 ID '{member_id_to_delete}'이(가) 삭제되었습니다.")

     # 회원 삭제를 위한 새 창 생성
    del_member_window = tk.Toplevel()
    del_member_window.title("회원 삭제")
    center_window(del_member_window, 300, 200)   # 창을 화면 중앙에 배치

    tk.Button(del_member_window, text="뒤로가기", command=go_back).pack()

def searchMember():
    def search():
        # 검색 쿼리를 입력받아 회원 정보를 찾고 결과를 표시
        query = entry_query.get().lower()
        result_text.delete(1.0, tk.END)
        with open(MEMBERS_FILE, 'r') as file:
            reader = csv.reader(file)
            for line in reader:
                if menu_var.get() == "회원 ID" and query in line[0]:
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "이름" and query in line[1].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')
                elif menu_var.get() == "이메일" and query in line[2].lower():
                    result_text.insert(tk.END, ','.join(line) + '\n')

    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        search_member_window.destroy()

     # 회원 검색을 위한 새 창 생성
    search_member_window = tk.Toplevel()
    search_member_window.title("회원 검색")
    center_window(search_member_window, 580, 350) # 창을 화면 중앙에 배

    # 검색 조건을 선택할 수 있는 드롭다운 메뉴와 검색 입력 필드
    menu_var = tk.StringVar(value="회원 ID")
    options = ["회원 ID", "이름", "이메일"]
    tk.OptionMenu(search_member_window, menu_var, *options).grid(row=0, column=0)
    entry_query = tk.Entry(search_member_window)
    entry_query.grid(row=0, column=1)
    tk.Button(search_member_window, text="검색", command=search).grid(row=0, column=2)

    # 검색 결과를 표시할 텍스트 영역
    result_text = tk.Text(search_member_window, width=80, height=20)
    result_text.grid(row=1, columnspan=3)

    tk.Button(search_member_window, text="뒤로가기", command=go_back).grid(row=2, columnspan=3)

def manageMembers(root):
    def go_back():
        # 뒤로가기 버튼 클릭 시 창 닫기
        manage_members_window.destroy()

    manage_members_window = tk.Toplevel(root)
    manage_members_window.title("회원 정보 관리")
    center_window(manage_members_window, 400, 300) # 창을 화면 중앙에 배치

    # 회원 추가, 삭제, 검색 버튼 추가
    tk.Button(manage_members_window, text="회원 추가", command=addMember).pack(pady=5)
    tk.Button(manage_members_window, text="회원 삭제", command=delMember).pack(pady=5)
    tk.Button(manage_members_window, text="회원 검색", command=searchMember).pack(pady=5)
    tk.Button(manage_members_window, text="뒤로가기", command=go_back).pack(pady=5)

 

# manage_publishers.py
import tkinter as tk
from tkinter import simpledialog, messagebox
import csv

PUBLISHERS_FILE = './csv/publishers.csv'

def center_window(window, width, height):
    #주어진 Tkinter 창을 화면의 중앙에 배치
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    window.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

def addPublisher():
    # 출판사 이름을 입력받아 CSV 파일에 추가하는 함수
    publisher_name = simpledialog.askstring("출판사 추가", "출판사 이름:")
    if publisher_name:
        # 출판사 이름을 CSV 파일에 추가
        with open(PUBLISHERS_FILE, 'a', newline='') as file:
            writer = csv.writer(file)
            writer.writerow([publisher_name])
        # 성공 메시지 표시
        messagebox.showinfo("정보", f"출판사 '{publisher_name}'이(가) 추가되었습니다.")

def delPublisher():
    # 삭제할 출판사 이름을 입력받아 CSV 파일에서 제거하는 함수
    publisher_name = simpledialog.askstring("출판사 삭제", "삭제할 출판사 이름:")
    if publisher_name:
        # 기존 출판사 목록을 읽어와서 삭제할 출판사를 제외
        with open(PUBLISHERS_FILE, 'r') as file:
            lines = list(csv.reader(file))

        with open(PUBLISHERS_FILE, 'w', newline='') as file:
            writer = csv.writer(file)
            for line in lines:
                if line[0] != publisher_name:
                    writer.writerow(line)

        # 성공 메시지 표시
        messagebox.showinfo("정보", f"출판사 '{publisher_name}'이(가) 삭제되었습니다.")

def managePublishers():
    # 출판사 관리 기능을 제공하는 새 창 생성
    manage_publishers_window = tk.Toplevel()
    manage_publishers_window.title("출판사 관리")
    center_window(manage_publishers_window, 400, 300)  # 창 크기 및 중앙 배치

    # 출판사 추가 버튼
    tk.Button(manage_publishers_window, text="출판사 추가", command=addPublisher).pack(pady=5)
    # 출판사 삭제 버튼
    tk.Button(manage_publishers_window, text="출판사 삭제", command=delPublisher).pack(pady=5)
    # 뒤로가기 버튼
    tk.Button(manage_publishers_window, text="뒤로가기", command=manage_publishers_window.destroy).pack(pady=5)

 


회고

 

  • 이번 프로젝트의 경우 시작한 지 얼마 안 돼서 진행한 것이어서 시간이 정말 많이 들었다(하루에 1~2시간밖에 못 잠...)
    그나마 반복되는 과정이 많아 진행할 수 있었던 것 같다.
  • 확실하게 GUI 쪽은 아직 학습이 많이 되어있지 않아서 찾아가면서 진행하느라 시간이 너무 많이 걸렸다. (아직 완벽하게 이해하지 못하는 부분이 많아서 앞으로도 많이 공부해야겠다)
  • 프로젝트를 진행하면서 느낀 건데 함수 만들고 사용하는 거는 어느 정도 사용 가능해졌는데, 클래스 부분은 아직 완벽하게 이해하지 못한 것 같다.
    • 기존에 파이썬 기초 부분은 학교에서도 그렇고 따로도 학습하고 있어서 기존에 이론 수업을 따라가는 데는 어려움이 없었는데, 프로젝트를 혼자서 진행하려고 하니까 막히는 부분 같은 것들이 생각보다 많아서 학습하는 데 있어서 많은 시간을 투자해야겠다는 생각이 많이 들었다.
  • 파일을 나누는 데도 뭔가 다르게 나누어서 진행하는 법이 필요할 것 같은데 처음 다이어그램 그린대로 최대한 나누려고 한 것이 미숙한 것 같고, 더 좋은 방법으로 나누는 법이 존재할 것 같다는 생각이 들어서, 이건 나중에 물어봐야겠다.

첫 프로젝트인 만큼 너무나도 아는것이 없다고 생각되어서 앞으로는 더욱 노력해야겠다 생각이 들었다.


프로젝트 기간 24.07.22 ~ 24.07.24

 

  1. var. 0.1.0 
    • 24.07. 22에 하루동안 만들어 진 것으로, 초기 강사님의 가이들 라인 코딩을 참고하여 제작함
  2. var.0.2.0
    • 24.07.22 새벽부터 시작해서 24.07.24 오후 2시에 작업 완료함. (저녁에 1~2시간씩 밖에 못잠..)

마무리, 내 깃허브 해당 내용파트

 

https://github.com/kgw08003/Python-based-book-management-program

 

GitHub - kgw08003/Python-based-book-management-program

Contribute to kgw08003/Python-based-book-management-program development by creating an account on GitHub.

github.com

 

728x90