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
- var. 0.1.0
- 24.07. 22에 하루동안 만들어 진 것으로, 초기 강사님의 가이들 라인 코딩을 참고하여 제작함
- var.0.2.0
- 24.07.22 새벽부터 시작해서 24.07.24 오후 2시에 작업 완료함. (저녁에 1~2시간씩 밖에 못잠..)
마무리, 내 깃허브 해당 내용파트
https://github.com/kgw08003/Python-based-book-management-program
728x90
'PYTHON-BACK' 카테고리의 다른 글
#파이썬 20일차_GitHub Action (1) | 2024.07.26 |
---|---|
#파이썬 19일차_GitHub Action (0) | 2024.07.25 |
#파이썬 도서관 출납 시스템_18일차_var. 0.1.0 (0) | 2024.07.24 |
#파이썬 도서관 출납 시스템_17일차 (3) | 2024.07.23 |
#파이썬 도서관 출납 시스템_16일차 (1) | 2024.07.22 |