Получаю ошибку Exception in Tkinter callback или цикличное выполнее

Swap

Новичок
Пользователь
Июл 20, 2021
2
0
1
Операционная ситемма Kali Linux
Python 3.x
Основная библиотека Tkinter, re для проверки пароля на правильность написания,functools для параметров функций
В коде два главных для меня вопроса это: а при регистрации нового пользователя в момент попытке ввода пароля вылезает странная ошибка(прикреплю ниже)
б при авторизации пользователя ввод логина проходит нормально, а ввод при вводе пароля начинает зацикливаться программа.

Есть еще несколько моментов: как насроить запись пароля,логина в отдельный текстовый файл (а не в список)? и шифрование?

код и ошибка ниже. Заранее спасибо!


Python:
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()


Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.9/tkinter/__init__.py", line 1892, in __call__
return self.func(*args)
File "/home/ilia/1.py", line 50, in ChekDATA
passw=entryEPASS.get()
File "/usr/lib/python3.9/tkinter/__init__.py", line 3043, in get
return self.tk.call(self._w, 'get')
_tkinter.TclError: invalid command name ".!entry2"
^CTraceback (most recent call last):
File "/home/ilia/1.py", line 225, in <module>
window.mainloop()
File "/usr/lib/python3.9/tkinter/__init__.py", line 1429, in mainloop
self.tk.mainloop(n)
KeyboardInterrupt
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 639
472
83
вы не верно определяете команду для кнопки...
если у функции есть аргументы, то можно использовать lambda
например так
buttonREG = Button(text="Ввести", command=lambda: ChekDATA(entryEPASS, entryELOGIN, namelist, passwdlist))
но далее он будет ругаться, что вы уничтожаете окно, которое уже было уничтожено...
у вас плохая логика программы, советую переписать через классы...
плюс у вас ошибки, в функции increase вы используете имена main и enrtyLOGIN, для этой функции они не определены...
 
  • Мне нравится
Реакции: Swap

Swap

Новичок
Пользователь
Июл 20, 2021
2
0
1
вы не верно определяете команду для кнопки...
если у функции есть аргументы, то можно использовать lambda
например так
buttonREG = Button(text="Ввести", command=lambda: ChekDATA(entryEPASS, entryELOGIN, namelist, passwdlist))
но далее он будет ругаться, что вы уничтожаете окно, которое уже было уничтожено...
у вас плохая логика программы, советую переписать через классы...
плюс у вас ошибки, в функции increase вы используете имена main и enrtyLOGIN, для этой функции они не определены...
Спасибо!
 

Форум IT Специалистов