Python Tkinter GUI 로그인

Sep 19 2020

저는 지금 약 4 ~ 5 개월 동안 프로그래밍을 해왔고 파이썬에서 tkinter로 로그인 스크립트를 만들었습니다. 가능한 한 클래스와 함수 정의를 사용하려고했습니다. 그들을 더 잘 알기 위해.

여러분 모두에게 물어보고 싶었습니다.이 코드는 어떻게 생겼는지, 다음에 코딩 할 때해야 할 일이나하지 말아야 할 일이 있습니까?

모든 제안에 대해 미리 감사드립니다.

from tkinter import * 
import tkinter.font as font
import time


global data

data = {}

class Visual:
    def __init__(self,old_root):
        old_root.destroy()

        self.root = Tk()
        self.win_size = self.root.geometry("800x500")

        self.color = self.root.configure(bg="black")
        self.font = font.Font(size= 30)

        self.home_screen()
        # print data to check and see what is in data
        print(data)

    def home_screen(self):

        # just title on the home screen
        title = Label(self.root, text= "WELCOME USER , PLEASE LOGIN BELOW ",padx= 200,anchor= "center" ,bg="grey")
        title.place(relx= 0.5, rely= 0.0 , anchor= "n")

        # the login fields and the enter button
        self.entery()


    def entery(self):

        # a text that says "username" next to the input field
        user_text = Label(self.root, text= "USERNAME :", bg="grey")
        # the username input field
        username = Entry(self.root, width= 50)

        # a text that says "password" next to the input field
        passw_text = Label(self.root, text= "PASSWORD :", bg= "grey")
        # the password input field
        password = Entry(self.root, width= 50)

        # puts the text and the user input fields on the screen
        user_text.place(rely= 0.1, anchor= "nw")
        username.place(relx= 0.1, rely= 0.1, anchor= "nw")

        # puts the text and the user input fields on the screen
        passw_text.place(rely= 0.2,anchor= "nw")
        password.place(relx= 0.1, rely= 0.2, anchor= "nw")


        # button that is clicked when finished with inputting your login information

        submit = Button(self.root, text= "ENTER", padx= 80, pady= 10, command=lambda :Login(username_clear=username,
                                                                                        password_clear= password,
                                                                                        root= self.root,
                                                                                        user_input= username.get(),
                                                                                        passw_input= password.get()))
        submit.place(relx= 0.6, rely= 0.2, anchor= "sw")
        self.root.mainloop()

class Login:
    def __init__(self, username_clear , password_clear , root, user_input, passw_input):
        
        # clears the input fields
        username_clear.delete(0,END)
        password_clear.delete(0,END)

        self.root = root

        self.user_input = user_input
        self.passw_input = passw_input

        self.login_check()

    def login_check(self):

        key, value = self.user_input , self.passw_input
         
        # Checks to see if username and password exists 
        if key in data and value == data[key]:

            # Welcomes the user back
            welcome = Label(self.root, text= f"WELCOME BACK \n{self.user_input.upper()}", padx= 200, pady= 50)
            welcome.place(relx= 0.2, rely= 0.5, anchor= "nw")

        # Checks to see if the user put in the wrong username or password 
        elif key not in data or value != data[key]:

            wrong= Label(self.root, text="Wrong Username or Password", padx =200)
            wrong.place(relx= 0.1, rely= 0.5,anchor= "nw")

            # Creates a input field for the user to see if he/she is a new user or not 
            question = Entry(self.root, width= 20)
            question.place(relx= 0.25, rely=0.6, anchor="nw")

            question_text = Label(self.root, text= "Are You A New User? Yes / No : ")
            question_text.place(relx= 0.01, rely= 0.6, anchor= "nw")

            # Make a button for the user to press when finished with answering the question above 
            enter_answ = Button(self.root, text= "ENTER", width= 30, command= lambda : self.answer_check(answer=question.get()))
            enter_answ.place(relx= 0.6, rely= 0.6)
            self.root.mainloop()

    def answer_check(self, answer):

        # If the user types the answer yes. It destroys this window and makes a new one create a new user
        if answer == "yes":
            New_user(root=self.root)

        # If user answers with no , then it starts again and asks user to login 
        if answer == "no" :
            Visual(old_root=self.root)

