0

問題

人のすべての連絡先の詳細を処理するアプリケーションを作成しています。レコードはテキスト ファイルに保存され、5 番目のインデックスから 10 番目のインデックスは、ユーザーが指定した各連絡先のニックネームで構成されます。これらすべてのニックネームのリストをボタンとして提供したいと思います。ユーザーがいずれかのボタンを選択すると、この連絡先の詳細が を使用して表示されtkSimpleDialog.showinfo('text','contact details')ます。


ゴール

  1. ボタンのリストでどのボタンがクリックされたかを判断します。
  2. これは私がよく直面する問題です: パラメータをコールバック関数に渡すこと


コード

このコードは、私が実装したいことを達成していないことに注意してください。

buttons = []

inFile = open('test','r')

for i in inFile:

    thisrecord = i    
    buttons.append(Button(self.frame,text='Name: %s' %i[5:10],command=self.show(thisrecord))

inFile.close()


私が試したこと

上記のコードを試してみると、どのボタンを押しても、ファイルに保存されている最後のレコードが毎回表示されました。そして、なぜこのようなことが起こったのかがわかりました。どうやらボタンはすべて一度に作成され、各ボタンが呼び出されるたびにコールバック関数が呼び出されます。

ボタンの数が限られている場合は、ボタンごとに関数を確実に定義して、それらをコールバックとして使用できます。これは、次のようなボタンを持つアプリケーションのウェルカム ページで行っていることadd new contactですsee details of contact

ただし、この場合、レコードの数は固定されていません。だから私はここで修正されており、何をすべきか理解していません。

さらに、チェック ボタンを使用してみました。これにより、ユーザーが見たいレコードにチェックを入れて押して続行できるようになりました。しかし、コードがそこを実行している間ではなく、チェックボタンが最初に作成されるため、これでも失敗しました。

この問題で私を助けてください。


スペック

Linux Mint 14
Python 2.7
tkinter 8.5

4

3 に答える 3

1

あなたがしているcommand=self.show(thisrecord)ことは、実際にself.show(..)パラメーターthisrecordを使用して関数を実行し、戻り値を key に割り当てることcommandです。

あなたが実際にやるべきこと:

command=partial(self.show, thisrecord)

何をするかpartialは、パラメータの凍結部分を持つ新しい関数を返すことです。


実証する別の例partial

from functools import partial

def fn(x):
    print x

functions = []
for i in range(0,3):
    functions.append(partial(fn, i))

for func in functions:
    func()
于 2013-04-16T09:07:34.350 に答える