次のコードに関する私の問題は、作成された各ボックスの個別の機能を持たせるために、ラムダを介してコールバックに 'i' (数字の単純な範囲ですが、number_boxes に従って変化します) を渡すことです。
チュートリアルを読んで、自分のコードでさまざまなことを試みましたが、うまくいかないか、「lambda() には引数が 2 つしか必要ありません」などのエラーが表示されます。「i」をリストにする必要があると思いますが、私はまだこの特定のエラーが発生します..
問題が発生するコードについてコメントしました。各ボックス内の値を返すだけでなく、テキストを上書きする必要があります。
ありがとうございました。
self.clicked = [] # In my __init__ definition
self.numbers = [StringVar() for i in xrange(self.number_boxes) ] # Create Stringvar for each box
for i in xrange(self.number_boxes): # For each number, create a box
self.clicked.append(False) # Not clicked in yet
self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey')) # Textvariable where I enter a value to get after, need to do for each box (use box[i] but cannot for append)
self.box[i].grid(row=row_list,column=column+i, sticky='nsew', padx=1, pady=1)
self.box[i].insert(0, "Value %g" % float(i+1))
self.box[i].bind("<Button-1>", lambda event, index=i : self.callback(event, index)) # Need to pass the 'i's' to callback but having lambda difficulties
for i in self.numbers:
i.trace('w',lambda index=i: self.numberwritten(index) ) # Need for each box again here
def numberwritten(self, index): # A way of combining numberwritten and callback?
po = self.box[index].get() # Get the values in each box
print po
def callback(self, event, index):
if (self.clicked[index] == False): # When clicked in box, overwrite default text with value and change colour to black, not grey
self.box[index].delete(0, END)
self.box[index].config(fg='black')
self.clicked[index] = True
更新: 現在の問題: 'i' のすべての値をコールバックに渡す必要がありますが、1 つだけではなく、リストをラムダに入れる方法はありますか?
エラー:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python26\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
TypeError: lambda() takes at most 1 argument (3 given)