Всплывающий виджет не открывается повторно в Kivy

#python #python-3.x #kivy

#python #python-3.x #kivy

Вопрос:

При нажатии клавиши всплывающее окно открывается нажатием кнопки, оно закрывается, но при повторном нажатии клавиши вызов всплывающего окна выдает ошибку

WidgetException(‘Не удается добавить %r, у него уже есть родительский %r’

 import json
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.popup import Popup


def read_json(file):
    FileJson = open(file)
    ObjJsom = json.load(FileJson)
    return ObjJsom


data = read_json('Task.json')

counter = 0
task_Headline = data['Tasks'][counter]['Headline']
label = Label(text="Label test for StackoverFlow")
ConBox = BoxLayout(orientation="vertical")
clButt = Button(text="Close", size_hint=(1, 0.1))
ConBox.add_widget(label)
ConBox.add_widget(clButt)


def btn(instance):
    show_popup(ConBox)


def show_popup(conten):
    show = conten
    popupWindow = Popup(title="Popup Window", content=show)
    clButt.bind(on_press=popupWindow.dismiss)
    popupWindow.open()


class Test(App):
    def build(self):
        butt = Button(text='Press')
        butt.bind(on_press=btn)
        return butt


if __name__ == '__main__':
    Test().run()
    
  

Ответ №1:

Когда вы создаете Popup с:

 popupWindow = Popup(title="Popup Window", content=show)
  

он добавляет show к Popup экземпляру. Который устанавливает parent свойство show . Когда Popup отклоняется, создается новый Popup со строкой выше, происходит сбой, потому что show экземпляр по-прежнему считает, что его родительский экземпляр является старым Popup (даже если он был отклонен). И у любого виджета может быть только один родительский элемент. Исправление заключается в удалении show экземпляра из старого Popup следующим образом:

 def show_popup(conten):
    # make sure the content has no parent
    if conten.parent is not None:
        conten.parent.remove_widget(conten)
    show = conten
    popupWindow = Popup(title="Popup Window", content=show)
    clButt.bind(on_press=popupWindow.dismiss)
    popupWindow.open()