尝试在 MDDialog 上创建按钮时出现属性错误

attribute error when trying to create a button on MDDialog

我正在做一个单独的 class 这样,当出现异常时,弹出窗口将与 MDDialog 一起出现,我想要的是,当单击“确定”按钮时,弹出窗口将消失。很简单,不是吗?但是当我点击的时候出现这个错误:

AttributeError: 'MDRaisedButton' object has no attribute 'my_dialog'

这是MDDialogApp.py创建MDDialog:

from kivymd.app import MDApp
from kivymd.uix.button import MDRaisedButton
from kivymd.uix.dialog import MDDialog


class MDDialogAppTest(MDApp):

    def __init__(self, *args):
        super(MDDialogAppTest, self).__init__()
        self.my_dialog = None

    # Pop up for exceptions
    def show_mddialog(self, msg):
        self.my_dialog = MDDialog(
            title='Oops, an error occurred',
            text=msg,
            type='alert',
            size_hint=[.5, .5],
            auto_dismiss=False,
            buttons=[
                MDRaisedButton(
                    text="OK", on_release=self.dialog_callback
                )
            ],

        )
        self.my_dialog.open()

    def dialog_callback(self):
        self.my_dialog.dismiss()

这是我test.py重现的错误:

from kivy.lang import Builder
from kivymd.app import MDApp

from Automation.App import MDDialogApp
from Automation.App.MDDialogApp import MDDialogAppTest

KV = '''
MDFloatLayout:

    MDFlatButton:
        text: "ALERT DIALOG"
        pos_hint: {'center_x': .5, 'center_y': .5}
        on_release: app.click_button()
'''

class Example(MDApp):

    def build(self):
        self.my_dialog = None
        return Builder.load_string(KV)

    def click_button(self):
        MDDialogApp.MDDialogAppTest.show_mddialog(self=MDDialogAppTest, msg="error: something")

Example().run()

我想了解我在这里做错了什么。提前致谢!

使用另一个 App class 中定义的方法的一种简单方法是扩展那个 App。这种方法会使您的 Example 应用发生变化:

class Example(MDDialogAppTest):

    def build(self):
        self.my_dialog = None
        return Builder.load_string(KV)

    def click_button(self):
        self.show_mddialog(msg="error: something")

然后回到您的 MDDialogAppTest class,您将需要调整 dialog_callback() 方法以允许额外的参数:

def dialog_callback(self, *args):
    self.my_dialog.dismiss()