Kivy AttributeError: 'NoneType' object has no attribute 'ids'

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Code: Alles auswählen

Purge log fired. Analysing...
Purge 33 log files
Purge finished!
[INFO   ] [Logger      ] Record log in C:\Users\MupfSpace\.kivy\logs\kivy_19-01-28_25.txt
[INFO   ] [Kivy        ] v1.10.1
[INFO   ] [Python      ] v3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] GLEW initialization succeeded
[INFO   ] [GL          ] Backend used <glew>
[INFO   ] [GL          ] OpenGL version <b'4.5.0 - Build 22.20.16.4771'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 620'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 5
[INFO   ] [GL          ] Shading version <b'4.50 - Build 22.20.16.4771'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Text        ] Provider: sdl2
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\uix\listview.py line 845.Called from C:\Python37\lib\site-packages\kivy\lang\builder.py line 582 by _apply_rule().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\simplelistadapter.py line 49.Called from C:\Python37\lib\site-packages\kivy\uix\listview.py line 859 by __init__().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\adapter.py line 111.Called from C:\Python37\lib\site-packages\kivy\adapters\simplelistadapter.py line 55 by __init__().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\uix\abstractview.py line 42.Called from C:\Python37\lib\site-packages\kivy\uix\listview.py line 865 by __init__().
[INFO   ] [GL          ] NPOT texture support is available
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\listadapter.py line 185.Called from <string> line 433 by <module>().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\adapter.py line 111.Called from C:\Python37\lib\site-packages\kivy\adapters\listadapter.py line 186 by __init__().
 Traceback (most recent call last):
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py", line 45, in <module>
     main(ptvsdArgs)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 265, in main
     wait=args.wait)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\__main__.py", line 256, in handle_args
     run_main(addr, name, kind, *extra, **kwargs)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_local.py", line 52, in run_main
     runner(addr, name, kind == 'module', *extra, **kwargs)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\runner.py", line 32, in run
     set_trace=False)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1283, in run
     return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\pydevd.py", line 1290, in _exec
     pydev_imports.execfile(file, globals, locals)  # execute the script
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\lib\python\ptvsd\_vendored\pydevd\_pydev_imps\_pydev_execfile.py", line 25, in execfile
     exec(compile(contents+"\n", file, 'exec'), glob, loc)
   File "c:\Users\MupfSpace\Desktop\App test1\mainpy3v6.0.py", line 784, in <module>
     main()
   File "c:\Users\MupfSpace\Desktop\App test1\mainpy3v6.0.py", line 781, in main
     app.run()
   File "C:\Python37\lib\site-packages\kivy\app.py", line 825, in run
     self.dispatch('on_start')
   File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
 TypeError: on_start() missing 1 required positional argument: 'dt'
ich bin schön langsam wirklich am verzeifeln :|
heul heul heul

villeicht habe ich ja etwas an sirius beispiel falsch verändert:
mein aktueller code lautet...

Code: Alles auswählen

class TankstellenApp(App):
    def __init__(self):
	    super().__init__()
	    self.blink = True
	    self.update = False

    def cheap_not_switched(self, instance, value):
        if value:
        	notification.notify(message="Du erhälst ab jetzt Benachrichtigungem bei günstigem Preis!\n"
                "Du kannst in den Einstellungen die Preise verändern bei denen du Benachrichtigugen erhalten willst!")
        with open(os.path.join(APP_PATH, "CheapNotify.val", "w")) as output:
            output.write(str(value))
	  
    
    @staticmethod
    def download_files():
        if not os.path.exists(APP_PATH):
            with urllib.request.urlopen(URL + "/Appfiles/files.zip") as response:
                data = BytesIO(response.read())
            with ZipFile(data) as files:
                files.extractall(STORAGE)

    def check_version(self):
        with urllib.request.urlopen(URL + "/Versionen/latest.vers") as response:
            version = response.read().decode(response.headers.get_content_charset() or "ASCII")
        with open(os.path.join(APP_PATH, "vers")) as data:
            current_version = data.read()
        self.update = version != current_version

    def update_prices(self, url, labels):
        with urllib.request.urlopen(URL + url) as response:
            prices = response.read().decode(response.headers.get_content_charset() or "ASCII")
        for label, price in zip(labels, prices.split(';')):
            label.text = price

    def on_start(self, dt):
        self.root.ids.refBUT.background_color=(0,0,0,0) if self.blink else (0,0,9,9)
        self.blink = not self.blink
        self.download_files()
        self.check_version()
        self.root.ids.UpdInf.pos_hint = {'bottom' if self.update else 'top': 1}
        ids = self.root.ids
        self.update_prices("/PreisErmitlung/OMVNBB.pri", [
            ids.sorte1, ids.preis1,
            ids.sorte2, ids.preis2,
            ids.sorte3, ids.preis3,
            ids.sorte4, ids.preis4,
            ids.sorte5, ids.preis5,
        ])
        self.update_prices("/PreisErmitlung/DRIVERSINPB.pri", [
            ids.sorte1DVP, ids.preis1DVP,
            ids.sorte2DVP, ids.preis2DVP,
            ids.sorte3DVP, ids.preis3DVP,
            ids.sorte4DVP, ids.preis4DVP,
            ids.sorte5DVP, ids.preis5DVP,
        ])
        self.update_prices("/PreisErmitlung/SHELLKGB.pri", [
            ids.sorte1KGS, ids.preis1KGS,
            ids.sorte2KGS, ids.preis2KGS,
            ids.sorte3KGS, ids.preis3KGS,
            ids.sorte4KGS, ids.preis4KGS,
            ids.sorte5KGS, ids.preis5KGS,
            ids.sorte6KGS, ids.preis6KGS,
        ])
    
    def updateinfo_gone(self, ActionPrevious):
        self.root.ids.UpdInf.pos_hint={'top':1}
    def version_selected(self, ListItemButton):
        print("^")
    def build(self):
	    self.settings_cls = SettingsWithSidebar
	    self.use_kivy_settings= False
	    return g
    def build_config(self, config):
        self.config.setdefaults('settings',{"AutoUpdate": True})
    def build_settings(self,settings):
	    settings.add_json_panel('Einstellungen', self.config, data=setting_json)

    


def main():
    app = TankstellenApp()
    Clock.schedule_interval(app.on_start, 30)
    app.run()

if __name__ == '__main__':
    main()
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Laut Doku sollte es klappen. Vielleicht ist meine Lösung auch keine, weil ich die Doku nicht verstanden habe.
When we say computer, we mean the electronic computer.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Für was ist dt überhaupt da.
Kann ich die Doku mal sehen(link)?
Ich hab aber sirius Code schon richtig bearbeitet oder?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Clock.schedule_interval erwartet als ersten Parameter den callback, also die Funktion / Methode die aufgerufen werden soll, hier on_start. Als zweiter Parameter wird das Timeout übergeben, also die Zeit in Sekunden in der der callback aufgerufen werden soll. Irgendwie scheint das Ding on_start(self) als Argument zu erkennen. Den Link zur Doku habe ich dir hier im Thread schon geteilt.
When we say computer, we mean the electronic computer.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Aber warum geht das nicht?
Sirius3
User
Beiträge: 17758
Registriert: Sonntag 21. Oktober 2012, 17:20

`on_start` benutzt Du als Clock-Callback, in Wirklichkeit ist das aber ein Hook, der beim Start der Application aufgerufen wird.
Aus meiner Sicht zeigst Du gerade zu wenig Eigeninitiative, sondern fragst gleich bei jedem kleinen Problem.
Der Code, den ich gepostet habe, sollte nur lange Erklärungen illustrieren, weil manche Konzepte am besten am Code gesehen werden können. Deine Aufgabe ist es, alles zu verstehen, anstatt nur zu kopieren. Dazu gehört auch, die Kivy-Dokumentation zu lesen: https://kivy.org/doc/stable/api-kivy.app.html
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Ich habe den Code sowohl versucht zu verstehen als auch zu größten Teil verstanden.
Ich habe auch sehr viele Probleme gelöst ohne hier zu fragen.

Es soll nicht so wirken als ob ich keine Eigeninitiative zeigen würde.
Ich habe jeden Fehler zu erst selber versucht zu beheben und erst gefragt wenn ich keine Lösung gefunden habe.

Es würde keinen Sinn ergeben den Code nur zu kopieren und ihn nicht zu verstehen deshalb habe ich ihn mir auch angesehen und dann bearbeitet und verstanden.
...

Ich habe gerade in der kivy Dokumentation nachgesehen aber nichts gefunden was mir weiter helfen könnte.
Ich habe danach auch Verschiedenes im Internet nachgesehen und selber ein paar Dinge ausprobiert habe aber keine Lösung gefunden.

Ich habe sehr viel ausprobiert und bin immer noch auf keine Lösung gekommen deshalb würde ich euch gerne noch einmal um Hilfe bitten..
Benutzeravatar
__blackjack__
User
Beiträge: 13122
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MupfSpace: Das `on_start()` die falsche Methode ist um wiederholt aufgerufen zu werden weil das die Methode ist die beim Start *einmal* aufgerufen wird, hatte ich Dir aber auch schon mal geschrieben. Das `Clock.schedule_interval()` wäre beispielsweise etwas was eigentlich *in* diese Methode gehört, weil das ja beim Start der Anwendung gemacht werden soll. Die `on_start()`-Methode wird beim Start der App vom Rahmenwerk aufgerufen. Und dabei wird *kein* Argument übergeben. Deine `on_start()` erwartet aber ein Argument – bekommt es nicht und das kracht dann halt. Das die Methode keine Argumente erwartet sieht man in der Dokumentation.

