Как удалить виджеты с другой страницы в kivy

У меня есть кнопка удаления, которая удаляет виджеты с другой страницы. Однако кнопка на самом деле не удаляет виджет. Кнопка также должна удалить объект json, прикрепленный к виджету, но и этого не делает.

код:

    # displays the streak that was clicked on in screen two
    def display_streak(self, obj):
        self.third_screen()
        name = obj.id
        bottle = self.root.get_screen("three")
        can = self.root.get_screen('two')
        bottle.ids.del_space.add_widget(Button(id=name, text = "Delete", size=(60,25), size_hint=(None,None),
                                    font_size=18, on_press=self.del_button)) # fix later
def del_button(self, obj):
        bottle = self.root.get_screen("two")
        can = self.root.get_screen('three')
        name = obj.id

        with open("streak.json", "r+") as f:
            data = json.load(f)

        for child in self.root.screen_two.ids.streak_zone.children:
            if child.text == name:
                print("delete")
                bottle.screen_two.ids.streak_zone.remove_widget(child)

                for i in xrange(len(data)):
                    if data[i] == name:
                        data.pop(i)
                        break

                open("streak.json", "w").write(json.dump(data, sort_keys=True, indent=4))

Я пытался сравнить идентификатор кнопки в del_space с текстом внутри виджетов в streak_zone, чтобы удалить, но по какой-то причине это не работает. Я даже прошёл объект от on_press=self.del_button и всё равно не работает, как так?

РЕДАКТИРОВАТЬ

obj в display_streak() передается из условия, которое связывает функцию с виджетом кнопки:

elif delay > time.time() > self.honey:  # on time (green)
                    child.background_normal = ''
                    child.background_color = [0, 1, 0, .95]
                    child.unbind(on_press=self.early_click)
                    child.bind(on_press=self.add_score)
                    child.bind(on_press=self.display_streak)
                    child.bind(on_press=self.draw_streak)

РЕДАКТИРОВАТЬ

Я не уверен, но я считаю, что проблема может быть связана с моим кодом kivy:

<ScreenTwo>
    id: screen_two
    name: "two"
    on_leave: app.restart()
    on_enter: app.display_btn()
    ScrollView:
        GridLayout:
            cols: 2
            rows: 1
            ScrollView:
                BoxLayout:
                    id: streak_zone
                    orientation: 'vertical'
                    height: self.minimum_height

При входе на вторую страницу активируется display_btn

Питон:

def display_btn(self):
        ...

            for value in data.values():
                if value['delta'] is not None:
                    print(f"action = {value['action']}, delta = {value['delta']}, grace = {value['delay']}")
                    streak_button = StreakButton(id=(value['action']), text=value['action'],
                                                 color=(0,0,0,1), size=(400, 50),
                                                 size_hint=(None, None))
                    self.root.screen_two.ids.streak_zone.add_widget(streak_button)
...

Если это причина, по которой кнопка не будет удалена, то как мне обойти эту проблему?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
111
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку файл kv удаляет виджеты при выходе, мне нужно просто удалить элемент json с тем же идентификатором, что и виджет

def del_button(self, object):
        name = object.id

        with open("streak.json", "r") as f:
            data = json.load(f)

        with open("streak.json", "r+") as file:
            data = json.load(file)
            data.pop(name, None)
            file.seek(0)
            json.dump(data, file, indent=4)
            file.truncate()

        self.change_screen()

Другие вопросы по теме