我有一个客户词典列表,格式如下:
dict_list = [{'Name of Business' : 'Amazon', 'Contact Name' : 'Jeff Bezos', 'Email' : 'Jeff@Amazon.com'}, {'Name of Business' : 'Microsoft', 'Contact Name' : 'Bill Gates', 'Email' : 'Bill@Microsoft.com'}]
并将使用tkinter
为每个客户端构建行,每个客户端旁边都有checkbox
。我稍后会添加一个button
,按下后,会根据从列表中提取的信息向每个客户发送一封电子邮件。
目前我正在做类似的事情:
ClientCount = len(dict_list)
CurrentCount = 0
while CurrentCount < ClientCount:
for i in range(ClientCount):
currentClient = Label(text='Client: ' + dict_list[i]['Client']).grid(row=[i], column=1)
currentContactName = Label(text='Contact Name: ' + dict_list[i]['Contact Name']).grid(row=[i], column=2)
currentEmail = Label(text='Contact Email: ' + dict_list[i]['Email']).grid(row=[i], column=3)
CurrentCount += 1
首先,我确信有一种更简单的方法可以做到这一点,并会采取任何建议,但主要问题是添加一个复选框,选中后,将确定是否向该客户发送电子邮件。登记/> (稍后添加的按钮将调用一个命令,该命令将检查每个客户端是否已被选中并仅发送给返回true的那些客户端等。)
我不确定是否应该创建一个要检查的新变量,为每个要在稍后读取的字典添加一个键和一个值等等。
答案 0 :(得分:2)
首先,您应该直接遍历列表而不是使用计数器和while循环:
for client in dict_list:
currentClient = Label(text='Client: ' + client['Client']).grid(row=[i], column=1)
...
其次,如果您执行x=Label(...).grid(...)
,x
将始终为无。最佳做法是使用两种不同的陈述。在这种情况下,由于你从不使用currentClient
,所以这一点没有实际意义,但你应该养成总是将它们分开的习惯。将您的小部件创建组合在一起,将您的布局组合在一起,您的GUI将更容易管理:
for client in dict_list:
clientLabel = Label(...)
contactLabel = Label(...)
emailLabel = Label(...)
clientLabel.grid(...)
contactLabel.grid(...)
emailLabel.grid(...)
第三 - 这是您的问题的答案 - 您可以为每个复选按钮创建IntVar
的实例,并将它们存储在单独的数据结构中或与您的数据一起存储。例如,要按商家名称存储它们,您可以这样做:
cbVars = {}
for client in dict_list:
...
bizname = client["Business Name"]
cbVars[bizname] = IntVar()
cb = Checkbutton(..., onvalue=1, offvalue = 0, variable = cbVars[bizname])
...