• 티스토리 홈
  • 프로필사진
    소쩍소쩍이
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
소쩍소쩍이
  • 프로필사진
    소쩍소쩍이
    • 분류 전체보기 (89)
      • 파이썬 (18)
        • 문제 및 예제 (8)
      • PySide6 (24)
        • Signal & Slot (6)
        • Layout (8)
        • Model & View (3)
        • File (4)
        • Resource (3)
      • Server - Client (17)
        • GUI 채팅 (1)
      • MySQL (4)
      • 리눅스 (5)
      • 아두이노 (0)
      • 일지 (20)
  • GitHub
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    # Home
    # 공지사항
    #
    # 태그
    # 검색결과
    # 방명록
    • 회원가입, File 입출력, Json 사용, PW Hash 변환 추가 구현
      2026년 06월 08일
      • 소쩍소쩍이
      • 작성자
      • 2026.06.08.:14

      signup_login_hash_project.zip
      0.01MB

      main.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_phone

      member_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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
    목차
    표시할 목차가 없습니다.
      • 안녕하세요
      • 감사해요
      • 잘있어요

      티스토리툴바