【问题标题】:Why popup dismiss method causes an error? (python kivymd)为什么弹出关闭方法会导致错误? (蟒蛇kivymd)
【发布时间】:2020-12-27 20:44:02
【问题描述】:

我正在尝试制作一个应用程序。单击屏幕右下角的按钮会出现一个对话窗口(弹出窗口)。在“完成”上单击弹出窗口预计会关闭(close_dialog 方法),但由于某种原因出现 AttributeError:

AttributeError: 'grudget4App' 对象没有属性 'close_dialog'

能否请您告诉我为什么代码不起作用以及如何修复它。谢谢。

.py 代码:

from kivy.lang import Builder
from kivy.core.window import Window
from kivymd.app import MDApp
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
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
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import Screen, ScreenManager
from kivymd.uix.list import TwoLineAvatarListItem

Window.size = (288, 511)

class DialogContent(BoxLayout):
    pass

class Container(Screen):
    dialog = None

    def show_dialog(self, *args):
        '''
        Create group creation popup
        '''
        if not self.dialog:
            self.dialog = MDDialog(
                title="Create new group",
                type="custom",
                content_cls=DialogContent(),
                auto_dismiss=False
            )
        self.dialog.open()

    def close_dialog(self, *args):
        '''
        Close popup on Done click
        '''
        self.dialog.dismiss()

class grudget4App(MDApp):
    def build(self):
        container = Container()
        return container

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

.kv 代码:

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

    MDTextField:
        id: textfield
        hint_text: "Group name"

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


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

    Screen:
        NavigationLayout:
            ScreenManager:
                Screen:
                    BoxLayout:
                        orientation: 'vertical'
                        MDToolbar:
                            title: 'Demo Application'
                            left_action_items: [["menu", lambda x: nav_drawer.toggle_nav_drawer()]]
                            elevation:10
                        Widget:
            MDNavigationDrawer:
                id: nav_drawer

【问题讨论】:

    标签: python kivy kivymd


    【解决方案1】:

    方法on_release: app.close_dialog() 引用您的grudget4App 类,但您想在Container 类中调用该方法。

    因此,我们需要在您的应用中获得正确的屏幕。由于Container 是那里唯一的屏幕,也是根,您可以使用:

    on_release: app.root.close_dialog()
    

    【讨论】:

    • 谢谢。如果它不是唯一的屏幕呢?在这种情况下,我们如何获得正确的屏幕?
    • 那么你可以使用root.screens[screenIndex]或者root.get_screen["screenName"]
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 2016-03-31
    • 2017-04-24
    • 2017-06-23
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多