Задать вопрос
@Bobrenok_kola

Как нормально реализовать форму регистрации на Python + Tkinter?

Пишу форму регистрации на Python3 TKinter. Проблемма в том что есть 2 бага: первое в регистрации при попытке ввести данные получает странную ошибку; второе при авторизации проверка логина проходит успешно, а абсолютно эдентичная проверка пароля ставит систему в тупик. Код ниже
from tkinter import *
from functools import partial
from tkinter.messagebox import *
import re




 

#текст
a="Авторизируйтесь" #Зоглоловок окна
b="Вход в приложение"#Текст в приложениии
c="Пожайлуста введите данные:"#Текст в приложение 2
d="Вы зарагистрированны?"#Вопрос о регистрации пользовотеля
e="Придумайте надежный логин и пароль"
f="Регистрация"


#Логины
namelist = ["ilia"]
#Пароли
passwdlist= ["2" "1"]

window = Tk()
window.title(a)


text1=Label(text=b)
text1.pack(fill=BOTH, expand=True)

text2=Label(text=c)
text2.pack(fill=BOTH, side=LEFT, expand=True)

entryLOGIN = Entry()
entryLOGIN.insert(0,"Логин")
entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True)


entryPASS = Entry()
entryPASS.pack(fill=BOTH, side=LEFT, expand=True)
entryPASS.insert(0,"Пароль")


i=0


#Оценка стойкости пароля
def ChekDATA(entryEPASS,entryELOGIN,namelist,passwdlist):
	passw=entryEPASS.get()
	name=entryELOGIN.get()
	fl=0
	a=0
	while True:
		if (len(passw)<8):
			fl=-1
			break
		elif not re.search("[a-z]",passw):
			fl=-1
			break
		elif not re.search ("[A-Z]",passw):
			fl=-1					
			break	
		elif not re.search("[0-9]",passw):
			fl=-1	
			break	
		elif re.search("\s",passw):
			fl=-1
			break
	if fl==0:
		passwdlist.append(passw)
		a=a+1
	while True:
		if (len(name)<8):

			fl=-1
			break
		elif not re.search("[a-z]",name):
			fl=-1
			break
		elif not re.search ("[A-Z]",name):
			fl=-1					
			break	
		elif not re.search("[0-9]",name):
			fl=-1	
			break	
		elif re.search("\s",name):
			fl=-1
			break
	if fl==0:
		namelist.append(name)
		a=a+1
	if a==2:
		avt(passwdlist,namelist,a,b,c,d,e,f,window)
	else:
		showinfo("Информация","Пароль ненадежн повторите попытку")
		reg(window)	



#Приложение регистрации
def reg(window):
	window.destroy()
	Regw= Tk()
	Regw.title(f)

	text1E=Label(text=e)
	text1E.pack(fill=BOTH, expand=True)

	text2E=Label(text=c)
	text2E.pack(fill=BOTH, side=LEFT, expand=True)

	entryELOGIN = Entry()
	entryELOGIN.insert(0,"Логин")
	entryELOGIN.pack(fill=BOTH, side=LEFT, expand=True)


	entryEPASS = Entry()
	entryEPASS.pack(fill=BOTH, side=LEFT, expand=True)
	entryEPASS.insert(0,"Пароль")

	buttonREG = Button(text="Ввести",command=partial
	(
	ChekDATA,
	entryPASS,
	entryLOGIN,
	namelist,
	passwdlist
	))
	buttonREG.pack(fill=BOTH, side=BOTTOM, expand=True) 
	

def avt(passwdlist,namelist,a,b,c,d,e,f,window):	
	#Приложение авторизации
	window.destroy()
	window = Tk()
	window.title(a)


	text1=Label(text=b)
	text1.pack(fill=BOTH, expand=True)

	text2=Label(text=c)
	text2.pack(fill=BOTH, side=LEFT, expand=True)

	entryLOGIN = Entry()
	entryLOGIN.insert(0,"Логин")
	entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True)


	entryPASS = Entry()
	entryPASS.pack(fill=BOTH, side=LEFT, expand=True)
	entryPASS.insert(0,"Пароль")


	i=0
	#Функция авторизации и проверки паролей на подлинность
	def increase(namelist,passwdlist,entryLOGIN,entryPASS,i):
		p=entryPASS.get()
		name=entryLOGIN.get()
		
		while i<10:
			if name in namelist:
				print("имя есть")
				if p in passwdlist:
					print(a)
					window.destroy()
					main(name)
				else:
					
					entryPASS.delete(0,END)
					i=+1
			else :
				showerror(
			"Ошибка","Введен неверный логин"
			)	
				enrtyLOGIN.delete(0,END)
				i=+1
		else:
			showerror(
			"Ошибка","Попытки кончились"
			)
			


	buttonVXOD = Button(
				master=window,
				text="Войти",
				command=partial(increase,
				namelist,
				passwdlist,
				entryLOGIN,
				entryPASS,
				i
			)
		)
	buttonVXOD.pack(fill=BOTH, side=BOTTOM, expand=True) 





	#Вопрос о том зарегистрирован ли пользователь
def check():
	answer = askyesno(
	title="Вопрос", 
	message=d
	)
	if answer:
		avt(passwdlist,namelist,a,b,c,d,e,f,window)
	else:
		reg(window)
	     
		
check()









window.mainloop()
  • Вопрос задан
  • 2618 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@o5a
первое в регистрации при попытке ввести данные получает странную ошибку

Потому что с именами путаница. Например, в reg используются элементы entryEPASS а на проверку передаются entryPASS.
авторизации проверка логина проходит успешно, а абсолютно эдентичная проверка пароля ставит систему в тупик

У вас там проверка вообще странная, ищете логин среди всех, затем пароль среди всех, а если совпадают так уходите в бесконечный цикл.
И вообще, у Вас логины отвязаны от паролей, совпадение покажет даже для несовпадающих пар логин:пароль, даже если они просто есть в данных. Для нормальной проверки нужно хранить их попарно, например в виде словаря logins = {"логин1": "пароль1", ...}
Правильнее было бы сделать проверку (используя ваши же переменные name, p) и вышеуказанный словарь
if logins.get(name) == p:
сразу проверит, что введенные логин и пароль совпадают.

И саму проверку пароля лучше не привязывать к элементам интерфейса. Сделать функцию, просто принимающую готовые строки (логин, пароль) и выдающую результат проверки. А в эти функции передавать уже строки из нужных элементов интерфейса: entryPASS.get() и т.п.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы