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.
Sirius3
User
Beiträge: 17737
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: 13066
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: 14522
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: 14522
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: 17737
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: 14522
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: 14522
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: 14522
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.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

ich habe des jetzt so gemacht:

Code: Alles auswählen

 def update_all(self, dt):
        try:
            j.cancel()
        except:
            pass
und es funktioniert :D

EDIT:
aber ich galube du hast mal in einem andren thema mit den datenabnken mal zu mir gesagt ich soll try except nicht verwenden ist das immer noch so?
Benutzeravatar
__blackjack__
User
Beiträge: 13066
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MupfSpace: Das sollte so aber nicht funktionieren, weil das bedeutet das `j` jetzt eine globale Variable ist. Aber ich vermute mal das Dir das egal ist und Du kein Python und nicht programmieren lernen willst…
„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

__blackjack__ hat geschrieben: Sonntag 3. Februar 2019, 18:14 Aber ich vermute mal das Dir das egal ist und Du kein Python und nicht programmieren lernen willst…
das stimmt gar nicht wenn ich nicht programmieren lernen wollen würde dann würde ich das alles nicht machen.
:cry: :cry: :cry:
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@MupfSpace: woher kommt denn `j`? Wann erwartest Du welche Exception? `update_all` ist wohl auch der falsche Ort, wenn Du bei einer Konfigurationsänderung das Updaten abschalten willst.
MupfSpace
User
Beiträge: 169
Registriert: Montag 25. Dezember 2017, 20:26

j kommt von der if Bedingung in auto_update()
Das bedeutet wohl dass da auch das cancel stattfinden soll.
Wahrscheinlich ist es auch eine gute Idee j immer zu beenden wenn die Einstellungen verändert werden damit wenn die Zahl verändert nicht alle -alte Zahl sekunden- und alle -neue Zahl sekunden- Updatet.
Aber ich habe fest gestellt (bitte korrigiert mich wenn ich falsch liege) in einer zeile nach der Erstellung von j und in der gleichen if Bedingung geschehen muss aber wie ist das möglich wenn die if Bedingung nur geschieht wenn die Einstellungen stimmt.
Antworten