0

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

这是我目前的尝试。目前“全选”检查按钮按预期工作,但单击列表中的按钮只会将全选按钮设置为其中间状态,即使我已经确认 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)
4

1 回答 1

1

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

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

于 2012-10-19T13:16:34.317 回答