2015-12-01 162 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