У меня есть кнопка удаления, которая удаляет виджеты с другой страницы. Однако кнопка на самом деле не удаляет виджет. Кнопка также должна удалить объект 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)
...
Если это причина, по которой кнопка не будет удалена, то как мне обойти эту проблему?
Поскольку файл 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()