AttributeError: objek 'NoneType' tidak memiliki atribut 'setDelegate_' bagaimana cara memperbaikinya?

Pada dasarnya saya cukup baru mengenal python dan kivy, dan mencoba membuat aplikasi pengatur waktu yang mengeluarkan pemberitahuan setelah 20 menit untuk mengistirahatkan mata Anda. Saya menggunakan plyer untuk mengatur notifikasi, dan saya menggunakan Mac. Biasanya notifikasi tidak berfungsi karena kesalahan pyobjus tetapi saya mengatasinya. Tapi sekarang saya mengalami kesalahan baru ini.

runfile('/Users/oats/Downloads/LEAF 1.0/Source Code/LEAF 0.6 .py', wdir='/Users/oats/Downloads/LEAF 1.0/Source Code') Traceback (panggilan terakhir terakhir):

File /Users/oats/Downloads/LEAF 1.0/Source Code/LEAF 0.6 .py, baris 218, di kelas LeafApp(MDApp):

File /Users/oats/Downloads/LEAF 1.0/Source Code/LEAF 0.6 .py, baris 240, di LeafApp notifyMe(Hai Anda! istirahat sekarang!!, Anda harus mengikuti aturan 20-20-20 untuk menjaga mata Anda sehat)

File /Pengguna/oats/Downloads/LEAF 1.0/Kode Sumber/LEAF 0.6 .py, baris 231, di notifyMe notifikasi.notify(

File /Users/oats/opt/anaconda3/lib/python3.8/site-packages/plyer/facades/notification.py, baris 79, di notify self._notify(

File /Users/oats/opt/anaconda3/lib/python3.8/site-packages/plyer/platforms/macosx/notification.py, baris 38, di notify usrnotifctr.setDelegate(self)

AttributeError: objek 'NoneType' tidak memiliki atribut 'setDelegate_'

adalah pesan kesalahan lengkap. Kode saya ada di bawah.

'''

from kivymd.app import MDApp
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivymd.uix.picker import MDDatePicker
from kivymd.uix.picker import MDThemePicker
from kivy.config import Config
from kivy.uix.boxlayout import BoxLayout
from kivymd.theming import ThemableBehavior
from kivymd.uix.list import MDList
from kivy.properties import ObjectProperty
from kivymd.uix.navigationdrawer import MDNavigationDrawer
from kivy.properties import StringProperty, ListProperty
from kivy.lang import Builder
from kivy.core.window import Window
from plyer import notification
import time
import plyer


Config.set('graphics', 'width', '1600')
Config.set('graphics', 'height', '1200')


KV = '''
<Box@BoxLayout>:
    bg: .65, .48, .35, 1 
       
             

BoxLayout:
    Rectangle:    
        size: 1600, 1200

    Box:
        bg: app.theme_cls.bg_light
    Box:
        bg: app.theme_cls.bg_normal
    Box:
        bg: app.theme_cls.bg_dark
    Box:
        bg: app.theme_cls.bg_darkest
            
'''
            
screen_helper = """
ScreenManager:
    MenuScreen:
    HomeScreen:
    BreakScreen:
    SettingsScreen
        
<MenuScreen>:
    name: 'menu'
    
  
        
    MDLabel:
        rectangle:
        background_color: .65, .48, .35, 1           
        size: 300, 700
        pos_hint: {'center_x':0.1, 'center_y':0.0}
        
                
    MDLabel:
        text: "Welcome to"
        font_style: 'H2'
        size:500, 500
        pos_hint: {'center_x':0.95,'center_y':0.84}
        
    MDLabel:
        text: "LEAF"
        font_style: 'H3'
        size:500, 500
        pos_hint: {'center_x':1.045,'center_y':0.7}
        
        
    MDFlatButton:
        text: 'Calendar'
        font_style: 'H6'
        pos_hint: {'center_x':0.091,'center_y':0.65}
        on_release: app.show_date_picker()
            
            
    MDFlatButton:
        text: 'Home'
        font_style: 'H6'
        pos_hint: {'center_x':0.076,'center_y':0.57}
        on_press: root.manager.current = 'home'
        
    MDFlatButton:
        text: 'Settings'
        font_style: 'H6'
        pos_hint: {'center_x':0.09,'center_y':0.49}
        on_press: root.manager.current = 'settings'
        
            
    MDRectangleFlatButton:
        text: 'Continue'
        font_style: 'H6'
        pos_hint: {'center_x':0.61,'center_y':0.345}
        on_press: root.manager.current = 'home'
   


    
<HomeScreen>:
    name: 'home'    
                
        
    MDToolbar:
        id: toolbar
        title: "Home
        pos_hint: {"top": 1}
        elevation: 5
        left_action_items: [["menu", lambda x: nav_drawer.set_state("open")]]
        
    Widget:

        MDNavigationDrawer:
            id: nav_drawer
    
            ContentNavigationDrawer:
                orientation: 'vertical'
                padding: "8dp"
                spacing: "8dp"
                

                MDFlatButton:
                    text: 'Return to menu'
                    font_style: 'Subtitle1'
                    on_release: root.manager.current = 'menu'

                MDFlatButton:
                    text: 'Open Calendar'
                    font_style: 'Subtitle1'
                    on_release: app.show_date_picker()
                    
                MDFlatButton:
                    text: 'Open Settings'
                    font_style: 'Subtitle1'
                    on_press: root.manager.current = 'settings'



    
                    
                    
                            
                
                
            
    
<BreakScreen>:
    name: 'break'
    
<SettingsScreen>:
    name: 'settings'
    
    
    MDFlatButton:
        text: 'Return to menu'
        font_style: 'H6'
        pos_hint: {'center_x':0.1,'center_y':0.05}
        on_press: root.manager.current = 'menu'
        
    MDFlatButton:
        text: 'Change Theme'
        font_style: 'H6'
        pos_hint: {'center_x':0.85,'center_y':0.95}
        on_release: app.show_theme_picker() 
        
    MDFloatingActionButton:
        icon: 'moon-waning-crescent'
        theme_text_color: "Custom"
        md_bg_color: 0, 0.039, 0.867, 0.557
        pos_hint: {'center_x':0.9,'center_y':0.3}
        on_press: self.theme_cls.theme_style = "Dark"  # "Light"
        
    MDFloatingActionButton:
        icon: 'MDFloatingActionButton'
        icon: 'lightbulb'
        pos_hint: {'center_x':0.9,'center_y':0.1}
        on_press: self.theme_cls.theme_style = "Light"  # "Dark"
        
        
"""  

class MenuScreen(Screen):
    pass


class HomeScreen(Screen):
    pass


class BreakScreen(Screen):
    pass

class SettingsScreen(Screen):
    pass

class ContentNavigationDrawer(BoxLayout):
    pass

class DrawerList(ThemableBehavior, MDList):
    pass


    
sm = ScreenManager()
sm.add_widget(MenuScreen(name='menu'))
sm.add_widget(HomeScreen(name='profile'))
sm.add_widget(BreakScreen(name='upload'))
sm.add_widget(SettingsScreen(name='settings'))



class LeafApp(MDApp):
    
    def show_date_picker(self):
        date_dialog = MDDatePicker()
        date_dialog.open()

    def show_theme_picker(self):
        theme_dialog = MDThemePicker()
        theme_dialog.open()



    def notifyMe(ttle, msg):
        notification.notify(
            title = ttle,
            message = msg,
            timeout = 10,
    )


    if __name__ == '__main__':
        while True:
            notifyMe("Hey You! take a break now !!", "You should follow the 20-20-20 rule to keep your eyes healthy")
            time.sleep(1200)
            



    def build(self):
        screen = Builder.load_string(screen_helper)
        return screen
    
LeafApp().run()
'''

Sekali lagi terima kasih kepada siapa pun yang menghubungi kami. Saya benar-benar bingung dan butuh bantuan!


person Oats.KV    schedule 14.05.2021    source sumber
comment
Tidak yakin mengapa Anda mendapatkan kesalahan itu, tetapi LeafApp Anda tidak akan pernah berjalan karena kode Anda masuk ke loop tak terbatas (while True) bahkan sebelum aplikasi dapat dimulai.   -  person John Anderson    schedule 14.05.2021
comment
Lihat kawan, itulah yang saya pikirkan tetapi untuk beberapa alasan saya tidak tahu mengapa jika saya mengeluarkan pengatur waktunya, itu berfungsi dengan sempurna. A-aku bahkan tidak tahu   -  person Oats.KV    schedule 14.05.2021


Jawaban (1)


Coba sedikit pemfaktoran ulang kode Anda, seperti ini:

def notifyMe(self, ttle, msg):  # added "self" arg
    notification.notify(
        title=ttle,
        message=msg,
        timeout=10,
    )

def timer_loop(self):
    while True:
        self.notifyMe("Hey You! take a break now !!", "You should follow the 20-20-20 rule to keep your eyes healthy")
        time.sleep(1200)

def build(self):
    # run timer as a separate thread
    threading.Thread(target=self.timer_loop, daemon=True).start()

    screen = Builder.load_string(screen_helper)
    return screen
person John Anderson    schedule 14.05.2021
comment
Tambahkan import threading. - person John Anderson; 14.05.2021
comment
Kesalahan baru! Kode berjalan sekarang karena pemfaktoran ulang Anda (tsym). Jadi kode berfungsi tetapi notifikasi tidak? Cukup terjebak dalam hal ini.. notifikasi.notify( File /Users/oats/opt/anaconda3/lib/python3.8/site-packages/plyer/facades/notification.py, baris 79, di notify self._notify( File /Users /oats/opt/anaconda3/lib/python3.8/site-packages/plyer/platforms/macosx/notification.py, baris 38, di beri tahu usrnotifctr.setDelegate_(self) AttributeError: objek 'NoneType' tidak memiliki atribut 'setDelegate' [INFO ] [Base ] Mulai loop utama aplikasi - person Oats.KV; 14.05.2021
comment
Hai kawan, pada dasarnya saya telah mengubah kode sepenuhnya dan berhasil. Sekarang saya hanya perlu membuat semacam pengatur waktu di mana notifikasi diputar setelah dua puluh menit tetapi pengatur waktu dua puluh menit dimulai ketika sebuah tombol ditekan. Mudah-mudahan saya bisa mengetahuinya. Terima kasih lagi kawan! - person Oats.KV; 15.05.2021
comment
class LeafApp(MDApp): def show_theme_picker(self): theme_dialog = MDThemePicker() theme_dialog.open() def notify(title, text): os.system( osascript -e 'display notifikasi {} dengan judul {}' .format( teks, judul)) notify(LEAF, Hei, sudah dua puluh menit, istirahat?) def build(self): screen = Builder.load_string(screen_helper) return screen LeafApp().run() - person Oats.KV; 15.05.2021