[SOLVED] Boutons et application codé avec WX

Le Préambule

J’ai créé une application pour mon projet de disque dur NAS avec un RPi0.

J’avais un écran touch, mais l’utiliser que pour « poweroff » ou « reboot », ce qui es rare, c’est du gaspillage. Alors je veux installer mon écran de même type, mais que le touch est défectueux. Je dois dont installer des boutons physique.

L’application UI a été créé avec wxGlade, utilise donc le module « wxpython ». J’ai ajouter du code pour les stats système, qui s’actualise au 10 secondes avec « wx.CallLater() ».


Le problème

Mon problème n’est pas le code pour les boutons (en théorie), car je sais comment le faire en « standalone », mais mon code exige un « while ». Mais je figure mal la chose, car l’application charge l’UI, et je dois lancer une commande qui se répète au 10 secondes, pour actualiser les stats du système. Je ne peux pas, à ce que je sache, ajouter un « while », car il va « looper » dans le « while », et va ignorer le reste de l’application, car il va charger le « process thread » et le reste sera en attente.


La Question
Alors comment ont peu inclure le support de bouton dans une application de type « wx » ?


Note
Je ne poste pas mon code car wx se créer de la même manière, inutile de copier un code qui se ressemble, l’idée sera que d’expliquer, avec code d’exemple, comment ajouter cette possibilité. Mais si besoin, je poste le code requis sur demande.

Réponse

Le « while » est la solution la plus rapide pour détecter le bouton, et dans un second temps, le « while » sert a maintenir l’application actif.

Mon problème a été d’en voir un sans qu’il ce réalise. C’est que j’anticipais un problème dans le traitement de deux « wx.CallLater ». C’est que dans un autre projet, je dois partir par exemple une lecture dans un sous process pour ne pas perdre la synchronisation de l’affichage, mais je n’utilisais pas Wx.

Dans ce cas si, il est possible de garder le synchronisation de l’affichage, dans le même temps, et d’ajouter un autre plus rapide pour effectuer l’examen des boutons.

Comme j’expliquais au début de ma réponse, en fait le « while » n’est pas un pré-requis, la question des de pouvoir capter la pression quand ont le désire.

Pour éviter de surcharger pour rien en effectuant une vérification, vi ale Wx.CallLater, au 10ms par exemple, j’opte pour le 500ms, mais 1000ms marche très bien dans un contexte de boutons « poweroff » et « reboot ».


Détails
Pour ceux qui veulent les détails, voici comment je fais.

Dans mon code pour Wx, je travail dans la Class de l’application, dans le « init », je place mes codes pour surveiller mes boutons;

    self.buttonA = Button(19)
    self.buttonApressed = False
    self.buttonB = Button(26)
    self.buttonBpressed = False

Après les lignes pour le design suivent ce bout de code. À la fin du chargement du UI, dans le « init », j’ajoute mes commandes pour afficher mes changements et effectuer ma surveillance des boutons.

    self.showUpdate()
    self.getButtons()

Dans mes commandes, j’ajoute le « wx,CallLater ». Par exemple pour mes boutons;

def getButtons(self):
    if self.buttonA.is_pressed and self.buttonApressed is not True:
        self.buttonApressed = True
        os.system("sudo reboot")
    elif self.buttonA.is_pressed:
        pass
    else:
        self.buttonApressed = False
        
    if self.buttonB.is_pressed and self.buttonBpressed is not True:
        self.buttonBpressed = True
        os.system("sudo poweroff")
    elif self.buttonB.is_pressed:
        pass
    else:
        self.buttonBpressed = False
    wx.CallLater(500, self.getButtons)

Je n’ai pas testé plus rapidement que 500ms, il pourrais y avoir un « buffer » des tâches et un « latency » avec le temps. Et comme dit, dans mon projet, la précision n’est pas l’important dans le moment que les boutons sont utilisés.