这只是一个按钮数组的初始代码,相互影响。我无法理解为什么我一直得到这个定义错误!
from tkinter import *
import tkinter.messagebox
from tkinter import ttk
def changeImage(Num):
global buttonOn
global buttonOff
if Num == 1:
if button1(image) == buttonOn:
button1.config(image=buttonOff)
else:
button1.config(image=buttonOn)
root = Tk()
root.geometry('155x190')
root.title("Tile Turner")
buttonOn = PhotoImage(file="buttonPic.gif")
buttonOff = PhotoImage(file="buttonPic2.gif")
button1 = Button(image=buttonOn, width=20, height=20, command=changeImage(1))
buttonQuit = Button(text="Quit", width=10, height=0, command=root.destroy)
app.grid(column=0, row=0)
button1.grid(column=2, row = 3)
buttonQuit.grid(column=3, row = 10, columnspan = 4)
root.mainloop()
我的定义错误在button1:
Traceback (most recent call last):
File "C:/Users/Jimmy/Desktop/COS 2013/Game1/small", line 23, in <module>
button1 = Button(image=buttonOn, width=20, height=20, command=changeImage(1))
File "C:/Users/Jimmy/Desktop/COS 2013/Game1/small", line 10, in changeImage
if button1(image) == buttonOn:
NameError: global name 'button1' is not defined
任何帮助都将不胜感激!
答案 0 :(得分:1)
在这一行中,
button1 = Button(image=buttonOn, width=20, height=20, command=changeImage(1))
您调用函数changeImage
作为参数传递1
。然后评估该函数,并将结果(在这种情况下为None
)传递给command=...
构造函数的Button
默认参数。当然,这会导致您获得NameError
,因为在实际将其传递给Button构造函数之前调用changeImage
- 即button1
尚不存在,因为它正在等待changeImage
函数在继续构建Button
实例之前完成。
你想要这样的东西:
button1 = Button(...,command=lambda:changeImage(1))
这会创建一个新函数,在调用时只需使用正确的参数调用changeImage
。
为了进一步详细说明lambda,上述陈述或多或少是
的简写def temp_function():
return changeImage(1)
button1 = Button(...,command=temp_function)
答案 1 :(得分:0)
尝试在button1
上方声明def changeImage(Num)
(和其他人)。 Python自上而下读取,所以即使函数没有被调用,你应该在达到这一点之前声明所有内容。
答案 2 :(得分:0)
您需要保留对图像的引用,以便您可以在事件处理程序中切换它:
def changeImage(num):
global buttonOn, buttonOff, button1
if num == 1:
newimage = buttonOff if button1.image == buttonOn else buttonOn
button1.image = newimage
button1.config(image=newimage)
# ...
button1 = Button(image=buttonOn, width=20, height=20, command=lambda:changeImage(1))
button1.image = buttonOn