Outils pour utilisateurs

Outils du site


kivy_comment_faire_un_tas_de_chose

Kivy: Comment faire un tas de chose

Comment chercher ?

Sur internet

  • Dans la doc officielle, mais les chances de trouver sont quasi nulles.
  • Dans un moteur de recherche: ça finit souvent par des posts sur stackoverflow, avec des réponses médiocres fausses, uniquement motivées par le gain de points !

Une bonne solution: Les exemples des sources de kivy

  • Télécharger les sources sur github
  • Dans votre EDI créer un projet avec uniquement les exemples
  • Rechercher dans les fichiers: si vous chercher “source:”, vous aurez la liste de tous les fichiers qui utilisent “source:”. Si c'est un kv, trouver le .py corespondant pour l'exécuter.

Des explications avec les exemples des sources

Une liste de scripts qui explique bien:

Adapter la résolution dpi sur son PC

  • Sur votre PC, définir la taille de votre fenêtre
from kivy.core.window import Window
# Les 3 lignes ci-dessous sont à commenter pour buildozer
# L'écran de mon tél fait 1280*720
k = 1.0
WS = (int(1280*k), int(720*k))
Window.size = WS

Lancer le main.py avec:

KIVY_METRICS_FONTSCALE=1.2 python3 main.py

avec une valeur “1.2” à adapter pour que vous ayez le même graphisme sur votre PC que sur votre téléphone.

Comment lister tous les widgets dans le python

Par exemple, extrait de smartcitizen main.py#L83:

# Recherche de tous les widgets de self
print([type(widget) for widget in self.walk(loopback=True)])
# Recherche de tous les widgets de Screen1
print(self.ids.sm)
f = self.ids.sm.get_screen("first")
print([type(widget) for widget in f.walk(loopback=True)])

Sortie de [type(widget) for widget in self.walk(loopback=True)] dans SmartCitizen()

<class '__main__.SmartCitizen'>,
<class 'kivy.uix.actionbar.ActionBar'>,
<class 'kivy.uix.actionbar.ActionView'>,
<class 'kivy.uix.actionbar.ActionButton'>,
<class 'kivy.uix.image.Image'>,
<class 'kivy.uix.screenmanager.ScreenManager'>,
<class '__main__.MainScreen'>,
<class 'kivy.uix.boxlayout.BoxLayout'>,
<class 'kivy.uix.label.Label'>,
<class 'kivy.uix.boxlayout.BoxLayout'>,
......

Comment passer d'une class à une autre

En fait, comment passer d'un objet à un autre !

Faire des print(de quoi ?). Commencer par

print(dir(self))

puis dans la liste des méthodes et attributs, ayez de nez. Si app est dans la liste:

print(dir(self.app))

Pourquoi définir les attributs appelés dans *.kv comme attributs de classe ?

Parce que c'est comme ça ? Quand lama fâché, lui toujours faire ainsi !

Voir l'exemple ci-dessous.

Comment changer la couleur d'un Rectangle ?

Répond aussi à la Question:

Comment définir et accéder aux attributs dans le main et le *.kv ?

Les attributs des widgets défini dans le *.kv sont accessibles depuis le main, seulement si les attributs du widget sont définis en attribut de classe.

Exemple extrait de multipong:

*.kv

<PongPaddle>:
    canvas:
        Color:
            rgb: self.rect_color
        Rectangle:
            pos: self.pos
            size: root.height/65, root.height/7
 
<Screen1>:
    ...
    ...
    paddle_0: paddle0
    ...
    ...
    PongPaddle:  # paddle_0
        id: paddle0
        pos: self.pos
    ...
    ...
    BoxLayout:
        orientation: 'horizontal'
        BoxLayout:
            size_hint_x: 0.70
            canvas:
                Color:
                    rgba: 1, 1, 1, 1
                Line:
                    points: [int(x*(root.top/720)) for x in root.points]
                    joint: 'miter'
                    width: 3
                    close: 1

extrait de main.py

    ...
    ...
class PongPaddle(Widget):
    rect_color = ListProperty([1, 1, 1])
    angle = NumericProperty(0)
    ...
    ...
class Screen1(Screen):
    ...
    ...
    def apply_paddle_red_color(self, my_num):
        if my_num == 0:
            self.paddle_0.rect_color = 1, 0, 0
    ...
    ...

Button background_color

Button:
    background_normal: ''
    background_color: 1, .3, .4, .85

Texte en gras dans un label

        Label:
            canvas.before:
                Color:
                    rgba: 1, 1, 1, 1
                Rectangle:
                    pos: self.pos
                    size: self.size
            size_hint_y: 0.10
            markup: True
            text: '[b]' + "Mon texte" + '[/b]'
            color: 1, 0, 0.5, 1

Factory

Factory peut être utilisée pour enregistrer automatiquement toute classe ou module et en instancier des classes n'importe où dans votre projet.

Réception sur Android en Multicast

Dans buildozer.spec, définir:

android.permissions = INTERNET,CHANGE_WIFI_MULTICAST_STATE,ACCESS_NETWORK_STATE,ACCESS_WIFI_STATE

Twisted dans kivy

kivy_comment_faire_un_tas_de_chose.txt · Dernière modification: 2020/10/19 09:10 de serge