Function Python-函数中未定义变量

Function Python-函数中未定义变量,function,tkinter,undefined,python-3.7,Function,Tkinter,Undefined,Python 3.7,我试图模拟彩票,但我的函数有点问题。以下是我想做的: 运行window1() window1()-->销毁\u window1()-->window2() window2()-->销毁window2或重试()-->window1() 当我到达destroy_window1()时会发生错误,在这里我会收到以下消息:“NameError:name'e1'未定义”。我怎样才能解决这个问题 我读过,你应该在函数外预先定义变量。所以,我试着把e1=1等等,但是我得到了一条消息:“AttributeErro

我试图模拟彩票,但我的函数有点问题。以下是我想做的:

  • 运行window1()
  • window1()-->销毁\u window1()-->window2()
  • window2()-->销毁window2或重试()-->window1()
  • 当我到达destroy_window1()时会发生错误,在这里我会收到以下消息:“NameError:name'e1'未定义”。我怎样才能解决这个问题

    我读过,你应该在函数外预先定义变量。所以,我试着把e1=1等等,但是我得到了一条消息:“AttributeError:‘int’对象没有属性‘get’”。因为它是一个条目,我不知道如何预先定义它

    从tkinter导入*
    随机输入
    第1部分=列表(范围(1,51))
    第2部分=列表(范围(1,11))
    数字=[0]*7
    对于范围(5)内的n:
    数字=随机选择(第一部分)
    位置=零件1.索引(编号)
    德尔第1部分[职位]
    数字[n]=数字
    对于范围(2)中的i:
    数字=随机选择(第二部分)
    位置=零件2.索引(编号)
    第二部分[职位]
    数字[5+i]=数字
    打印(数字)
    def destroy_window1():
    全球猜测
    Guess=[e1.get()、e2.get()、e3.get()、e4.get()、e5.get()、e6.get()、e7.get()]
    毁灭
    窗口2()
    def retry():
    毁灭
    window1()
    def window1():
    master1=Tk()
    大师1.头衔(“彩票”)
    标签(master1,text=“猜测数字:”).grid(行=0)
    e1=入口(主1,宽度=2)
    e2=入口(主1,宽度=2)
    e3=入口(主1,宽度=2)
    e4=入口(主1,宽度=2)
    e5=入口(主1,宽度=2)
    e6=入口(主1,宽度=2)
    e7=入口(主1,宽度=2)
    e1.网格(行=0,列=1,padx=5)
    e2.网格(行=0,列=2,padx=5)
    e3.网格(行=0,列=3,padx=5)
    e4.网格(行=0,列=4,padx=5)
    e5.网格(行=0,列=5,padx=5)
    e6.网格(行=0,列=7,padx=5)
    e7.网格(行=0,列=8,padx=5)
    master1.grid_columnconfigure(6,minsize=20)#创建一个宽度为20的空列(第6列)
    按钮(master1,text='OK',command=destroy_window1).网格(行=3,列=3,粘性=W,pady=5)
    master1.mainloop()
    def window2():
    master2=Tk()
    master2.标题(“检查结果”)
    标签(master2,text=“绘制的数字:”).grid(行=0,列=0,粘性=W)
    标签(master2,text=“您的数字:”).grid(行=1,列=0,粘性=W)
    对于范围(7)内的n:
    标签(master2,text=number[n])。网格(行=0,列=n+1,粘性=W,padx=5)
    如果str(数字[n])==猜测[n]:
    标签(master2,text=Guess[n],bg=“green”).grid(行=1,列=n+1,粘性=W,padx=5)
    其他:
    标签(master2,text=Guess[n],bg=“red”).grid(行=1,列=n+1,粘性=W,padx=5)
    按钮(master2,text='Quit',command=master2.destroy).grid(行=3,列=3,粘性=W,pady=5)
    按钮(master2,text='Retry',command=Retry).grid(行=3,列=4,粘滞=W,pady=5)
    master2.mainloop()
    window1()
    
    我还不能投票,提前谢谢

    当我到达destroy_window1()时会发生错误,在这里我会收到以下消息:“NameError:name'e1'未定义”。我怎样才能解决这个问题

    问题是
    destroy\u window1()
    函数不知道
    e1
    变量,因为
    e1
    是在
    window1()
    函数中定义的(并且它不是全局的)

    一个简单的解决方法是将所有e变量放入
    列表
    ,并将该
    列表
    作为参数传递给
    destroy\u window1()
    函数。用一个简单的for循环创建列表,这不仅解决了您的问题,而且使您的代码更干净、更易于阅读,并且在将来更易于更改其功能

    像这样:

    def destroy_window1(e_列表):
    全球猜测
    猜测=[]
    对于e_列表中的e_项:
    Guess.append(e_item.get())
    毁灭
    窗口2()
    def window1():
    master1=Tk()
    大师1.头衔(“彩票”)
    标签(master1,text=“猜测数字:”).grid(行=0)
    e_列表=[]
    对于范围(7)中的i:
    温度=e1=入口(主1,宽度=2)
    温度网格(行=0,列=i,padx=5)
    e_列表。附加(临时)
    master1.grid_columnconfigure(6,minsize=20)#创建一个宽度为20的空列(第6列)
    按钮(master1,text='OK',command=lambda:destroy_window1(e_list)).grid(行=3,列=3,粘性=W,pady=5)
    master1.mainloop()
    

    此解决方案的一部分涉及一个
    lambda
    函数。这是因为(正如您可能已经注意到的)命令选项通常不能接受函数的参数。使用
    lambda
    函数可以实现这一点。(请阅读)

    这是因为函数中的局部变量不能被其他函数访问。对于您的情况,只需在
    window1()
    中添加
    global master1、e1、e2、e3、e4、e5、e6、e7
    作为第一条语句,使这些变量成为全局变量。同时在
    window2()
    中添加
    global master2
    。然而,使用全局变量不是一个好的实践,请尝试使用类重构代码。