复选框以确定操作是否已完成

时间:2015-12-24 18:31:59

标签: python list dictionary tkinter

我有一个客户词典列表,格式如下:

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的那些客户端等。)

我不确定是否应该创建一个要检查的新变量,为每个要在稍后读取的字典添加一个键和一个值等等。

1 个答案:

答案 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])
    ...