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
从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
。然而,使用全局变量不是一个好的实践,请尝试使用类重构代码。