Как создать новую кнопку нажатием кнопки во всплывающем окне (python kivy)

#python #kivy #kivymd

#python #kivy #kivymd

Вопрос:

Я пытаюсь создать приложение. При нажатии кнопки в правом нижнем углу экрана появляется диалоговое окно (всплывающее окно). Я хочу создать новую кнопку на главном экране при нажатии кнопки «Готово».

Я полагал, что кнопка будет отображаться так, как при нажатии кнопки «Готово» вызывается метод close_dialog «close_dialog», и этот метод впоследствии вызывает метод «new_window». Не могли бы вы рассказать мне, почему код не работает и как это исправить. Спасибо.

Code .py:

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

Code .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:

Во-первых, кнопка Done , на которую она не нажимается, потому dialog что она автоматически отключается, прежде чем вы сможете ее щелкнуть. Поэтому измените свой диалог на:

 self.dialog = MDDialog(
    title="Create new group",
    type="custom",
    content_cls=Content(),
    auto_dismiss=False
)
 

Затем вам нужно указать своему приложению, куда вы хотите вставить виджет. В настоящее время вы пытаетесь поместить ее в класс App, и это не сработает. В этом примере я помещаю ее в главное окно, но вы можете изменить ее в зависимости от того, где вы хотите:

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