Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 变量未定义,但我可以';我不知道为什么_Python_Python 3.x_User Interface_Tkinter - Fatal编程技术网

Python 变量未定义,但我可以';我不知道为什么

Python 变量未定义,但我可以';我不知道为什么,python,python-3.x,user-interface,tkinter,Python,Python 3.x,User Interface,Tkinter,我在学校做一个项目,但我的程序不断抛出一些未定义的变量,但我不知道为什么 该项目是做一个歌曲测试,用户必须猜测歌曲,并给出艺术家和每个单词的第一个字母 请注意,它尚未完成 #import modules from tkinter import * import os from random import randint #variable set up qnum = 0 loop = 0 userloop = 0 errorloop = 0 # Behind the scenes gam

我在学校做一个项目,但我的程序不断抛出一些未定义的变量,但我不知道为什么

该项目是做一个歌曲测试,用户必须猜测歌曲,并给出艺术家和每个单词的第一个字母

请注意,它尚未完成

 #import modules

from tkinter import *
import os
from random import randint

#variable set up
qnum = 0
loop = 0
userloop = 0
errorloop = 0

# Behind the scenes game stuff

def random_song():
    with open('data.txt') as f:
        lines = f.readlines()
    artist, song = lines[randint(1,43)].split(',')
    return artist.strip(), song.strip()

def song_letters():
    s = song
    first_letters = [word[0] for word in s.split(' ')]
#def question_answer_verify():    

# Designing window for registration

def register():
    global register_screen
    register_screen = Toplevel(main_screen)
    register_screen.title("Register")
    register_screen.geometry("300x250")

    global username
    global password
    global username_entry
    global password_entry
    username = StringVar()
    password = StringVar()

    Label(register_screen, text="Please enter details below", bg="blue").pack()
    Label(register_screen, text="").pack()
    username_lable = Label(register_screen, text="Username * ")
    username_lable.pack()
    username_entry = Entry(register_screen, textvariable=username)
    username_entry.pack()
    password_lable = Label(register_screen, text="Password * ")
    password_lable.pack()
    password_entry = Entry(register_screen, textvariable=password, show='*')
    password_entry.pack()
    Label(register_screen, text="").pack()
    Button(register_screen, text="Register", width=10, height=1, bg="blue", command = register_user).pack()

def main_game_screen():
    global game_screen
    main_screen.geometry("300x250")
    main_screen.title("Game Screen")
    Label(text="User: " + username1).pack()
    Label(text="").pack()
    Label(text=("Quesion ", qnum), bg="#83baff", width="300", height="2", font=("New Rail Alphabet", 15)).pack()  
    Label(text="").pack()
    Label(text="What song is this?").pack()
    Label(text="Artist: " + artist + ". Song: " + song).pack()

    global question_answer_verify

    question_answer_verify = StringVar()

    global qanswer_entry

    Label(login_screen, text="Answer").pack()
    qanswer_entry = Entry(login_screen, textvariable=qanswer_verify)
    qanswer_entry.pack()
    Label(login_screen, text="").pack()
    Label(login_screen, text="Score:" + qnum).pack()

    main_game_screen.mainloop()


# Designing window for login 

def login():
    global login_screen
    login_screen = Toplevel(main_screen)
    login_screen.title("Login")
    login_screen.geometry("300x250")
    Label(login_screen, text="Please enter details below to login").pack()
    Label(login_screen, text="").pack()

    global username_verify
    global password_verify

    username_verify = StringVar()
    password_verify = StringVar()

    global username_login_entry
    global password_login_entry

    Label(login_screen, text="Username * ").pack()
    username_login_entry = Entry(login_screen, textvariable=username_verify)
    username_login_entry.pack()
    Label(login_screen, text="").pack()
    Label(login_screen, text="Password * ").pack()
    password_login_entry = Entry(login_screen, textvariable=password_verify, show= '*')
    password_login_entry.pack()
    Label(login_screen, text="").pack()
    Button(login_screen, text="Login", width=10, height=1, command = login_verify).pack()

# Implementing event on register button

def register_user():

    username_info = username.get()
    password_info = password.get()

    file = open(username_info, "w")
    file.write(username_info + "\n")
    file.write(password_info)
    file.close()

    username_entry.delete(0, END)
    password_entry.delete(0, END)

    Label(register_screen, text="Registration Success", fg="green", font=("calibri", 11)).pack()

# Implementing event on login button 

