2012-07-12 39 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

相關問題