在Python2.7 / PyGTK中创建“全选”复选按钮

时间:2012-10-18 18:35:26

标签: python gtk pygtk

使用PyGTK,我试图在第一列中创建一个带CheckButtons的ListStore,并使用类似于GMail和Yahoo!的“Select All”CheckButton。邮件可以快速选择或取消选择列表中的每个CheckButton。如果切换,则列表中的所有按钮都应更改为与之匹配。它也应该改变以反映按下时各个按钮的状态。 (检查是否所有按钮都被选中,如果所有按钮都被清除则清除,否则处于中间状态)所以我希望按钮之间的关系是双向的,所以它们总是保持同步。

这是我目前的尝试。目前,“Select All”CheckButton按预期工作,但单击列表中的按钮只会将Select All按钮设置为其中间状态,即使我已确认3部分条件正常工作,因此其set_active方法为按预期被召唤。此外,我不确定它是如何进入无限的相互递归循环,因为每个回调触发另一个。

#store is a ListStore whose first column has been packed with a
#CellRendererToggle, checkCell

selectAllBox = gtk.CheckButton("Select All")

def OnSelectAll(toggleButton):
    toggleButton.set_inconsistent(False)
    value = toggleButton.get_active()
    def Toggle(store, path, itr, v):
        store[path][0] = v
    store.foreach(Toggle, value)

selectAllBox.connect("toggled", OnSelectAll)

def OnToggle(cellRenderer, path):
    value = not store[path][0]
    store[path][0] = value

    checked = list()
    store.foreach(lambda store, path, itr: checked.append(store[path][0]))
    if all(checked):
        selectAllBox.set_active(True)
    elif not any(checked):
        selectAllBox.set_active(False)
    else:
        selectAllBox.set_inconsistent(True)

checkCell.connect("toggled", OnToggle)

1 个答案:

答案 0 :(得分:1)

当您不希望检查按钮处于不一致状态时,请确保set_inconsistent(False)

此外,例如,GTK在将活动复选框设置为活动状态时通常不会触发信号。