这是我昨天问过的question的后续行动。我想要做的是获得一组PyGTK组合框,以便在其中一个选择值时更新。最初它们都包含相同的项目可供选择,但是当选择一个值时,该值不应再在任何其他组合框中可用(除非它在原始列表中作为副本存在)。
我已经创建了一个特定组合框应该可用的值列表,并且回答昨天问题的人也很友好地为我提供了列出框中所有当前现有项目的方法,所以我现在将“应该可用”列表与“当前可用列表”进行比较,并且仅在这两个列表不同时才开始更新组合框。一切都运作良好 - 除了每当我从组合框中删除旧内容时,所有当前选择都消失了,而我重新建立选择的尝试刚刚导致无限的相互组合更新。
我已经进行了几次搜索,但是我发现的方法都没有对我有用,所以我再次结束了,所以如果有人可以帮助我,那就太好了。这是我正在使用的代码的当前版本:
# 'combo_list' contains all the comboboxes of interest
# 'indx_in_combo_list' is the index (from 'combo_list') of the combobox which
# triggered the updating process
def changed_single_score(self, source_combo, all_scores, combo_list, indx_in_combo_list):
# append '0' so that swapping values remains possible
available_items = all_scores.split(', ') + ['0']
for i in range(len(combo_list)):
# make items unavailable that are selected in one of the boxes
selected = self.get_active_text(combo_list[i])
if selected in available_items:
available_items.remove(selected)
for indx in range(len(combo_list)):
# don't try changing the combobox which triggered updating
if indx != indx_in_combo_list:
existing_items = [model_item[0] for model_item in combo_list[indx].get_model()]
local_selection = self.get_active_text(combo_list[indx])
local_available = available_items[:]
# each box must retain its own selected item
if local_selection != None:
local_available.append(local_selection)
local_available.sort()
local_available.reverse()
existing_items.sort()
existing_items.reverse()
if existing_items != local_available:
# if I uncomment the following line the boxes are cleared
# but all selections vanish, too
#combo_list[indx].get_model().clear()
for item in local_available:
combo_list[indx].append_text(item)
# I want to make sure that the selection is retained,
# but if I do it like this I just cause emission of the
# 'changed' signal, thus I get infinite recursion again
#if local_selection != None:
# combo_list[indx].set_active(local_available.index(local_selection))
在以下上下文中调用上述函数:
combo_list[indx].connect('changed', self.changed_single_score, self.selected['scores'], combo_list, indx)
我还尝试逐个删除所有旧条目,只保留一个选择,但这也不起作用。我可能会再次忽视显而易见的解决方案,但如果有人在这里指出我会很棒!
提前多多感谢。
答案 0 :(得分:1)
您可以使用函数顶部的布尔值锁定代码,使其在填充组合框时调用它的附加信号执行。
if self.changed_single_score_locked:
return
else:
self.changed_single_score_locked = True
然后删除函数末尾的锁:
self.changed_single_score_locked = False
或者可能使用GTK API通过其他方式完全关闭信号?
编辑:改为使用handler_block。