Đăng nhập GUI Python Tkinter
Tôi đã lập trình được khoảng 4 đến 5 tháng nay và tôi đã tạo một tập lệnh đăng nhập bằng tkinter trong python. Tôi đã cố gắng sử dụng các lớp và định nghĩa hàm tốt nhất có thể. Để hiểu rõ hơn về họ.
Tôi muốn hỏi tất cả các bạn, mã này trông như thế nào và có điều gì tôi nên hoặc không nên làm trong lần viết mã tiếp theo không?
CHÂN THÀNH CẢM ƠN MỌI ĐỀ XUẤT CỦA BẠN
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)
Trả lời
Một số nhận xét PEP8 thông thường:
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_userđáng lẽ phải NewUserdành cho tên lớp hoặc new_usertrong các trường hợp khác
Chọn tên có ý nghĩa và tránh lỗi chính tả
Tránh lỗi chính tả như: regestrationvà Visualcó thểMainWindow
Đăng Ký Người Dùng Mới
Tùy chọn đăng ký chỉ xuất hiện sau khi đăng nhập sai được gửi, nó đáng lẽ phải xuất hiện trên hiển thị đầu tiên của màn hình
Kiểm tra sự không nhất quán
Bạn yêu cầu Yes / No nhưng kiểm tra:
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)
Sử dụng .lowerhoặc .casefoldso sánh tốt hơn
if answer.lower() == "yes":
giống nhau cho không
Lớp Đăng nhập có thể là các phương thức
Lớp Đăng nhập có thể có nhiều phương thức hơn trong Trực quan. Tôi hiểu rằng bạn đã nhóm các chức năng theo các chủ đề như Đăng nhập và Người dùng mới nhưng bạn không sử dụng hàm tạo thay thế cho một phương thức:
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
Bạn cũng có thể nhóm tất cả các chế độ xem dưới một lớp và tất cả logic trong một lớp. Các khung nhìn lấy logic làm tham số và gọi các phương thức liên quan khi cần. Điều này làm cho nó trong số những người khác dễ dàng hơn để tìm và kiểm tra.
Tôi đồng ý với Abdur hãy giữ cho nó đơn giản với một lớp học. Những thứ khác có thể được cải thiện là:
- Thêm một cơ sở dữ liệu, bạn có thể sử dụng giá đỡ hoặc giá đỡ để lưu trữ tên người dùng và mật khẩu. cơ bản bắt đầu lên kệ
2) Thêm nút cho người dùng mới ngay lập tức. 3) việc bạn sử dụng relx và dựa vào có một số tác dụng phụ chồng chéo, bạn có thể tốt hơn nên sử dụng x và y với các tọa độ thực. 4) Các mục nhập mật khẩu của bạn, bạn có thể ẩn từ đó với hiển thị:
password= Entry(self.root,show='*',width=60)
5) Để thêm đối số vào một lệnh nút, bạn có thể sử dụng một phần từ functools
from functools import partial
phía nút:
submit= Button(self.root,text='Enter',command=partial(your_function,args,arg,arg)
- Cuối cùng, tôi đã tạo một người dùng mới và khi đăng nhập, tôi đã cố tình nhập một mật khẩu khác, nó đã gây ra lỗi. Bạn cần một số cách để kiểm tra và cho người dùng biết rằng mọi thứ không khớp. Hộp thoại hoặc hộp thư đơn giản sẽ hoạt động. chúc may mắn, Joe