2015-12-01 126 views
0
win=Tk() 
level1=matrixmaker(4) 

def display(x,y): 
if z["text"] == " ": 
    # switch to Goodbye 
    z["text"] = level1[x][y] 
else: 
    # reset to Hi 
    z["text"] = " " 


for x in range(0,4): 
    for y in range(0,4): 
     z=Button(win,text=" ", command=display(x,y)) 
     z.grid(row=x,column=y) 

我有这段代码但我不知道如何让显示功能工作。如何在不具有硬编码变量名称的情况下调用按钮并更改文本?更改tkinter内的按钮

+0

在Tkinter中,'command'参数是_reference_函数,而不是函数本身。你必须将参数变成没有参数的'command = display'。看到这里:http://stackoverflow.com/questions/6920302/how-to-pass-arguments-to-a-button-command-in-tkinter –

+0

此外,你只有两个参数调用三个参数函数(无论如何都不能添加)。 –

+0

使用'command = lambda a = x,b = y:display(a,b)' – furas

回答

4

您不能将命令分配给具有被调用函数(display(x, y))的按钮,因为这会将此函数返回的内容(None)分配给该按钮的命令。您需要分配可调用(display)。

要做到这一点,传递参数,你需要使用lambda:

z = Button(win, text='') 
z['command'] = lambda x=x, y=y, z=z: display(x, y, z) 
z.grid(row=x, column=y) 

而且,你要改变你的display()函数接受另一个参数z使正确的按钮得到改变(并纠正缩进):

def display(x,y,z): 
    if z["text"] == " ": 
     # switch to Goodbye 
     z["text"] = level1[x][y] 
    else: 
     # reset to Hi 
     z["text"] = " " 
+0

您应该添加 - OP需要使用'def display(x,y,z)'来代替'def display(x,y)' – furas

+0

@furas感谢您指出这一点(在OP编辑它所定义的问题之前作为'def display(x,y,z)') – Jkdc