PyGTKを使用して、最初の列にチェックボタンがあり、GMailやYahoo!に似た「すべて選択」チェックボタンが付いたリストストアを作成しようとしています。メールには、リスト内のすべてのチェックボタンをすばやく選択または選択解除する必要があります。トグルすると、リスト内のすべてのボタンがそれに一致するように変更されます。また、ボタンが押されたときの個々のボタンの状態を反映するように変更する必要があります。(すべてのボタンがチェックされている場合はチェックされ、すべてのボタンがクリアされている場合はクリアされ、そうでない場合は中間状態になります)したがって、ボタン間の関係を双方向にして、常に同期を維持するようにします。
これが私の現在の試みです。現在、「すべて選択」チェックボタンは期待どおりに機能しますが、リスト内のボタンをクリックすると、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)