如何解决'Nonetype'对象没有属性ID错误
我试图使用户输入推送消息成为通知。我希望用户在某个时间(例如5秒间隔)收到此通知。当我运行该应用程序时,它可以正常运行,但其他所有功能都可以正常运行,但不会显示通知,并且仅当我关闭该应用程序时才会收到错误消息。 错误:
File "C:/Users/Dell/PycharmProjects/MantraApp/main.py",line 55,in <module>
schedule.run_pending()
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\schedule\__init__.py",line 563,in run_pending
default_scheduler.run_pending()
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\schedule\__init__.py",line 94,in run_pending
self._run_job(job)
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\schedule\__init__.py",line 147,in _run_job
ret = job.run()
File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\site-packages\schedule\__init__.py",line 466,in run
ret = self.job_func()
File "C:/Users/Dell/PycharmProjects/MantraApp/main.py",line 49,in show_notification
plyer.notification.notify(title='test',message=self.root.ids.mantra_text.text)
AttributeError: 'NoneType' object has no attribute 'ids'
Process finished with exit code 1
这是我的main.py
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.button import ButtonBehavior
from kivy.uix.image import Image
from kivy.properties import StringProperty,ObjectProperty,NumericProperty
from kivy.uix.popup import Popup
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.clock import Clock
import plyer
import time
import schedule
class MainScreen(Screen,FloatLayout):
mantra_text = ObjectProperty(None)
def printMantra(self):
print(self.ids.mantra_text.text)
def icon_popup(self):
popup = Popup(title="Profile Icon",content=Popup_Content(),size_hint=(0.8,0.3))
popup.open()
class Popup_Content(RelativeLayout):
pass # contents in kv file. contains grid of profile icons.
class MainApp(App):
def build(self):
return MainScreen()
def set_profile_icon(self,image):
self.root.ids.profile_icon.source = image.source
def show_notification(self):
plyer.notification.notify(title='test',message=self.root.ids.mantra_text.text) # mantra_ text is text input id
schedule.every(5).seconds.do(MainApp().show_notification)
while 1:
schedule.run_pending()
time.sleep(1)
MainApp().run()
解决方法
调用MainApp().show_notification
时,您正在创建MainApp
的新实例(不是您正在运行的实例)并调用show_notification()
。由于您尚未调用run()
的新实例的MainApp
方法,因此它没有root
。
我建议您使用kivy.clock
安排通知时间。像这样:
class MainApp(App):
def build(self):
schedule.every(5).seconds.do(self.show_notification)
Clock.schedule_interval(lambda dt: schedule.run_pending(),1)
return MainScreen()
def set_profile_icon(self,image):
self.root.ids.profile_icon.source = image.source
def show_notification(self,*args):
plyer.notification.notify(title='test',message=self.root.ids.mantra_text.text) # mantra_ text is text input id
if __name__ == '__main__':
MainApp().run()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。