2016-10-06 3 views
-1

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

Код:

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() 
+0

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

ответ

1

Задумайтесь на минуту следующие две строки в вашем методе logging_in:

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

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

Тем не менее, код, который вы хотите видеть на выполнение после нескольких неудач при третьем пункте тест:

elif attempts >= 3: 

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

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

elif attempts >= 3: 

линия читать

if attempts >= 3: 

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

+0

Также 'попытки + 1' должны быть' попытки + = 1'. – acw1668

+0

Привет @ L.Fabry, если этот ответ решил ваш вопрос, пожалуйста, рассмотрите [его принятие] (http://meta.stackexchange.com/q/5234/179419), нажав на галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – Lafexlos

Смежные вопросы