Как изменить значение ячеек в ipysheet без создания новых ячеек? - PullRequest
0 голосов
/ 04 ноября 2019

Я использую записную книжку 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

1 Ответ

0 голосов
/ 05 ноября 2019

Похоже, что это один из тех вопросов, которые вы пытаетесь ответить на неправильный вопрос.

Изменение размера листа путем изменения sheet.rows: разрешено ,но не поддерживается и плохо влияет на ячейки, которые уже существуют внутри листа, особенно если они выпадают. Вместо этого оказывается, что создание совершенно нового листа с желаемым количеством строк является предпочтительным и удивительно эффективным. Старые ячейки быстро удаляются мусором, в результате чего получается эффективная программа даже при очень быстром переключении между несколькими словарями.

Что касается изменения значения ячеек, они меняются путем непосредственного изменения .value - но при подборе отдельной ячейкиобъекты не являются предпочтительным способом выбора правильной ячейки. Вместо этого следует использовать лист [y, x] для доступа к целевой ячейке. Это, кажется, работает просто отлично.

...