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
Enregistrer un commentaire