【问题标题】:Checkbox to determine if an action is completed or not用于确定操作是否完成的复选框
【发布时间】:2015-12-24 18:31:58
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为while 循环和CurrentCount += 1 没有任何必要... for 循环就足够了...

标签: python list dictionary tkinter


【解决方案1】:

首先,您应该直接遍历列表,而不是使用计数器和 while 循环:

for client in dict_list:
    currentClient = Label(text='Client: ' + client['Client']).grid(row=[i], column=1)
    ...

其次,如果您使用x=Label(...).grid(...)x 将始终为 None。最佳实践是使用两个不同的语句。在这种情况下,这一点没有实际意义,因为您从不使用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])
    ...

【讨论】:

  • 感谢您迄今为止的帮助!我现在唯一遇到的问题是验证该变量实际上是由复选框修改的。我在复选框上做了一个命令来返回变量,但它总是显示为零,所以我认为我仍然做错了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多