2014-01-17 63 views
0

我目前正在嘗試用Python和tkinter創建一個戰艦遊戲。 我需要聲明100個按鈕(玩家可以觸發的每個點的一個按鈕),並且我發現我可以做到這一點,以便將它們放入10x10網格中,同時還通過變量buttons_dict存儲對它們的引用tkinter >>如何獲取按鈕引用?

from tkinter import * 
from tkinter import ttk 

root = Tk() 
board_frame = ttk.Frame(root, padding=5) 
board_frame.grid(column=0,row=0) 

COORDS_LIST = [] 
buttons_dict = {} 

for r in range(1,11): 
    for c in range(1,11): 
     coord = str(r)+"_"+str(c) 
     COORDS_LIST.append(coord) 
     buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2") 
     buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c) 

root.mainloop() 

此代碼創建100個完全按照我需要顯示的按鈕。當我想給每一個命令時,問題就開始了。我想要的是一個通用函數(我們可以稱它爲'fire_here'這個問題),每次按下其中一個按鈕時都會調用它,但是我需要它通過1或2個參數: 它可以是在創建按鈕時附加到COORDS_LIST的值,或者它可以是按鈕的「列」和「行」值。 那麼,我該怎麼做,或者如何獲得一個按鈕的行/列一旦放置?

回答

1

我想你想是這樣的:

from tkinter import * 
from tkinter import ttk 

root = Tk() 
board_frame = ttk.Frame(root, padding=5) 
board_frame.grid(column=0,row=0) 

COORDS_LIST = [] 
buttons_dict = {} 

########################################### 
def fire_here(x, y): 
    print("column:{}, row:{}".format(x, y)) 
########################################### 

for r in range(1,11): 
    for c in range(1,11): 
     coord = str(r)+"_"+str(c) 
     COORDS_LIST.append(coord) 
     buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2") 
     ########################################################################### 
     buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y) 
     ########################################################################### 
     buttons_dict[COORDS_LIST[-1]].grid(row=r,column=c) 

root.mainloop() 

所有我加的東西是在評論框。然而,最重要的部分是這樣的:

buttons_dict[COORDS_LIST[-1]]["command"] = lambda x=c, y=r: fire_here(x, y) 

基本上,它做了兩兩件事:

  1. 使用lambda,它會爲當前按鈕的command選項的功能。當按鈕被點擊時,這個函數將被調用。

  2. 它取當前列和行(網格上的按鈕座標)並將它們設置爲該函數的xy參數的默認值。而且,當函數被調用時,這些值將被髮送到fire_here進行處理。


此外,您還可以上線之上,像這樣:

buttons_dict[COORDS_LIST[-1]] = ttk.Button(board_frame, text="O", width="2", command=lambda x=c, y=r: fire_here(x, y)) 

不過,我把它放在自己的線,以改善代碼的清晰度。

+0

所以當你有lambda x = c,y = r時,它會永久存儲這些x和y值? – RGS

+1

@RSerrao - 是的,用於該功能。我上面展示的內容被認爲是更高級的Python編碼。它不應該是因爲這個概念很簡單。 'x = c'將'c'設置爲'lambda'的''x'參數的默認值。相同的概念適用於'y = r'。當函數被調用時,這些默認值被髮送到'fire_here'。 – iCodez

+0

謝謝你!比我在事件和event.widget中找到的另一個解決方案更簡單... – RGS

相關問題