2015-05-03 3 views
-3

Я пытаюсь сделать программу, которая будет всплывать в другое окно, если правильный пароль введен в течение 3 шагов. Когда неправильный пароль введен для третьей трети, он будет печатать «bye», но эта программа, кажется, печатает «bye» при первом вводе неправильного пароля.Loop не работает должным образом Python GUI

import Tkinter 

def win1(): 
    # this is the main/root window 
    root = Tkinter.Tk() 
    root.title("Stock Plus system") 
    root.geometry('400x150') 
    b2Var=Tkinter.StringVar() 
    s=0 


    def textboxvalue(): 
    s=3 
    while (s==0): 
     global s 
     textvalue=b2Var.get() 
     if textvalue ==('stock123'): 
      label4=Tkinter.Label(root,text='Welcome to stock plus system, press login again to start using') 
      label4.grid(row=3,column=1) 
      Button_1 = Tkinter.Button(root, text="Login", command=win2) 
      Button_1.grid(row=2,column=1) 

     else: 
      s=s-1 
      label3=Tkinter.Label(root,text='Try again') 
      label3.grid(row=3,column=1) 
    else: 
     label5=Tkinter.Label(root,text='bitch') 
     label5.grid(row=4,column=1) 


    Button_1 = Tkinter.Button(root, text="Login", command=textboxvalue) 
    Button_1.grid(row=2, column=1) 
    b1Var = Tkinter.StringVar() 
    b2Var = Tkinter.StringVar() 

    box1Label = Tkinter.Label(root,text='Username:') 
    box1Label.grid(row=0) 
    box2Label = Tkinter.Label(root,text='Password:') 
    box2Label.grid(row=1) 
    box1Text = Tkinter.Entry(root,textvariable=b1Var,width=12) 
    box1Text.grid(row=0, column=1) 
    box2Text = Tkinter.Entry(root,textvariable=b2Var,width=12) 
    box2Text.grid(row=1, column=1) 



    root.mainloop() 
def win2(): 


    # this is the child window 

    board = Tkinter.Toplevel() 
    board.title("Window 2") 
    s1Var = Tkinter.StringVar() 
    s2Var = Tkinter.StringVar() 

    square1Label = Tkinter.Label(board,textvariable=s1Var) 
    square1Label.grid(row=0, column=7) 
    square2Label = Tkinter.Label(board,textvariable=s2Var) 
    square2Label.grid(row=0, column=6) 
win1() 
if (s==3): 
    label5=Tkinter.Label(root,text=' start using') 
    label5.grid(row=4,column=1) 
+0

Вам необходимо исправить отступы в коде. –

+0

Какой ты на самом деле? – Teeban

+0

Существует множество ошибок отступений, каждая функция не имеет отступов правильно. Иногда это происходит, когда вы вставляете его в текстовое поле. Можете ли вы запустить то, что у вас есть сейчас? Я вижу много проблем. –

ответ

2

Ошибка возникает, поскольку цикл в то время как всегда работает в 3 раза при каждом нажатии кнопки входа в систему, так как вход одинаково на каждой итерации она падает в if (s==3):, если заявление и печатает «до свидания» каждый раз.

Ваша функция textboxvalue вызывается один раз для каждой кнопки, а не один раз, а затем цикл выполняется при каждом последующем щелчке. Я думаю, вы это неправильно поняли.

Для вас потребуется некоторое сохранение между вызовами textboxvalue, мы будем использовать глобальную переменную. Вы должны помнить, чтобы установить это значение в 0, если позже потребуются попытки входа в систему.

Теперь вам нужно использовать if, а не некоторое время, так как оно должно запускаться только после каждого звонка до textboxvalue.

Приведенный ниже код демонстрирует, как его исправить.

tries = 0 

def textboxvalue(): 
    global tries 

    if (tries < 3): 
     textvalue=b2Var.get() 
     if textvalue ==('stock123'): 
      label4=Tkinter.Label(root,text='Welcome to stock plus system, press login again to start using') 
      label4.grid(row=3,column=1) 
      Button_1 = Tkinter.Button(root, text="Login", command=win2) 
      Button_1.grid(row=2,column=1) 

     else: 
      tries += 1 
      label3=Tkinter.Label(root,text='Try again') 
      label3.grid(row=3,column=1) 

    if (tries==3): 
     label4=Tkinter.Label(root,text='bye') 
     label4.grid(row=4,column=1) 

Поскольку у вас возникли проблемы с объединением приведенного выше примера с остальной частью вашего кода. Вот полная версия.

import Tkinter 

def win1(): 
    global root 
    global tries 
    # this is the main/root window 
    root = Tkinter.Tk() 
    root.title("Stock Plus system") 
    root.geometry('400x150') 
    b2Var=Tkinter.StringVar() 
    tries = 0 

def win2(): 
    # this is the child window 

    board = Tkinter.Toplevel() 
    board.title("Window 2") 
    s1Var = Tkinter.StringVar() 
    s2Var = Tkinter.StringVar() 

    square1Label = Tkinter.Label(board,textvariable=s1Var) 
    square1Label.grid(row=0, column=7) 
    square2Label = Tkinter.Label(board,textvariable=s2Var) 
    square2Label.grid(row=0, column=6) 

def textboxvalue(): 
    global tries 

    if (tries < 3): 
     textvalue=b2Var.get() 
     if textvalue ==('stock123'): 
      label4=Tkinter.Label(root,text='Welcome to stock plus system, press login again to start using') 
      label4.grid(row=3,column=1) 
      Button_1 = Tkinter.Button(root, text="Login", command=win2) 
      Button_1.grid(row=2,column=1) 

     else: 
      tries += 1 
      label3=Tkinter.Label(root,text='Try again') 
      label3.grid(row=3,column=1) 

    if (tries==3): 
     label4=Tkinter.Label(root,text='bye') 
     label4.grid(row=4,column=1) 

win1() 
Button_1 = Tkinter.Button(root, text="Login", command=textboxvalue) 
Button_1.grid(row=2, column=1) 
b1Var = Tkinter.StringVar() 
b2Var = Tkinter.StringVar() 

box1Label = Tkinter.Label(root,text='Username:') 
box1Label.grid(row=0) 
box2Label = Tkinter.Label(root,text='Password:') 
box2Label.grid(row=1) 
box1Text = Tkinter.Entry(root,textvariable=b1Var,width=12) 
box1Text.grid(row=0, column=1) 
box2Text = Tkinter.Entry(root,textvariable=b2Var,width=12) 
box2Text.grid(row=1, column=1) 

root.mainloop() 


if (tries==3): 
    label5=Tkinter.Label(root,text=' start using') 
    label5.grid(row=4,column=1) 
+0

Пол благодарен за ответ, но он говорит: «if (try <3): NameError: глобальное имя« пытается »не определено» – Teeban

+0

Включили ли вы глобальное определение 'try' в свой код ? Это первая строка моего кода. –

+0

yes i did include – Teeban

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