Я использую записную книжку Jupyter, в которой, помимо прочего, отображается простой словарь из строки в строку (с одной пустой строкой внизу, чтобы пользователь мог добавлять новые записи в словарь). Для этого я использую ipysheet, и я заметил, что, поскольку разные словари загружались пользователем на лист несколько раз без перезапуска ядра, поток пользовательского интерфейса Jupyter Notebook замедлялся и в конечном итоге зависал.
Проведя некоторые исследования, я обнаружил, что каждая отдельная ячейка ipysheet загружалась как отдельный виджет, и решил, что проблема, вероятно, заключается в том, что я создавал слишком много виджетов и не отбрасывал их после того, как словарь былвыгружен. Я решил попытаться изменить свой код так, чтобы он когда-либо создавал ровно столько ячеек, сколько было необходимо для отображения самого большого словаря, который был загружен в память до сих пор в этой программе.
К сожалению, я обнаружил, чтоЯ не мог изменить значение ячейки, когда она уже была создана программно. Я попытался просто установить cell_object.value = target_value
, так как это казалось интерфейсом для всех других модификаций ipysheet, но обнаружил, что это не обновляет ячейки (хотя я мог изменить sheet_object.rows = new_row_number
без проблем.) - они продолжали иметь значенияисходного словаря даже после того, как новый словарь должен был быть загружен в лист.
Есть ли что-то, что я пропускаю? Пользовательский интерфейс не обновляется должным образом? Являются ли ячейки неизменяемыми типами в 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