【发布时间】: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 刚刚编辑了我的问题。
-
您正在调用
MDDialogAppTest的show_mddialog()方法,好像它是一个静态方法,但它不是,它是一个实例方法。因此,当按下OK按钮时,传递给dialog_callback()方法的self值是按钮实例,从而导致错误。这是一个非常奇怪的结构。你在某些方面受到限制吗?你能把你的build()和click_button()方法移到MDDialogAppTest,这样你就可以像self.show_mddialog("error: something")一样调用show_mddialog()吗? -
非常感谢您的解释,现在我明白了到底发生了什么。目标是能够将 MDDialogAppTest 用于不同的 .py 文件,例如作为异常弹出窗口,以避免冗余。
标签: kivy kivy-language kivymd