【问题标题】:attribute error when trying to create a button on MDDialog尝试在 MDDialog 上创建按钮时出现属性错误
【发布时间】:2021-04-12 17:38:41
【问题描述】:

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

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

这是用于创建 MDDialog 的 MDDialogApp.py:

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

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

【问题讨论】:

  • 我无法复制您的错误。请发帖minimal reproducible example
  • 抱歉@JohnAnderson 刚刚编辑了我的问题。
  • 您正在调用MDDialogAppTestshow_mddialog() 方法,好像它是一个静态方法,但它不是,它是一个实例方法。因此,当按下OK 按钮时,传递给dialog_callback() 方法的self 值是按钮实例,从而导致错误。这是一个非常奇怪的结构。你在某些方面受到限制吗?你能把你的build()click_button()方法移到MDDialogAppTest,这样你就可以像self.show_mddialog("error: something")一样调用show_mddialog()吗?
  • 非常感谢您的解释,现在我明白了到底发生了什么。目标是能够将 MDDialogAppTest 用于不同的 .py 文件,例如作为异常弹出窗口,以避免冗余。

标签: kivy kivy-language kivymd


【解决方案1】:

使用在另一个App 类中定义的方法的一种简单方法是扩展该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 类,你需要调整dialog_callback() 方法以允许额外的参数:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多