使用 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)