def login_verify():
    global username1
    username1 = username_verify.get()
    password1 = password_verify.get()
    username_login_entry.delete(0, END)
    password_login_entry.delete(0, END)

    list_of_files = os.listdir()
    if username1 in list_of_files:
        file1 = open(username1, "r")
        verify = file1.read().splitlines()
        if password1 in verify:
            login_sucess()
            main_game_screen()

        else:
            password_not_recognised()

    else:
        user_not_found()

# Designing popup for login success

def login_sucess():
    global login_success_screen
    login_success_screen = Toplevel(login_screen)
    login_success_screen.title("Success")
    login_success_screen.geometry("150x100")
    Label(login_success_screen, text="Login Success").pack()
    Button(login_success_screen, text="OK", command=delete_login_success).pack()


# Designing popup for login invalid password

def password_not_recognised():
    global password_not_recog_screen
    password_not_recog_screen = Toplevel(login_screen)
    password_not_recog_screen.title("Success")
    password_not_recog_screen.geometry("150x100")
    Label(password_not_recog_screen, text="Invalid Password ").pack()
    Button(password_not_recog_screen, text="OK", command=delete_password_not_recognised).pack()

# Designing popup for user not found

def user_not_found():
    global user_not_found_screen
    user_not_found_screen = Toplevel(login_screen)
    user_not_found_screen.title("Success")
    user_not_found_screen.geometry("150x100")
    Label(user_not_found_screen, text="User Not Found").pack()
    Button(user_not_found_screen, text="OK", command=delete_user_not_found_screen).pack()

# Deleting popups

def delete_login_success():
    login_success_screen.destroy()


def delete_password_not_recognised():
    password_not_recog_screen.destroy()

def delete_user_not_found_screen():
    user_not_found_screen.destroy()

def delete_question_screen():
    game_screen.destroy()

def exitgame():
    exit()

# Designing Main(first) window

def main_account_screen():
    global main_screen
    main_screen = Tk()
    main_screen.geometry("300x250")
    main_screen.title("Account Login")
    Label(text="Welcome to Ed's Metal Music Quizz!", bg="#83baff", width="300", height="2", font=("New Rail Alphabet", 15)).pack()
    Label(text="Please login or register to play", bg="#83baff", width="300", height="1", font=("New Rail Alphabet", 11)).pack()
    Label(text="").pack()
    Button(text="Login", height="2", width="30", command = login).pack()
    Label(text="").pack()
    Button(text="Register", height="2", width="30", command=register).pack()
    Label(text="").pack() 
    Button(text="Exit Game", height="2", width="10", command=exitgame).pack()

    main_screen.mainloop()

main_account_screen()

#Main game

while loop != 10:
    qnum+1
    game_screen.mainloop()    
在VS代码中,当我登录时,它会显示:

终止:15 bash-3.2美元cd “/Users/edthwaites/Documents/Programming/Python/School/Metal Muzic 测验”;env PythonionEncoding=UTF-8 PYTHONUNBUFFERED=1 /Library/Frameworks/Python.framework/Versions/3.7/bin/python3 /Users/edthwaites/.vscode/extensions/ms-python.python-2020.1.58038/pythonFiles/ptvsd_launcher.py --默认--客户端--主机本地主机--端口51520“/Users/edthwaites/Documents/Programming/Python/School/Metal Muzic Tkinter回调回溯中的Quizz/quizzmainprogram.py“异常 (最近一次调用上次):文件 “/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/init.py”, 第1705行,在呼叫中 返回self.func(*args)文件“/Users/edthwaites/Documents/Programming/Python/School/Metal Muzic Quizz/quizzmainprogram.py”,登录验证中的第141行 main_game_screen()文件“/Users/edthwaites/Documents/Programming/Python/School/Metal Muzic “Quizz/quizzmainprogram.py”,第63行,主屏幕 标签(text=“Artist:+Artist+”.Song:+Song).pack()名称错误:未定义名称“Artist”


但是我不明白为什么在函数random_song()中定义了变量artist,所以它是一个局部变量。函数完成执行后,它的局部变量基本上被删除。您试图访问函数main_game_screen()中的变量artist,但尚未在其中定义它。您可以执行以下任一操作:

  • 使用class变量artist创建一个类
  • 从函数返回变量artist的值以重用它
  • 将变量设置为全局(这是一种糟糕的做法)

艺术家定义在哪里?它在开始时的def random_song()中定义第二个2不起作用。我也不理解makea-a-class的意思。对于第三个,你可以在脚本的顶部写下artist=None。对于第一个和第二个,网上有很多教程。第一个可能比第二个稍微难一点。只需谷歌“python类”或“python函数返回值”