Puzzle des variables globales du fichier Kivy .kv

J'ai déclaré certaines constantes de couleur en tant que variables globales dans le fichier.kv. Ils fonctionnent dans certaines situations mais pas dans d'autres. Un exemple ColorConstants.kvest

#:kivy 2.0.0
#:set BLUE (0, 0, 1, 1)
#:set WHITE (1, 1, 1, 1)
<Header@BoxLayout>:
# color constants don't work here: NoneType errors
# font_color: WHITE
# header_color: BLUE
# need to use numeric lists for font_color, header_color
font_color: (1, 1, 1, 1)
header_color: (0, 0, 1, 1)
header_text: ""
size_hint: 1, None
height: dp(50)
canvas.before:
Color:
rgba: self.header_color
Rectangle:
size: self.size
pos: self.pos
Label:
color: root.font_color
text: root.header_text
bold: True
BoxLayout:
orientation: "vertical"
Header:
header_text: "My Header"
Label:
# color constants work here, no errors
color: BLUE
text: "This is blue text on white"
canvas.before:
Color:
rgba: WHITE
Rectangle:
size: self.size
pos: self.pos

Accompagnant ColorConstants.py:

from kivy.app import App
class ColorConstantsApp(App):
pass
ColorConstantsApp().run()

Je ne comprends pas pourquoi je peux utiliser BLUEet WHITEdans Labelmais pas dans Header. Si j'utilise WHITEet BLUEpour font_coloret header_colorau lieu de (1,1,1,1)et (0,0,1,1), je rencontre une TypeError: 'NoneType' object is not iterableerreur.


Solution du problème

Il semble que les instructions de canevas soient créées avant que le header_colorne soit attribué. Vous pouvez contourner cela en modifiant:

 rgba: self.header_color

pour:

 rgba: self.header_color if self.header_color else (0,1,0,1)

Cela vérifie simplement si header_colorest Noneet utilise autre chose dans ce cas. Ensuite, lorsque header_colorest attribué, la couleur correcte est utilisée.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"