Was die Rückruffunktion als Argument bekommt und auch wie man eine aufruft die kein Argument bekommen soll, steht ebenfalls in der Dokumentation (vom `kivy.clock`-Modul – mit Codebeispiel. Wobei wie gesagt `on_start()` die falsche Methode als Rückrufziel ist, auch wenn man das `dt`-Argument beseitigt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

okay ich habe mir jetzt den Code aus der on_start() Funktion kopiert(sorry, ich hab zwar vorher gesagt ich mache das nicht aber das alles noch mal neu zu schrieben ist irrsinnig)
und zum größten teil(eigentlich alles bis auf "blink") eingefügt.

und habe dann gesagt

Code: Alles auswählen

Clock.schedule_interval(app.update_all, 30)
und es funktioniert :roll:

________________________________________________________________

Dake für eure hilfe :D
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

so ich hab jetzt Ewigkeiten rum probiert und keine Möglichkeit gefunden.
gibt es auch eine Möglichkeit

Code: Alles auswählen

Clock.schedule_interval(callback, time)
wieder zu beenden?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wirklich Ewigkeiten? Und in der Ewigkeit bist du nicht mal an der offiziellen Dokumentation zu Clock.schedule* vorbeigekommen?

https://kivy.org/doc/stable/api-kivy.cl ... scheduling
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

wenn ich es so mache:

Code: Alles auswählen

    def auto_update(self, dt):
        with open(os.path.join(APP_PATH, "AutoUpdate.val"), "r") as response:
            auto_update_bool = response.read()
        with open(os.path.join(APP_PATH, "AutoUpdateTime.val"),"r") as response:
            auto_update_time = response.read()
        if auto_update_bool == "1":
            j=Clock.schedule_interval(self.update_all, int(auto_update_time))
            j()
        else:
            j.cancel()
dann kommt dieser fehler

Code: Alles auswählen

[INFO   ] [Logger      ] Record log in C:\Users\MupfSpace\.kivy\logs\kivy_19-02-03_6.txt
[INFO   ] [Kivy        ] v1.10.1
[INFO   ] [Python      ] v3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 22:20:52) [MSC v.1916 32 bit (Intel)]
[INFO   ] [Factory     ] 194 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_gif (img_pil, img_ffpyplayer ignored)
[INFO   ] [Window      ] Provider: sdl2
[INFO   ] [GL          ] Using the "OpenGL" graphics system
[INFO   ] [GL          ] GLEW initialization succeeded
[INFO   ] [GL          ] Backend used <glew>
[INFO   ] [GL          ] OpenGL version <b'4.5.0 - Build 22.20.16.4771'>
[INFO   ] [GL          ] OpenGL vendor <b'Intel'>
[INFO   ] [GL          ] OpenGL renderer <b'Intel(R) HD Graphics 620'>
[INFO   ] [GL          ] OpenGL parsed version: 4, 5
[INFO   ] [GL          ] Shading version <b'4.50 - Build 22.20.16.4771'>
[INFO   ] [GL          ] Texture max size <16384>
[INFO   ] [GL          ] Texture max units <32>
[INFO   ] [Window      ] auto add sdl2 input provider
[INFO   ] [Window      ] virtual keyboard not allowed, single mode, not docked
[INFO   ] [Text        ] Provider: sdl2
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\uix\listview.py line 845.Called from C:\Python37\lib\site-packages\kivy\lang\builder.py line 582 by _apply_rule().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\simplelistadapter.py line 49.Called from C:\Python37\lib\site-packages\kivy\uix\listview.py line 859 by __init__().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\adapter.py line 111.Called from C:\Python37\lib\site-packages\kivy\adapters\simplelistadapter.py line 55 by __init__().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\uix\abstractview.py line 42.Called from C:\Python37\lib\site-packages\kivy\uix\listview.py line 865 by __init__().
[INFO   ] [GL          ] NPOT texture support is available
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\listadapter.py line 185.Called from <string> line 433 by <module>().
[WARNING] [Call to deprecated function __init__ in C]\Python37\lib\site-packages\kivy\adapters\adapter.py line 111.Called from C:\Python37\lib\site-packages\kivy\adapters\listadapter.py line 186 by __init__().
 Traceback (most recent call last):
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2019.1.0\pythonFiles\ptvsd_launcher.py", line 45, in <module>
     main(ptvsdArgs)
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2019.1.0\pythonFiles\lib\python\ptvsd\__main__.py", line 348, in main
     run()
   File "c:\Users\MupfSpace\.vscode\extensions\ms-python.python-2019.1.0\pythonFiles\lib\python\ptvsd\__main__.py", line 253, in run_file
     runpy.run_path(target, run_name='__main__')
   File "C:\Python37\lib\runpy.py", line 263, in run_path
     pkg_name=pkg_name, script_name=fname)
   File "C:\Python37\lib\runpy.py", line 96, in _run_module_code
     mod_name, mod_spec, pkg_name, script_name)
   File "C:\Python37\lib\runpy.py", line 85, in _run_code
     exec(code, run_globals)
   File "c:\Users\MupfSpace\Desktop\App test1\mainpy3v6.0 - Kopie.py", line 854, in <module>
     main()
   File "c:\Users\MupfSpace\Desktop\App test1\mainpy3v6.0 - Kopie.py", line 850, in main
     app.auto_update("_")
   File "c:\Users\MupfSpace\Desktop\App test1\mainpy3v6.0 - Kopie.py", line 822, in auto_update
     j.cancel()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wo in den von mir verlinkten Beispielen kommt den so etwas vor, wie du es hier hingefrickelt hast? Der ERSTE Aufruf von Clock.schedule_interval liefert dir ein Event-Objekt, das du dann canceln kannst.

