0

入力フィールドにeepromの内容を表示する「グリッド」のような構造を作成するためにtkinterを使用しています。

for byteRow in range (0, 16, 1):
    for byteColumn in range (0, 16, 1):
        byteEeprom = StringVar()
        self.byteEepromArray.append(byteEeprom)
        self.entryEepromArray.append(ttk.Entry(rawEeprom, width=3, textvariable = self.byteEepromArray[byteColumn+(16*byteRow)]))
        self.entryEepromArray[byteColumn+(16*byteRow)].grid(column = byteColumn, row = byteRow+2, sticky = (N, W))

上記はすべて正常に機能し、使用する関数に入力されていますself.byteEepromArray[byte].set()が、コードを変更して、eeprom の場所の 1 つを変更したい場合は、入力フィールドの 1 つの内容を変更し、return キーを押して関数eeprom と話すために呼び出されます。残念ながら、イベントが発生するのを待つのではなく、スクリプトのインポート時に関数 makeRawProbe が呼び出されています。

 for byteRow in range (0, 16, 1):
        for byteColumn in range (0, 16, 1):
            byteEeprom = StringVar()
            self.byteEepromArray.append(byteEeprom)
            self.entryEepromArray.append(ttk.Entry(rawEeprom, width=3, textvariable = self.byteEepromArray[byteColumn+(16*byteRow)]))
            self.entryEepromArray[byteColumn+(16*byteRow)].grid(column = byteColumn, row = byteRow+2, sticky = (N, W))
            self.entryEepromArray[byteColumn+(16*byteRow)].bind('<Return>', self.makeRawProbe(byteColumn+(16*byteRow)))

コマンドラインから何か奇妙なことを拾っている場合に備えて、に変更しようとしましたが、同じことが起こります。私はばかげたことをしていると思いますが、それが何であるかがわかりません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

への引数は、関数への参照bindでなければなりません。次のようなことをすると:

...bind('<Return>', self.makeRawProbe(byteColumn+(16*byteRow)))

...その後、実際に を呼び出しself.makeRawProbe(...)ており、その呼び出しの結果がバインディングに割り当てられているものです。

代わりに、関数自体への参照を渡す必要があります。関数に引数を渡す必要があるため、または何らかの種類のファクトリを使用する必要がありlambdaますfunctools.partiallambda別のライブラリをプルする必要がないので、私はそれに部分的です。

例えば:

value = byteColumn+(16*byteRow)
...bind('<Return>', lambda event, idx=value: self.makeRawProbe(idx))
于 2013-02-26T15:31:26.060 に答える