Действие после закрытия диалогового окна в python kivy

Всем привет. Есть приложение - по нажатию на кнопку появляется диалоговое окно. При нажатии на кнопку Dоne в диалоговом окне оно должно закрываться и на стартовом лэйауте должна появляться кнопка (это методы close_dialog и new_window). Сейчас при нажатии окно действительно закрывается при помощи метода dismiss(), но вот кнопка не появляется. Подскажите, пожалуйста, почему так и как это исправить?

Предполагаю, что дело в том, что программа пытается создать кнопку в закрывающемся диалоговом окне, так ли это?

Код .ру:

from kivy.lang import Builder
from kivy.core.window import Window
from kivymd.app import MDApp
from kivy.uix.boxlayout import BoxLayout

from kivy.uix.button import Button
from kivymd.uix.label import MDLabel
from kivy.uix.gridlayout import GridLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.scrollview import ScrollView

from kivymd.uix.button import MDFlatButton
from kivymd.uix.dialog import MDDialog
from kivymd.uix.textfield import MDTextField

Window.size = (240, 426)

class ContentNavigationDrawer(BoxLayout):
    pass

class Content(BoxLayout):
    pass

class Container(BoxLayout):
    dialog = None
    button_amount = 1

    def show_dialog(self):
        if not self.dialog:
            self.dialog = MDDialog(
                title="Create new group",
                type="custom",
                content_cls=Content(),
            )
        self.dialog.open()

    def close_dialog(self, *args):
        self.dialog.dismiss()
        self.new_window()

    def new_window(self, *args):
        self.add_widget(
        MDFlatButton(text="New group", size_hint_y=None, height=100))


class testApp(MDApp, Container):
    def build(self):
        return Container()

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

Код .kv:

<Content>
    orientation: "vertical"
    spacing: "12dp"
    size_hint_y: None
    height: "120dp"

    MDCheckbox:
        hint_text: "Online"
        size_hint: (None, None)
        active: True
        pos_hint: {'center_x': .5, 'center_y': .4}

    MDTextField:
        hint_text: "Group name"

    MDFlatButton:
        id: btn1
        text: "Done"
        text_color: self.theme_cls.primary_color
        on_release: app.close_dialog()

<Container>
    orientation: "vertical"
    Screen:
        MDFloatingActionButton:
            pos_hint: {'right': 0.95, 'y': 0.05}
            theme_text_color: "Custom"
            text_color: app.theme_cls.primary_color
            on_release:
                app.show_dialog()

        NavigationLayout:
            ScreenManager:
                Screen:
                    BoxLayout:
                        orientation: 'vertical'
                        MDToolbar:
                            size_hint: 1, 0.15
                            title: "Navigation Drawer"
                            elevation: 10
                            left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]
                        Widget:

            MDNavigationDrawer:
                id: nav_drawer

                ContentNavigationDrawer:

Ответы (1 шт):

Автор решения: Владислав Стадник

программа пытается создать кнопку в закрывающемся диалоговом окне, так ли это?

В общем, да. Это потому что self - экземпляр класса. У тебя в функции добавления кнопки написано "self.add_widget()", т.е. добавить кнопку к текущему диалоговому окну. А тебе надо на начальный активити. Можно попробовать,например, в kv-файле присвоить нужному объекту, где должна находиться кнопка, id, и добавлять кнопку не в self а в виджет по этому id. Например, заменив self внутри функции new_window() на MDApp.get_running_app().root.ids["screen"], где screen - id для нужного объекта

Пример: KV (просто добавил id)

NavigationLayout:
        ScreenManager:
            Screen:
                BoxLayout:
                    orientation: 'vertical'
                    id: screen
                    MDToolbar:
                        size_hint: 1, 0.15
                        title: "Navigation Drawer"
                        elevation: 10
                        left_action_items: [['menu', lambda x: nav_drawer.toggle_nav_drawer()]]
                    Widget:

py (замена self)

def new_window(self, *args):
    MDApp.get_running_app().root.ids["screen"].add_widget(
    MDFlatButton(text="New group", size_hint_y=None, height=100))

Не знаю, насколько такой совет хорош, будьте осторожны. Вывод ids из этой команды говорит

'screen': <WeakProxy to <kivy.uix.boxlayout.BoxLayout object at 0x09CB3490>>

Так что, если знаете более надежный способ - вперед. Но этот пока работает.

→ Ссылка