2017-11-14 13 views
2

"Five In a Row"というゲームを実装しようとしています。 ボタンを入れる15×15のリストを作成します。 (行番号と列に行番号と列番号を表示したいので、範囲(16)を使用しました)Python tkinterはどのボタンがクリックされたかを見つける

私の実装は、ボタンがクリックされたときと同じように、ラベルになります。 しかし、ユーザーがクリックするボタンはわかりません。

これをどのように実装できますか?ありがとう!

from tkinter import * 
root=Tk() 
root.wm_title("Five In a Row") 
buttonlst=[ list(range(16)) for i in range(16)] 

chess=Label(root,width=2,height=2,text='0') 

def p(button): 
    gi=button.grid_info() 
    x=gi['row'] 
    y=gi['column'] 
    button.grid_forget() 
    chess.grid(row=x,column=y) 
    buttonlst[x][y]=chess 

for i in range(16): 
    for j in range(16): 
     if i==0: 
      obj=Label(root,width=2,text=hex(j)[-1].upper()) 
     elif j==0: 
      obj=Label(root,width=2,text=hex(i)[-1].upper()) 
     else: 
      obj=Button(root,relief=FLAT,width=2,command=p(obj)) 
     obj.grid(row=i,column=j) 
     buttonlst[i][j]=obj 

root.mainloop() 

同様の質問があります。How to determine which button is pressed out of Button grid in Python TKinter?です。しかし、私はそれをかなり得ていません。

+0

これはあなたにリンクして、質問の正確な複製のように見えます。答えのどの部分が得られないのですか?あなたはもっと具体的になりますか? –

+0

@BryanOakley私は彼がボタンの情報をどのように格納しているのか分かりません。 –

+0

どのボタンが押されたかを決定したい場合は、少なくともボタン位置情報を引数として取る関数を持つことができます。 – Nae

答えて

4

ボタンインスタンスをコマンドに渡すには、2つの手順で行う必要があります。まず、ボタンを作成し、次に2番目の手順でコマンドを設定します。また、クロージャを作成するにはラムダを使用する必要があります。例えば

obj=Button(root,relief=FLAT,width=2) 
obj.configure(command=lambda button=obj: p(button)) 
+0

ありがとうございました! –

0

command = p(obj)を使用すると、実際にはpという関数が呼び出されます。パラメータ付きの関数を渡す場合は、ラムダ関数を作成する必要があります。 p関数に適切にオブジェクトを渡します

command = lambda: p(obj) 

:したがって、コマンドの割り当ては次のようになります。

+0

このコードがループ内で呼び出され、各繰り返しでobjが異なる場合、これは機能しません。 –

+0

なぜですか? 'obj'はそれ以前に割り当てられていた反復ごとに異なるので、' command'は新しいボタンごとに正しい変数参照を取ります。 –

+1

'obj'はループ中に異なりますが、ラムダはループ内で実行されないので、' obj'に格納された最後の値を取得します。 1つの説明についてはhttps://stackoverflow.com/q/13355233/7432を参照してください。 –

関連する問題