class New_user:
    def __init__(self, root):
        
        # Destroyes the old window and creates a new one after it 
        root.destroy()
        self.data = data

        # Creates a new window to create a new user 
        self.new_root = Tk()
        self.win_size = self.new_root.geometry("800x500")
        self.color = self.new_root.configure(bg="black")
        self.font = font.Font(size=30)

        self.home_screen()

    def home_screen(self):
        title = Label(self.new_root, text="CREATE NEW USER LOGIN ", padx=200, anchor="center", bg="grey")
        title.place(relx=0.5, rely=0.0, anchor="n")

        self.regestration()

    def regestration(self):

        # The input fields for the new login information for the new user account 
        user_text = Label(self.new_root, text="USERNAME :", bg="grey")
        username = Entry(self.new_root, width=50)

        passw_text = Label(self.new_root, text="PASSWORD :", bg="grey")
        password = Entry(self.new_root, width=50)

        user_text.place(rely=0.1, anchor="nw")
        username.place(relx=0.1, rely=0.1, anchor="nw")

        passw_text.place(rely=0.2, anchor="nw")
        password.place(relx=0.1, rely=0.2, anchor="nw")

        # Create a button to verify if the user information already exists
        submit = Button(self.new_root, text="CREATE USER", padx=80, pady=10, command=lambda :self.save_new_user(username= username,
                                                                                                            password= password))
        submit.place(relx=0.6, rely=0.2, anchor="sw")

   
    def save_new_user(self, username, password):

        # if user information already exists , it waits 2seconds then destroys the current window and makes a new window for the user to create a new account 
        if username.get() in data:
            in_use = Label(self.new_root, text= "USERNAME ALEARDY EXISTS", padx= 200)
            in_use.place(relx= 0.0, rely= 0.7, anchor= "sw")

            time.sleep(2)

            New_user(root=self.new_root)

        # If the user information doesn't exists yet , it puts it into the a dictionary called "data"
        data[username.get()] = password.get()

         # Assigns a button to verify your succesfull login and also destroying the button at the sametime and creating a diffrent one .
        login_retry = Button(self.new_root ,text="LOGIN", width= 80, command=lambda :self.succes(button=login_retry))
        login_retry.place(relx= 0.15, rely= 0.8)


    def succes(self,button):
      
        # Destroy the old button 
        button.destroy()

        # Tells the user that he/she succesfully logged in .
        succes_login = Label(self.new_root, text="YOU HAVE SUCCESFULLY CREATED A NEW USER , CLICK BELOW TO LOGIN IN ",
                   padx=200)
        succes_login.place(relx=0.0, rely=0.5, anchor="sw")
        
        # Creates a button to verify your new user account 
        Button(self.new_root, text="Click HERE TO LOGIN", width= 100, command=lambda :self.retry_login()).place(relx= 0.05, rely= 0.6)

        self.new_root.mainloop()

    def retry_login(self):

        # Goes to the beginning of the program where you test your account login 
        Visual(old_root=self.new_root)


root = Tk()
main = Visual(root)

답변

2 Abdur-RahmaanJanhangeer Sep 21 2020 at 15:55

일반적인 PEP8 의견 :

username_clear.delete(0,END) -> username_clear.delete(0, END)

in_use.place(relx= 0.0, rely= 0.7, anchor= "sw") -> in_use.place(relx=0.0, rely=0.7, anchor="sw")

New_userNewUser클래스 이름이거나 new_user다른 경우에 있었어야 합니다.

의미있는 이름을 선택하고 오타 방지

같은 오타를 피하십시오 : regestration및 Visual수 있었다MainWindow

신규 사용자 등록

가입 옵션은 잘못된 로그인을 제출 한 후에 만 ​​나타납니다. 화면의 첫 번째 디스플레이에 있어야합니다.

불일치 확인

예 / 아니오를 요청하지만 다음 사항을 확인하십시오.

if answer == "yes":
    New_user(root=self.root)

# If user answers with no , then it starts again and asks user to login 
if answer == "no" :
    Visual(old_root=self.root)

사용 .lower또는 .casefold더 나은 비교

if answer.lower() == "yes":

아니오에 대해 동일

Login 클래스는 메소드 일 수 있습니다.

Login 클래스는 Visual에서 더 많은 메서드가 될 수 있습니다. Login 및 New_user와 같은 주제로 기능을 그룹화했지만 생성자를 메서드 대신 사용하지 않는다는 것을 이해합니다.

    def __init__(self, username_clear , password_clear , root, user_input, passw_input):
        # clears the input fields
        username_clear.delete(0,END)
        password_clear.delete(0,END)

        self.root = root

        self.user_input = user_input
        self.passw_input = passw_input

        self.login_check()

MVC

또한 모든 뷰를 한 클래스 아래에, 모든 로직을 한 클래스 아래에 그룹화 할 수도 있습니다. 뷰는 논리를 매개 변수로 사용하고 필요에 따라 관련 메서드를 호출합니다. 이를 통해 다른 사람들과 함께 쉽게 찾고 테스트 할 수 있습니다.

2 just_joe Sep 22 2020 at 09:11

나는 Abdur가 한 클래스로 간단하게 유지하는 것에 동의합니다. 개선 할 수있는 다른 사항은 다음과 같습니다.

  1. 데이터베이스를 추가하면 pickle 또는 shelve를 사용하여 사용자 이름과 암호를 저장할 수 있습니다. 기본 시작부터 선반까지

2) 새로운 사용자를위한 버튼을 즉시 추가하십시오. 3) relx와 의존을 사용하면 몇 가지 겹치는 부작용이 있으므로 실제 좌표로 x와 y를 사용하는 것이 더 나을 수 있습니다. 4) show로 단어를 숨길 수있는 비밀번호 입력 :

password= Entry(self.root,show='*',width=60)

5) 버튼 명령에 인수를 추가하려면 functools에서 partial을 사용할 수 있습니다.

from functools import partial

버튼 쪽 :

submit= Button(self.root,text='Enter',command=partial(your_function,args,arg,arg)
  1. 마지막으로 새 사용자를 만들었고 로그인했을 때 의도적으로 다른 암호를 입력했는데 오류가 발생했습니다. 일이 일치하지 않는다는 것을 확인하고 사용자에게 알리는 방법이 필요합니다. 간단한 대화 상자 또는 메시지 상자가 작동합니다. 행운을 빕니다, 조