Mehrere returns in python Kivy ausführen?
Hallo, ich würde gerne bei meinem Python Programm mehrere Returns ausführen, einmal
return self.window
und einmal
return MainWindowWidget()
.Gibt es eine Möglichkeit dazu? Ich habe schon
return (self.window, MainWindowWidget())
probiert, allerdings kommt dann der folgende Errror:
App.root must be an _instance_ of Widget
Traceback (most recent call last):
[File BlaBlaBla, halt die Errors von Kivy]
Exception: Invalid instance in App.root
Worauf verweist self.window? Welche Rolle nimmt dieses Widget im Programm ein?
Ich will mit
self.window = GridLayout()
self.window.cols = 1
self.window.add_widget(Image(source="py.png"))
Ein Bild als Hintergrund hinzufügen
2 Antworten
Jede kivy-Anwendung besteht aus nur einem Hauptfenster. Folglicherweise gibt es nur ein Root Widget, welches durch den Rückgabewert von build gesetzt wird.
Entweder also, du fügst dein GridLayout dem Main Widget zu oder du machst aus dem Hauptfenster ein GridLayout. Wobei sich in deinem Fall wohl eher ein BoxLayout eignen würde.
Ein komplettes Beispiel für ein Fenster mit Hintergrundbild findest du auf GeeksForGeeks: Python | Set Background Template in kivy.
return (self.window, MainWindowWidget())
Das ist in Python durchaus möglich, ein solches Ergebnis wird ein Tupel, genauer, ein Zweiertupel, genannt. Dein Problem ist aber wohl, dass an anderer Stelle deines Programms ein solches Zweiertupel nicht verarbeitet werden kann.
Wenn deine Funktion f heißt und ein solches Tupel zurückgibt, kannst du den Aufruf so schreiben:
(window, widget) = f( )
Dadurch erhältst du für jedes Element des Tupels einen Namen und kannst die Teilergebnisse getrennt weiterverarbeiten. Könnte sein, dass das in deiner Situation hilft, den Fehler an der Aufrufstelle der Funktion zu vermeiden.
Wenn eine Funktion den Return-Befehl
return (self.window, MainWindowWidget())
ausführt, dann bewirkt diese Zeile, dass das erste Objekt des zurückgegebenen Tupels der Variablen window und das zweite Objekt der Variablen widget zugewiesen wird.
Wie genau kann ich dass dann in den Code einbauen und was für eine Funktion meinst du? und was genau macht die Zeile
?