【问题标题】:dynamically creating checkboxes from a list of checkboxes in tkinter python 2.7从 tkinter python 2.7 中的复选框列表动态创建复选框
【发布时间】:2015-07-07 21:37:05
【问题描述】:

我正在尝试从复选框列表中创建新的复选框,但在新框架中。然而,新创建的复选框在同时创建时就像单选按钮。这是代码(仅用于创建框的函数)

def printcheckbuttons():
    val=StringVar()#checkboxlist is a list of checkbox widgets
    for x in range (len(checkboxlist)):
        for ki in checkboxlist:
            if ki.var.get() != 'null':
                sale=Checkbutton(frameright,text=ki.var.get()[0:],variable=val,onvalue=ki.var.get(),offvalue='null')
                sale.val=val
                saletracker.append(sale)#saletracker is a list to track selected checkboxes in checkboxlist ant post them to a second frame
                sale.pack(anchor=NW)           
                checkboxlist.remove(ki)
                ki.destroy()
                print 'checkboxlist 1',checkboxlist
   destroyboxes(checkboxlist)#destroys and removes all checkboxes in checkbuttonlist
   print 'checkboxlist',checkboxlist
   print "saletracker ", saletracker

【问题讨论】:

  • 看起来你只是在复制一个复选框,然后破坏原来的。那有什么意义呢?为什么不保留并重新使用原件?
  • 第二个集合是原始集合的子集,允许从不同的搜索中选择多个选项。问题在于我对多个复选框有相同的 StringVar() 实例。更好地在循环中创建变量以获得适当的性能

标签: python checkbox tkinter


【解决方案1】:

您为variable 属性赋予了所有相同的值——它们都需要各自拥有自己的StringVar 实例。您需要在循环内移动 val 的创建,以便每个检查按钮都有一个唯一的 StringVar

您还有一个问题是,在创建新变量后,您没有将其设置为一个值。创建检查按钮时,您需要确保关联变量设置为 on 值或 off 值。

【讨论】:

  • 运行良好,但仍然存在没有文本的“幽灵”按钮问题。只是一个正方形。但是它没有变量值,因此在提交到数据库时不会对程序的运行产生负面影响
  • @gichmain:我对这些信息无能为力。这不是 tkinter 中的错误或限制,而是您的代码中的错误。不看代码就不可能知道你做错了什么。
【解决方案2】:

上面的代码有两个问题。首先,应该为每个创建的复选框创建变量 val 并且未能将框初始化为其中一个值。进行这两个更正后,代码运行良好。

def printcheckbuttons():
    for x in range (len(checkboxlist)):

        for ki in checkboxlist:
        #val=StringVar()
            if ki.var.get() != 'null':
                val=StringVar()
                sale=Checkbutton(frameright,text=ki.var.get()[0:],variable=val,onvalue=ki.var.get(),offvalue='null')
                sale.val=val
                saletracker.append(sale)
                sale.pack(anchor=NW)
                sale.deselect()           
                checkboxlist.remove(ki)
                ki.destroy()
                print 'checkboxlist 1',checkboxlist
   destroyboxes(checkboxlist)
   print 'checkboxlist',checkboxlist
   print "saletracker ", saletracker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2013-01-25
    • 1970-01-01
    相关资源
    最近更新 更多