2012-07-12 44 views
0

我有下面的代码,它工作并给出了每个值。我似乎无法创建一个收集到的所有值的列表。我目前正在获得一个价值..!我试图通过以下两种方式:从条目窗口小部件获取值并创建变量列表Tkinter

def numberwritten(self, event, key, index): 
    self.values = [] 
    if not self.left[index]: 
     self.box[key].config(fg='black') 
     self.left[index] = True 
     self.values.append(self.box[key].get()) 
     print self.values 

这工作,每次被打印只是一个值,但我想一个名单,我可以分配“N”变量(值的数量随机各得到的变化时间)。

我想例如做“值%的”%I =得到的值。

+0

在我看来,你的格式化字符串是错误的,因为参数的数量不符合说明符的数量。看看Python文档(http://docs.python.org/library/stdtypes.html#string-formatting-operations)并尝试摆弄你的打印语句。 – 2012-07-12 07:22:08

+0

感谢您的链接,但我似乎无法得到它的工作,因为我需要等待,直到我的所有箱子都被填充.. = S – user2063 2012-07-12 08:37:04

+0

我改变了我的方法,因为我知道另一种方式至少有一个值的工作。 – user2063 2012-07-12 09:14:32

回答

0

self.values = []是每次调用numberwritten()所以这就是为什么要打印只是一个值时结算清单。声明self.values全球。或者在您的课__init__()功能

在每个循环迭代中打印一个值的格式条款,尝试这样的事情:

print("Value %i = %s" % (index, self.box[key].get()) 

编辑:我借用this回答下面,如果你真的想打印整个列表中的每个循环迭代:

# Map items in self.values to strings (necessary if they are not strings). 
print("All values: [%s]" % ", ".join(map(str, self.values))) 

# Use this if the contents of self.values are strings. 
print("All values: [%s]" % ", ".join(self.values)) 
+0

谢谢。我将继续组织我的代码! – user2063 2012-07-12 13:35:53

+0

你的答案的第一部分对我来说似乎是不好的建议。问题中的代码(当我写这个时)只会将值添加到'self.values'一次。这意味着,一旦有人编辑了入口小部件中的文本,该新文本将永远不会显示在“self.values”中。 – 2012-07-12 14:47:00

+0

@BryanOakley我想我可以说的是它需要在'numberwritten()'之外声明,所以每次调用这个方法时它都不是空的。 – gary 2012-07-13 01:28:19

1

您正在创建小部件的行。每行可能具有比其他行更多或更少的小部件。在某些时候,你需要得到一个代表每行数据的列表。你在问,“我怎么得到这个清单?”。我对么?

您一定要问20个关于这个简单问题的问题。问题不在于此或任何其他单一功能,而在于您的一般架构。一位非常非常聪明的程序员曾告诉我“如果你想让我理解你的代码,不要告诉我你的代码,让我看看你的数据结构”。这里的根本问题是,你没有数据结构。如果你不组织你的数据,你不能希望轻松获取数据。

这个问题没有什么难的。保留每行的条目窗口小部件列表,并在需要值时迭代该列表。下面的伪代码显示了这可能是多么的简单:

class MyApp(object): 
    def __init__(self): 
     # this represents your data model. Each item in the 
     # dict will represent one row, with the key being the 
     # row number 
     self.model = {} 

    def add_row(self, parent, row_number): 
     '''Create a new row''' 
     e1 = Entry(parent, ...) 
     e2 = Entry(parent, ...) 
     e3 = Entry(parent, ...) 
     ... 
     # save the widgets to our model 
     self.model[row_number] = [e1, e2, e3] 

    def extend_row(self, parent, row_number, n): 
     '''Add additional widgets to a row''' 
     for i in range(n): 
      e = Entry(parent, ...) 
      self.model[row_number].append(e) 

    def get_values(row_number): 
     '''Return the values in the widgets for a row, in order''' 
     result = [widget.get() for widget in self.model[row_number]] 
     return result 
+0

我正在重新组织我的代码。我还没有开始,所以这有点困难,但我感谢你的帮助。 – user2063 2012-07-12 13:13:06

+0

虽然你的答案没有解决*这个问题,但是你解决了整体设计问题。所以这个问题实际上是有价值的。 +1。 – gary 2012-07-12 13:59:41

相关问题