Как закрыть окно tkinter без кнопки?

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я студент-программист уровня A, и я единственный в своем классе, кто умеет программировать на Python. Даже мои учителя не выучили язык. Я пытаюсь закодировать программу входа в систему, которая завершается, когда информация вводится правильно, и отображает изображение экрана приветствия (я еще не закодировал эту часть). Он должен закрыться и отобразить сообщение об ошибке после 3 неудачных попыток входа в систему. Я столкнулся со многими логическими ошибками при попытке изменить переменную attempts, чтобы оператор elif работал после многих неудачных входов в систему, а также при завершении / закрытии окна tkinter на основе соответствующего оператора if / elif . Это не работает, и я просмотрел много примеров кода на этом сайте и ничего не могу найти, могу ли я, пожалуйста, получить помощь в исправлении моего кода?

Код:

 from tkinter import * #Importing graphics

attempts = 0 #Defining attempts variable

def OperatingProgram(): #Defining active program

    class Application(Frame):
        global attempts
        def __init__(self,master):
            super(Application, self).__init__(master) #Set __init__ to the master class
            self.grid()
            self.InnerWindow() #Creates function

        def InnerWindow(self): #Defining the buttons and input boxes within the window
            global attempts
            print("Booted log in screen")
            self.title = Label(self, text=" Please log in, you have "   str(attempts)   " incorrect attempts.") #Title
            self.title.grid(row=0, column=2)

            self.user_entry_label = Label(self, text="Username: ") #Username box
            self.user_entry_label.grid(row=1, column=1)

            self.user_entry = Entry(self)                        #Username entry box
            self.user_entry.grid(row=1, column=2)

            self.pass_entry_label = Label(self, text="Password: ") #Password label
            self.pass_entry_label.grid(row=2, column=1)

            self.pass_entry = Entry(self)                        #Password entry box
            self.pass_entry.grid(row=2, column=2)

            self.sign_in_butt = Button(self, text="Log In",command = self.logging_in) #Log in button
            self.sign_in_butt.grid(row=5, column=2)

        def logging_in(self):
            global attempts
            print("processing")
            user_get = self.user_entry.get() #Retrieve Username
            pass_get = self.pass_entry.get() #Retrieve Password

            if user_get == 'octo' and pass_get == 'burger': #Statement for successful info
                import time
                time.sleep(2)       #Delays for 2 seconds
                print("Welcome!")
                QuitProgram()
            elif user_get != 'octo' or pass_get != 'burger': #Statement for any failed info
                if attempts >= 2:   #Statement if user has gained 3 failed attempts
                   import time
                   time.sleep(2)
                   print("Sorry, you have given incorrect details too many times!")
                   print("This program will now end itself")
                   QuitProgram()
                else:               #Statement if user still has enough attempts remaining
                    import time
                    time.sleep(2)
                    print("Incorrect username, please try again")
                    attempts  = 1
            else:                   #Statement only exists to complete this if statement block
                print("I don't know what you did but it is very wrong.")

    root = Tk() #Window format
    root.title("Log in screen")
    root.geometry("320x100")

    app = Application(root) #The frame is inside the widget
    root.mainloop() #Keeps the window open/running

def QuitProgram(): #Defining program termination
    import sys
    sys.exit()

OperatingProgram()
  

Комментарии:

1. Программный код был обновлен, чтобы исправить инструкцию, основанную на попытке. Однако отображаемое количество попыток в окне tk не изменяется, и я до сих пор не знаю, как заставить окно tk автоматически закрываться после получения правильных сведений или 3 неудачных попыток.

Ответ №1:

Рассмотрим на мгновение следующие две строки в вашем методе logging_in:

 if user_get == 'octo' and pass_get == 'burger':
elif user_get != 'octo' or pass_get != 'burger':
  

итак, если учетные данные для входа верны, код после первого теста выполняется. Если они неверны, выполняется код после второго теста.

Однако код, который вы хотите видеть выполненным после нескольких сбоев, находится в третьем предложении test:

 elif attempts >= 3:
  

Дело в том, что поток выполнения никогда не увидит этот тест, так как либо первый, либо второй уже будет оценен как true (учетные данные для входа верны, учетные данные для входа неверны) — для них обоих должна быть возможность оценить значение false, прежде чем значение попыток когда-либо будет равнопроверено.

Самый простой способ исправить это — изменить

 elif attempts >= 3:
  

строка для чтения

 if attempts >= 3:
  

корректировка предложения else / добавление нового, если вы считаете это необходимым.

Комментарии:

1. Также attempts 1 должно быть attempts = 1 .

2. Привет @L. Fabry если этот ответ решил ваш вопрос, пожалуйста, подумайте о том, чтобы принять его , установив флажок. Это указывает более широкому сообществу, что вы нашли решение, и дает некоторую репутацию как ответчику, так и вам. Нет никаких обязательств делать это.