1

以下のコードでは、返されたすべての値を返す必要があります (ただし、行ごとに個別に) が、ラムダを試して失敗し、どこにも戻りません。

また、以前は機能していたコールバック定義もあり、ボックスをクリックすると灰色の文字が削除されるため、引き続き黒で入力できます。

可能であれば、'numberwritten' と 'callback' を保持するのではなく、コールバック関数の最後にエントリ ボックスの戻り値を追加したいと思います..これは可能ですか?

追加されるボックスの数は、self.number_boxes と等しく、1 から n の範囲で指定できます。

ありがとうございました。

更新されたコード:

    self.numbers = [StringVar() for i in xrange(self.number_boxes) ] 

    for i in xrange(self.number_boxes):
          row = (row_number +add)
          column = self.column +i
          key = "%d/%d" % (row,column)
          self.clicked = ([False] * self.number_boxes)
          self.choice_title = Label(self.frame_table, bg=self.mycolour, borderwidth=0, width=10) 
          self.choice_title.grid(row=1, column=self.column, columnspan=self.number_boxes, sticky="nsew", padx=1, pady=1) 
          self.choice_titles.append(self.choice_title)
          self.box[key] = Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", fg='grey')
          self.box[key].grid(row=row_number+add,column=self.column+i, sticky='nsew', padx=1, pady=1) 
          self.box[key].insert(0, "Value %g" % float(i+1))
          self.box[key].bind("<Button-1>", lambda event, key=key, index=i : self.callback(event, key, index))
          self.boxes.append(self.box[key])


def callback(self, event, key, index):

    for not self.clicked[index]:
         self.box[key].delete(0, END)
         self.box[key].config(fg='black')
         self.clicked[index] = True

         print self.box[key].get()
4

2 に答える 2

1

少なくともいくつかの選択肢があります。1 つには、エントリ ウィジェットを dict またはリストのリストに保存してから、インデックスをコールバックに渡すことができます。例えば:

self.box = {}
for i in xrange(self.number_boxes):
    row = row_number+add
    column = self.column+i
    key = "%d/%d" % (row,column)
    ...
    self.box[key] = Entry(...)
    self.box[key].bind("<Button-1>", lambda event, key=key: self.callback(event, key))

重要なことは、誰かがインターネットで提供する方法を選択するだけではなく、問題とそれを解決するために必要なツールを理解することです。時間をかけて lambda の仕組み (またはfunctools.partial ) を学び、リストや辞書などの基本的なデータ構造を基本的に理解していれば、このような問題は障害物ではなくなります。

于 2012-07-11T12:44:16.360 に答える
0

この行で混乱しているPython初心者(私のような)の場合

self.numbers = [StringVar() for i in xrange(self.number_boxes) ] 

グーグルへのキーワードは「リスト内包」です、これはフォーマットでリストを初期化する方法です

[式for-節]

これはスニペットと同等です

self.numbers = []
for i in xrange(self.number_boxes)
    self.numbers.append(StringVar())

つまり、次のように初期化されたリストを作成します。

[ StringVar, StringVar, StringVar, StringVar, ... ]

その値は後で設定されます。

于 2013-01-06T12:21:46.683 に答える