我正在运行Jupyter笔记本,除其他事项外,该笔记本显示一个简单的字符串到字符串字典(在底部有一个空行,以便用户可以向字典中添加新条目)。我正在使用ipysheet来执行此操作,并且我注意到,由于用户多次将不同的字典加载到工作表中而不重新启动内核,因此Jupyter Notebook的UI线程会变慢并最终崩溃。
[经过研究之后,我发现每个单独的ipysheet单元格都作为一个单独的小部件加载,并且我发现问题很可能是我创建了太多的小部件,并且在卸载字典后没有丢弃它们。我决定尝试更改我的代码,以便它只能创建与显示迄今为止已在此程序中加载到内存的最大的单个字典一样多的单元。
[不幸的是,我发现一旦以编程方式创建了单元格,就无法更改其值。我尝试简单地设置cell_object.value = target_value
,因为这似乎是所有其他ipysheet修改的接口,但是发现它并没有更新单元格(即使我可以毫无问题地更改sheet_object.rows = new_row_number
。)-它们继续具有值即使应该将新词典加载到工作表中,也要保留原始词典的内容。
我缺少什么吗? UI是否更新不正确? ipysheet中的单元格是不可变的类型吗?
def set_sheet_from_dictionary(self, target_dict):
key_list = list(target_dict.keys())
key_list.sort()
key_length = len(target_dict.keys())
with ipysheet.hold_cells():
self.sheet1.rows = key_length+1
for i in range(len(key_list)):
if len(self.cell_list_a) <= i:
# These would probably be better as Column objects? But I'm trying to keep it simple for now
self.cell_list_a.append(ipysheet.cell(i, 0, key_list[i], read_only=True))
self.cell_list_b.append(ipysheet.cell(i, 1, target_dict[key_list[i]]))
else:
self.cell_list_a[i].value = key_list[i]
self.cell_list_b[i].value = target_dict[key_list[i]]
if len(self.cell_list_c) == 0:
self.cell_list_c.append(ipysheet.cell(key_length, 0, ""))
self.cell_list_c.append(ipysheet.cell(key_length, 1, ""))
else:
self.cell_list_c[0].value = ""
self.cell_list_c[0].row = key_length
self.cell_list_c[1].value = ""
self.cell_list_c[1].row = key_length
似乎这是“您要回答错误问题”的问题之一。
通过更改sheet.rows来更改图纸的大小是允许,但不是受支持,并且对已经存在于图纸中的单元格产生不良影响,尤其是当它们掉落时。相反,事实证明,创建具有所需行数的全新工作表是首选的,而且效率出奇地高。旧单元会很快被垃圾回收,即使在多个字典之间切换时也非常快,因此程序效率很高。
关于更改单元格的值,可以通过直接更改.value来更改它们-但是拾取单个单元格对象不是选择正确的单元格的首选方法。而是应使用sheet [y,x]访问目标单元格。这似乎工作正常。