2017-08-17 7 views
0

tkinterでクリックされているボタンの参照方法がわかりません。クリックしたときにボタンIDを取得するにはどうすればよいですか?

マイコード:例えば今

for file in files: 
    btn = Button(root, text=file).pack() 

ソースであるファイルから50個のボタンが生成されます。
しかし、いずれかのボタンをクリックすると、LASTボタンのみが参照されますが、実際に使用する/クリックしないボタンは参照されません。

私たちが実際にクリックしたオブジェクトを参照するにはthisを使用しますが、このためにPythonでは解決策が見つかりませんでした。

from tkinter import * 

root = Tk() 

files = [] #creates list to replace your actual inputs for troubleshooting purposes 
btn = [] #creates list to store the buttons ins 

for i in range(50): #this just popultes a list as a replacement for your actual inputs for troubleshooting purposes 
    files.append("Button"+str(i)) 

for i in range(len(files)): #this says for *counter* in *however many elements there are in the list files* 
    #the below line creates a button and stores it in an array we can call later, it will print the value of it's own text by referencing itself from the list that the buttons are stored in 
    btn.append(Button(root, text=files[i], command=lambda c=i: print(btn[c].cget("text")))) 
    btn[i].pack() #this packs the buttons 

root.mainloop() 

だから何これが行うことは、ボタンのリストを作成され、各ボタンがlambda c=i: print(btn[c].cget("text")でそれに割り当てられたコマンドがあります。

+1

@EthanField質問にコードを追加しないでください。 OPが[tag:python-3.x]または 'files'のリストを使用していることはありません。わからない場合は、コメントを使用して説明を入手してください。 – Lafexlos

+0

OPは既にコードを提供していましたが、私はそれを実行可能にしました。「Tkinter」と「tkinter」の違い以外には、2.xや3.xでコードが実行されることはありません。さらに、OPは 'file in file:'を宣言しました。つまり、ファイルは 'list'なので、OPは' files'のデータを提供していませんでしたが、forループを追加して50個のボタンOPはスクリプトに追加する必要があると述べた。私はまた、この質問を重複として分類することに同意しません.2つの質問は明らかに異なります。 –

+0

@EthanField _OPがファイル内のファイルに対して宣言されました。つまり、ファイルはリストです.Umm ..いいえ、 'files'は任意の反復可能(ジェネレータ、アンプオブジェクト、ジップオブジェクトなど)、どのように生成されるのかはわかりません。重複について..リンクされた質問_exactly_はOPの説明をします。どのように重複していないのですか? – Lafexlos

答えて

0

これは、以下のようなもので行うことができます。

これを分解しましょう。

lambdaは、コマンドが呼び出されるまで次のコードが実行されないように使用されます。

リスト内の要素の位置で値iが、我々はこれをしない場合、ボタンは常に内の最後のボタンを参照します、一時的な使い捨て変数cに格納されているように、我々はc=iを宣言リストの最後の実行時にはiが対応しています。

.cget("text")は、特定のtkinter要素から属性textを取得するために使用されるコマンドです。

上記の組み合わせによって、それぞれのボタンが押された後に独自の名前が印刷されるような結果が得られます。同様のロジックを使用して、必要な属性やイベントを呼び出すことができます。

+0

ありがとう!あなたは本当に私のpython-dayを保存しました! :) – cytzix

関連する問題