Python - 函数中的变量未定义
Python - Variable in function not defined
我正在尝试模拟彩票,但我的功能有点问题。这是我正在尝试做的事情:
- 运行 窗口 1()
- window1() --> destroy_window1() --> window2()
- window2() --> 销毁 window2 或 retry() --> window1()
当我到达 destroy_window1() 时发生错误,我收到以下消息:"NameError: name 'e1' is not defined"。我该如何解决这个问题?
我听说您应该在函数外预先定义变量。所以,我尝试只输入 e1 = 1 等,但随后我收到消息:"AttributeError: 'int' object has no attribute 'get'"。既然是入口,不知道怎么预定义。
from tkinter import*
import random
Part1 = list(range(1,51))
Part2 = list(range(1,11))
Numbers = [0]*7
for n in range (5):
Number = random.choice(Part1)
Position = Part1.index(Number)
del Part1[Position]
Numbers[n] = Number
for i in range (2):
Number = random.choice(Part2)
Position = Part2.index(Number)
del Part2[Position]
Numbers[5+i] = Number
print (Numbers)
def destroy_window1():
global Guess
Guess = [e1.get(), e2.get(), e3.get(), e4.get(), e5.get(), e6.get(), e7.get()]
master1.destroy()
window2()
def retry():
master2.destroy()
window1()
def window1():
master1 = Tk()
master1.title('Lottery')
Label(master1, text="Guess numbers:").grid(row=0)
e1 = Entry(master1, width=2)
e2 = Entry(master1, width=2)
e3 = Entry(master1, width=2)
e4 = Entry(master1, width=2)
e5 = Entry(master1, width=2)
e6 = Entry(master1, width=2)
e7 = Entry(master1, width=2)
e1.grid(row=0, column=1, padx=5)
e2.grid(row=0, column=2, padx=5)
e3.grid(row=0, column=3, padx=5)
e4.grid(row=0, column=4, padx=5)
e5.grid(row=0, column=5, padx=5)
e6.grid(row=0, column=7, padx=5)
e7.grid(row=0, column=8, padx=5)
master1.grid_columnconfigure(6, minsize=20) # Creates an empty column (nr. 6) with width 20
Button(master1, text='OK', command=destroy_window1).grid(row=3, column=3, sticky=W, pady=5)
master1.mainloop()
def window2():
master2 = Tk()
master2.title('Check results')
Label(master2, text="Drawn numbers:").grid(row=0, column=0, sticky=W)
Label(master2, text="Your numbers:").grid(row=1, column=0, sticky=W)
for n in range (7):
Label(master2, text=Numbers[n]).grid(row=0, column=n+1, sticky=W, padx=5)
if str(Numbers[n]) == Guess[n]:
Label(master2, text=Guess[n], bg="green").grid(row=1, column=n+1, sticky=W, padx=5)
else:
Label(master2, text=Guess[n], bg="red").grid(row=1, column=n+1, sticky=W, padx=5)
Button(master2, text='Quit', command=master2.destroy).grid(row=3, column=3, sticky=W, pady=5)
Button(master2, text='Retry', command=retry).grid(row=3, column=4, sticky=W, pady=5)
master2.mainloop ()
window1()
我还不能投票,提前致谢!
The error occurs when I reach destroy_window1(), where i get the following message: "NameError: name 'e1' is not defined". How can I solve this problem?
问题是 destroy_window1()
函数不知道 e1
变量,因为 e1
是在 window1()
函数中定义的(而且它不是全局的).
一个简单的修复方法是将所有 e 变量放入 list
并将该 list
作为参数传递给 destroy_window1()
函数。用一个简单的 for 循环制作列表,这不仅解决了您的问题,而且还使您的代码更清晰,更易于阅读,并且将来更容易更改其功能。
像这样:
def destroy_window1(e_list):
global Guess
Guess = []
for e_item in e_list:
Guess.append(e_item.get())
master1.destroy()
window2()
def window1():
master1 = Tk()
master1.title('Lottery')
Label(master1, text="Guess numbers:").grid(row=0)
e_list = []
for i in range(7):
temp_e = e1 = Entry(master1, width=2)
temp_e.grid(row=0, column=i, padx=5)
e_list.append(temp_e)
master1.grid_columnconfigure(6, minsize=20) # Creates an empty column (nr. 6) with width 20
Button(master1, text='OK', command=lambda :destroy_window1(e_list)).grid(row=3, column=3, sticky=W, pady=5)
master1.mainloop()
此解决方案的一部分涉及 lambda
功能。这是因为(您可能已经注意到)命令选项通常不能为函数提供参数。 lambda
函数的使用使这成为可能。 (继续阅读 Lambda Functions Here)
我正在尝试模拟彩票,但我的功能有点问题。这是我正在尝试做的事情:
- 运行 窗口 1()
- window1() --> destroy_window1() --> window2()
- window2() --> 销毁 window2 或 retry() --> window1()
当我到达 destroy_window1() 时发生错误,我收到以下消息:"NameError: name 'e1' is not defined"。我该如何解决这个问题?
我听说您应该在函数外预先定义变量。所以,我尝试只输入 e1 = 1 等,但随后我收到消息:"AttributeError: 'int' object has no attribute 'get'"。既然是入口,不知道怎么预定义。
from tkinter import*
import random
Part1 = list(range(1,51))
Part2 = list(range(1,11))
Numbers = [0]*7
for n in range (5):
Number = random.choice(Part1)
Position = Part1.index(Number)
del Part1[Position]
Numbers[n] = Number
for i in range (2):
Number = random.choice(Part2)
Position = Part2.index(Number)
del Part2[Position]
Numbers[5+i] = Number
print (Numbers)
def destroy_window1():
global Guess
Guess = [e1.get(), e2.get(), e3.get(), e4.get(), e5.get(), e6.get(), e7.get()]
master1.destroy()
window2()
def retry():
master2.destroy()
window1()
def window1():
master1 = Tk()
master1.title('Lottery')
Label(master1, text="Guess numbers:").grid(row=0)
e1 = Entry(master1, width=2)
e2 = Entry(master1, width=2)
e3 = Entry(master1, width=2)
e4 = Entry(master1, width=2)
e5 = Entry(master1, width=2)
e6 = Entry(master1, width=2)
e7 = Entry(master1, width=2)
e1.grid(row=0, column=1, padx=5)
e2.grid(row=0, column=2, padx=5)
e3.grid(row=0, column=3, padx=5)
e4.grid(row=0, column=4, padx=5)
e5.grid(row=0, column=5, padx=5)
e6.grid(row=0, column=7, padx=5)
e7.grid(row=0, column=8, padx=5)
master1.grid_columnconfigure(6, minsize=20) # Creates an empty column (nr. 6) with width 20
Button(master1, text='OK', command=destroy_window1).grid(row=3, column=3, sticky=W, pady=5)
master1.mainloop()
def window2():
master2 = Tk()
master2.title('Check results')
Label(master2, text="Drawn numbers:").grid(row=0, column=0, sticky=W)
Label(master2, text="Your numbers:").grid(row=1, column=0, sticky=W)
for n in range (7):
Label(master2, text=Numbers[n]).grid(row=0, column=n+1, sticky=W, padx=5)
if str(Numbers[n]) == Guess[n]:
Label(master2, text=Guess[n], bg="green").grid(row=1, column=n+1, sticky=W, padx=5)
else:
Label(master2, text=Guess[n], bg="red").grid(row=1, column=n+1, sticky=W, padx=5)
Button(master2, text='Quit', command=master2.destroy).grid(row=3, column=3, sticky=W, pady=5)
Button(master2, text='Retry', command=retry).grid(row=3, column=4, sticky=W, pady=5)
master2.mainloop ()
window1()
我还不能投票,提前致谢!
The error occurs when I reach destroy_window1(), where i get the following message: "NameError: name 'e1' is not defined". How can I solve this problem?
问题是 destroy_window1()
函数不知道 e1
变量,因为 e1
是在 window1()
函数中定义的(而且它不是全局的).
一个简单的修复方法是将所有 e 变量放入 list
并将该 list
作为参数传递给 destroy_window1()
函数。用一个简单的 for 循环制作列表,这不仅解决了您的问题,而且还使您的代码更清晰,更易于阅读,并且将来更容易更改其功能。
像这样:
def destroy_window1(e_list):
global Guess
Guess = []
for e_item in e_list:
Guess.append(e_item.get())
master1.destroy()
window2()
def window1():
master1 = Tk()
master1.title('Lottery')
Label(master1, text="Guess numbers:").grid(row=0)
e_list = []
for i in range(7):
temp_e = e1 = Entry(master1, width=2)
temp_e.grid(row=0, column=i, padx=5)
e_list.append(temp_e)
master1.grid_columnconfigure(6, minsize=20) # Creates an empty column (nr. 6) with width 20
Button(master1, text='OK', command=lambda :destroy_window1(e_list)).grid(row=3, column=3, sticky=W, pady=5)
master1.mainloop()
此解决方案的一部分涉及 lambda
功能。这是因为(您可能已经注意到)命令选项通常不能为函数提供参数。 lambda
函数的使用使这成为可能。 (继续阅读 Lambda Functions Here)