Gehst du etwa auch zum Online-Haendler deiner Wahl, bestellst Ware, bekommst eine Bestellbestaetigung, und wenn du dir dann ueberlegt hast, dass du die Ware nicht willst, bestellst du NOCHMAL DAS GLEICHE, um dann gleich auf stornieren zu druecken - und dann erwartest du, dass die urspruengliche Bestellung auch magisch storniert ist? So funktioniert das doch nirgendwo in der Welt, wieso sollte das hier ploetzlich so sein?

Und zusaetzlich dazu ist das in sich natuerlich auch falsch. Warum rufst du j auf? Mit j(). Was soll das bringen? Und im else-Zweig hast du gar kein j, willst aber darauf zugreifen mit j.cancel().

Das ist alles kompletter Murks.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Ich habe ein Einstellung Menü gemacht bei dem man einstellen soll ob eine automatische Aktualisierung stattfinden soll oder nicht und wenn man es ausschaltet soll es stoppen die geht das?
Sirius3
User
Beiträge: 17758
Registriert: Sonntag 21. Oktober 2012, 17:20

Klar geht das, wenn man es richtig macht. Wie, hat __deets__ schon geschrieben: merken des Event-Objekts als Attribut und beim Canceln benutzen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Klar geht das. Programmieren kann man vieles. Aber eben nicht so, wie du es getan hast. Du musst dir die Rueckgabe des ERSTEN Clock.schedule_interval-Aufrufes merken. Und DARAUF kannst du dann cancel aufrufen. Wann du das machst ist dein Bier.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

__deets__ hat geschrieben: Sonntag 3. Februar 2019, 15:28 Du musst dir die Rueckgabe des ERSTEN Clock.schedule_interval-Aufrufes merken
welche rückgabe?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dir den Link geschickt. Darin stehen Beispiele. Dort wird Clock.schedule_irgendwas aufgerufen. Und das gibt etwas zurueck. Du hast das OBEN IN DEINEM EIGENEN CODE GEMACHT. Und dem Namen "j" zugewiesen. Du hast es falsch gemacht, aber du hast es gemacht. Wieso weisst du ploetzlich nicht, was eine Rueckgabe ist?
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

Ich glaube ich weiß was das Problem ist: wenn ich canel() anwende das existiert j nicht in der Else Bedingung.
Aber ich habe mit den Artikel nochmal durchgelesen und nichts entdeckt.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Seuzf. Nein. Du schreibst das mit

Code: Alles auswählen

Clock.schedule_interval(app.update_all, 30)
nun alles funktionieren wuerde. DAS IST DER AUFRUF VON Clock.schedule_interval UM DEN ES GEHT. Wo steht der?

Du sollst nicht *in* update_all etwas anders machen. Du musst beim anmelden von update_all als etwas, das alle 30 Sekunden (oder was die Zeitangabe da ist) dir den RUECKGABEWERT merken. Das ist deine Bestellbestaetigung fuer "einmal ein Ding alle 30 Sekunden aufrufen", und DIE kannst du dann canceln.

Du kannst nicht durch raten programmieren lernen. Wirklich nicht. Du hast offensichtlich wirklich ganz grosse Luecken schon bei absoluten Grundlagen, wie eben das Funktionen und Methoden Rueckgabewerte haben. Arbeite dich mal an kleineren Programmen heran.
Antworten