#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()