Python:切换按钮(添加更多按钮)

时间:2013-03-01 02:36:39

标签: python tkinter

这只是一个按钮数组的初始代码,相互影响。我无法理解为什么我一直得到这个定义错误!

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

任何帮助都将不胜感激!

3 个答案:

答案 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