回调和n输入框小工具不起作用Tkinter

时间:2012-07-11 09:17:31

标签: python events callback tkinter ttk

在下面的代码中,我需要返回返回的所有值(但是对于每一行分别)但是我已经尝试过lambda并且失败并且我没有得到任何地方。

我还有以前工作的回调定义,当我点击一个框时,它会删除灰色书写,这样我就可以继续输入黑色。

如果可能的话,我想在回调函数末尾添加输入框的值返回,而不是保留'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()

2 个答案:

答案 0 :(得分: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)并对基本数据结构(如列表和dicts)有基本的了解,那么这样的问题将不再是绊脚石。

答案 1 :(得分:0)

对于被这一行搞糊涂的python新手(比如我)

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

google的关键字是'list comprehension',这是一种以格式初始化列表的方法

  

[表达式 - 条款]

相当于代码段

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

换句话说,它会创建一个初始化为

的列表
[ StringVar, StringVar, StringVar, StringVar, ... ]

其值稍后设置。