Как удалить виджеты с другой страницы в киве - PullRequest
0 голосов
/ 29 мая 2019

У меня есть кнопка удаления, которая удаляет виджеты с другой страницы. Однако кнопка фактически не удаляет виджет. Кнопка также должна удалить объект 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 для удаления, но по какой-то причине это не работает. Я даже передал obj от on_press=self.del_button, и он все еще не работает, почему?

EDIT

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)

EDIT

Я не уверен, но я верю, что проблема может быть в моем коде 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

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

Python:

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)
...

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

1 Ответ

0 голосов
/ 01 июня 2019

Так как файл 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...