2015-11-03 4 views
-2

поэтому я делаю простой вход в систему и зарегистрирую страницу, и все идет хорошо, пока я не попытаюсь получить мои переменные из своего определения для моей страницы регистрации. Python говорит, что это неразрешенная ссылка, которая должна разрешать совпадения ввода и все, кроме, может быть, кто-то может помочь. Также я знаю, что есть более простой способ добавить страницы, используя классы, но я решил сделать это таким образом. Спасибо заранее. p.s ошибка находится в коде sign_up_check(), который переменные получают из определения sign_up().Tkinter in python: Неразрешимая ссылка

import tkinter 

# window set up 

window = tkinter.Tk() 
window.geometry("300x200") 
window.title("Game") 
window.configure(bg="grey26") 

# username label 

lbl = tkinter.Label(window, text="username", bg="gold") 
enter_username = tkinter.Entry(window, bg="indian red1") 
lbl.pack() 
enter_username.pack() 

# password setup 

label_password = tkinter.Label(window, text="password", bg="gold") 
enter_password = tkinter.Entry(window, bg="indian red1") 
label_password.pack() 
enter_password.pack() 


# sign in 


def log_in(): 
    username = enter_username.get() 
    password = enter_password.get() 
    if len(username) > 0 and len(password) > 0: 
     print("it passed") 
    else: 
     print("Log in error: Double check username and password") 


def sign_up_check(): 
    # init vars 
    username = signup_username.get() 
    password = signup_pasword.get() 
    age = signup_age.get() 
    # check if vars greater than one 
    if len(username) > 0 and len(password) > 0 and age > 0: 
     print("this all passed") 
    else: 
     print("all else failed") 


def sign_up(): 
    # create new window 

    window1 = tkinter.Toplevel() 
    window1.geometry("300x200") 
    window1.title("Sign up") 
    window1.configure(bg="grey26") 
    # create buttons and labels 

    # username 
    label_sign_up = tkinter.Label(window1, text="Enter new username", bg="indian red1") 
    signup_username = tkinter.Entry(window1, bg="gold") 
    label_sign_up.pack() 
    signup_username.pack() 

    # password 
    label_sign_up_password = tkinter.Label(window1, text="Enter new password", bg="indian red1") 
    signup_password = tkinter.Entry(window1, bg="gold") 
    label_sign_up_password.pack() 
    signup_password.pack() 

    # age 
    label_enter_age = tkinter.Label(window1, text="Enter your age", bg="indian red1") 
    signup_age = tkinter.Entry(window1, bg="gold") 
    label_enter_age.pack() 
    signup_age.pack() 

    # confirm account 
    button_account = tkinter.Button(window1, text="Create account", bg="red", command=lambda: sign_up_check()) 
    button_account.pack() 


# log in button set up 

button_login = tkinter.Button(window, text="Log in", bg="gold", command=lambda: log_in()) 
button_login.pack() 

# sign up button 


button_signup = tkinter.Button(window, text="Sign up", bg="gold", command=lambda: sign_up()) 
button_signup.pack() 

window.mainloop() 
+1

С одной стороны, в 'sign_up_check()' у вас есть 'password = signup_pasword.get()' вместо 'password = signup_password.get()'. Даже если вы исправите это, 'signup_password' - это локальная переменная, определенная в функции' sign_up() '(на которую нельзя ссылаться вне ее и исчезнет, ​​как только функция вернется). Чтобы избежать этой проблемы, вы должны использовать классы (или глобальные переменные, что многие люди делают, чтобы обойти это). – martineau

ответ

0

Основная причина вашего поведения в том, что локально определенные переменные из ваших функций находятся в локальной области. Это означает, что они доступны только в вашей локальной функции, а не за ее пределами.

Как указано в марсино, у вас есть опечатка в пароле в функции sign_up_check.

Использование глобальных переменных:

  • , чтобы сделать эту работу каждый виджет, который создается внутри функции должна быть создана глобально.

    def login(): 
     global enter_username, enter_password 
     # [... The rest of the code ...] 
    def sign_up_check(): 
     global signup_username, signup_password, signup_age 
     # [... The rest of the code ...] 

Есть ли какая-либо конкретная и программно значимая причина, почему вы не хотите использовать классы?

Чтобы быть честным с вами, я не вижу никакого преимущества в использовании глобальных переменных и процедурного программирования при кодировании графических пользовательских интерфейсов, особенно с помощью python.

Я настоятельно рекомендую стиль объектно-ориентированного программирования для улучшения обслуживания кода и сокращения количества избыточного кодирования (глобальная декларация в начале, глобальное использование в каждой функции и т. Д.).

+0

@ RAPH43L Можете ли вы рассказать об этом? GUI, как правило, связаны с побочными эффектами; Я бы подумал, что функциональный стиль плохой. Я всегда думаю о GUI как о месте, где ООП действительно сияет. Я бы очень хотел увидеть пример в функциональном стиле. Можете ли вы опубликовать ссылку или что-то еще? – saulspatz

+0

@saulspatz Я не совсем уверен, где вы читаете мой ответ, поскольку «функциональный стиль хорош для графического интерфейса» - не должно быть никакого преступления. Я хотел бы указать, что ООП - это «лучший» способ кодирования графических интерфейсов, и этот функционал - это подход, который не имеет многого, и включает в себя вредные привычки, такие как избыточный код, беспорядок для поддержки и т. Д. Я не знаю ни одного примера но простое тестирование/экспериментирование, где функционал может быть полезен для графических интерфейсов. – R4PH43L

+0

Вы правы. Я не знаю, как я это неправильно понял. Я оправляюсь от атаки головокружения; возможно, это и объясняет. Я думал, что моя умственная острота вернулась к нормальной жизни, но, видимо, нет. Извиняюсь. – saulspatz

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