- 회원가입, File 입출력, Json 사용, PW Hash 변환 추가 구현2026년 06월 08일
- 소쩍소쩍이
- 작성자
- 2026.06.08.:14
signup_login_hash_project.zip0.01MBmain.py
import sys from PySide6.QtWidgets import QApplication from member_model import MemberModel from tab_window import MainWidget def main(): app = QApplication(sys.argv) member_model = MemberModel() window = MainWidget(member_model) window.show() sys.exit(app.exec()) if __name__ == "__main__": main()member_model.py
from member_storage import load_members, save_members from password_utils import make_password_hash, check_password class MemberModel: def __init__(self): self.id = "" self.name = "" self.email = "" self.phone = "" def sigup(self,user_id,user_pw,user_pw_check, user_name, user_email,user_phone): if(user_id == "" or user_pw == "" or user_pw_check == "" or user_name == "" or user_email == "" or user_phone == ""): return "빈칸이 있습니다." if user_pw != user_pw_check: return "비밀번호가 다릅니다." data = load_members() for member in data["members"]: if member["id"] == user_id: return "이미 존재하는 ID 입니다." password_hash = make_password_hash(user_pw) new_member ={ "id":user_id, "password_hash":password_hash, "name":user_name, "email":user_email, "phone":user_phone } data["members"].append(new_member) save_members(data) return "회원가입 성공" def login(self, user_id, password): data = load_members() for member in data["members"]: if member["id"] == user_id: if check_password(password, member["password_hash"]): self.id = member["id"] self.name = member["name"] self.email = member["email"] self.phone = member["phone"] return True return False def update_profile(self, user_name, user_email, user_phone): data = load_members() for member in data["members"]: if member["id"] == self.id: member["name"] = user_name member["email"] = user_email member["phone"] = user_phone break save_members(data) self.name = user_name self.email = user_email self.phone = user_phonemember_storage.py
import json FILE_NAME = "member.txt" def load_members(): try: with open(FILE_NAME, "r", encoding="utf-8") as file: return json.load(file) except FileNotFoundError: return {"members": []} def save_members(data): with open(FILE_NAME, "w", encoding="utf-8") as file: json.dump(data,file,ensure_ascii=False,indent=4)passwoed_utils.py
import hashlib def make_password_hash(password): return hashlib.sha256(password.encode("utf-8")).hexdigest() def check_password(password, password_hash): return (make_password_hash(password) == password_hash)tab_window.py
from PySide6.QtWidgets import ( QWidget, QTabWidget, QVBoxLayout, QHBoxLayout,QLabel,QLineEdit,QPushButton ) class SigupView(QWidget): def __init__(self,member_model, tab_widget): super().__init__() self.member_model = member_model self.tab_widget = tab_widget self.label_id = QLabel("ID") self.line_edit_id = QLineEdit() self.label_pw = QLabel("PW") self.line_edit_pw = QLineEdit() self.line_edit_pw.setEchoMode(QLineEdit.Password) self.label_pw_check = QLabel("PW 확인") self.line_edit_pw_check = QLineEdit() self.line_edit_pw_check.setEchoMode(QLineEdit.Password) self.label_name = QLabel("이름") self.line_edit_name = QLineEdit() self.label_email = QLabel("Email") self.line_edit_email = QLineEdit() self.label_phone = QLabel("전화번호") self.line_edit_phone = QLineEdit() self.button_sigup = QPushButton("회원가입") self.button_sigup.clicked.connect(self.sigup) self.result_label = QLabel() layout = QVBoxLayout() layout.addWidget(self.label_id) layout.addWidget(self.line_edit_id) layout.addWidget(self.label_pw) layout.addWidget(self.line_edit_pw) layout.addWidget(self.label_pw_check) layout.addWidget(self.line_edit_pw_check) layout.addWidget(self.label_name) layout.addWidget(self.line_edit_name) layout.addWidget(self.label_email) layout.addWidget(self.line_edit_email) layout.addWidget(self.label_phone) layout.addWidget(self.line_edit_phone) layout.addWidget(self.button_sigup) layout.addWidget(self.result_label) self.setLayout(layout) def sigup(self): user_id = self.line_edit_id.text() user_pw = self.line_edit_pw.text() user_pw_check = self.line_edit_pw_check.text() user_name = self.line_edit_name.text() user_email = self.line_edit_email.text() user_phone = self.line_edit_phone.text() result = self.member_model.sigup(user_id, user_pw,user_pw_check, user_name, user_email, user_phone) self.result_label.setText(result) if result == "회원가입 성공": self.line_edit_id.clear() self.line_edit_pw.clear() self.line_edit_pw_check.clear() self.line_edit_name.clear() self.line_edit_email.clear() self.line_edit_phone.clear() self.tab_widget.setCurrentIndex(0) class LoginView(QWidget): def __init__(self, member_model, tab_widget, main_view, profile_view): super().__init__() self.member_model = member_model self.tab_widget = tab_widget self.main_view = main_view self.profile_view = profile_view self.label_id = QLabel("ID") self.line_edit_id = QLineEdit() self.label_pw = QLabel("PW") self.line_edit_pw = QLineEdit() self.line_edit_pw.setEchoMode(QLineEdit.Password) self.button_login = QPushButton("로그인") self.button_login.clicked.connect(self.login) self.button_sigup = QPushButton("회원가입") self.button_sigup.clicked.connect(self.move_sigup) self.result_label = QLabel() layout = QVBoxLayout() layout.addWidget(self.label_id) layout.addWidget(self.line_edit_id) layout.addWidget(self.label_pw) layout.addWidget(self.line_edit_pw) layout.addWidget(self.button_login) layout.addWidget(self.button_sigup) layout.addWidget(self.result_label) self.setLayout(layout) def login(self): user_id = self.line_edit_id.text().strip() password = self.line_edit_pw.text().strip() result = self.member_model.login( user_id, password ) if result: self.result_label.setText("로그인 성공") self.main_view.update_view() self.profile_view.load_profile() self.line_edit_id.clear() self.line_edit_pw.clear() self.tab_widget.setCurrentIndex(2) else: self.result_label.setText("로그인 실패") def move_sigup(self): self.tab_widget.setCurrentIndex(1) class MainView(QWidget): def __init__(self, member_model): super().__init__() self.member_model = member_model self.label_id = QLabel("ID :") self.label_name = QLabel("이름 :") self.label_email = QLabel("이메일 :") self.label_phone = QLabel("전화번호 :") layout = QVBoxLayout() layout.addWidget(self.label_id) layout.addWidget(self.label_name) layout.addWidget(self.label_email) layout.addWidget(self.label_phone) self.setLayout(layout) def update_view(self): self.label_id.setText(f"ID : {self.member_model.id}") self.label_name.setText(f"이름 : {self.member_model.name}") self.label_email.setText(f"이메일 : {self.member_model.email}") self.label_phone.setText(f"전화번호 : {self.member_model.phone}") class ProfileView(QWidget): def __init__(self, member_model, main_view): super().__init__() self.member_model = member_model self.main_view = main_view self.label_id = QLabel() self.line_edit_name = QLineEdit() self.line_edit_email = QLineEdit() self.line_edit_phone = QLineEdit() self.button_update = QPushButton("수정") self.button_update.clicked.connect(self.update_profile) self.result_label = QLabel() layout = QVBoxLayout() layout.addWidget(QLabel("ID")) layout.addWidget(self.label_id) layout.addWidget(QLabel("이름")) layout.addWidget(self.line_edit_name) layout.addWidget(QLabel("이메일")) layout.addWidget(self.line_edit_email) layout.addWidget(QLabel("전화번호")) layout.addWidget(self.line_edit_phone) layout.addWidget(self.button_update) layout.addWidget(self.result_label) self.setLayout(layout) def load_profile(self): self.label_id.setText(self.member_model.id) self.line_edit_name.setText(self.member_model.name) self.line_edit_email.setText(self.member_model.email) self.line_edit_phone.setText(self.member_model.phone) def update_profile(self): self.member_model.update_profile( self.line_edit_name.text().strip(), self.line_edit_email.text().strip(), self.line_edit_phone.text().strip() ) self.main_view.update_view() self.result_label.setText("수정 완료") class MainWidget(QWidget): def __init__(self, member_model): super().__init__() self.tab_widget = QTabWidget() self.main_view = MainView(member_model) self.profile_view = ProfileView(member_model,self.main_view) self.login_view = LoginView(member_model,self.tab_widget,self.main_view,self.profile_view) self.signup_view = SigupView(member_model,self.tab_widget) self.tab_widget.addTab(self.login_view,"로그인") self.tab_widget.addTab(self.signup_view,"회원가입") self.tab_widget.addTab(self.main_view,"메인") self.tab_widget.addTab(self.profile_view,"프로필") layout = QVBoxLayout() layout.addWidget(self.tab_widget) self.setLayout(layout)
'PySide6 > File' 카테고리의 다른 글
QTextStream으로 텍스트 파일 다루기 (0) 2026.06.08 QFile.open()과 QIODevice 플래그 (0) 2026.06.08 파일 읽기와 쓰기 (0) 2026.06.08 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)