Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python et Kivy - problème bouton-fonction en cours

Besoin d'aide pour l'utilisation de boutons simultanés avec kivy

    17 novembre 2021 à 15:50:35

    Bonjour,


    Je suis novice en python et je découvre kivy.

    Pour un projet, je dois pouvoir commander un bras robot via python. Mon problème ne porte pas sur la programmation du robot en lui-même, mais sur l'interface qui permettra de le commander.

    En effet, j'utilise kivy pour faire l'interface.

    Je souhaite une interface permettant de lancer N cycles de mouvements préprogrammés et de pouvoir arrêter le fonctionnement du robot quand je le souhaite à la fin d'un cycle en cours quelque soit ne nombre de cycles restant à effectuer.

    Dans cette interface, j'ai implémenter 3 boutons qui lancent une fonction à leurs appui : "1 cycle", "3 cycles" et "Arret". Les boutons de cycles activent la fonction "Action()" autant de fois que le nombre de cycles voulu si les conditions sont remplies ("Action()" comporte la fonction "runProgram()" qui est la consigne de mouvement).

    Les boutons de cycles fonctionnent comme je le souhaite, cependant je bloque sur un point. Lorsque j'utilise un bouton, je ne peux plus en activer un autre tant que la fonction du précédent n'est pas terminée. Cela me pose problème pour utiliser "Arret".

    Par exemple, j'appuis sur le bouton "3 cycles", le robot se met en mouvement, je décide ensuite d'utiliser le bouton "Arret" lors du 1er ou second cycle de fonctionnement, et rien ne se passe, les 3 cycles se déroulent… C'est seulement lorsque la fonction du bouton "3 cycles" est terminée que la fonction du bouton "Arret" est prise en compte.

    Mon problème est donc le suivant : est-ce possible et comment utiliser un bouton lorsqu'un autre est en "fonctionnement" ?

    Je vous joins les codes python et kivy, merci de votre aide.

    Portion du code python:

    #...from...import...fonctionnent robot...
    #... runProgram() ...
    #--------------- PROGRAMME ---------------
    
    cycle = 1
    fin = False
    state = 0
    
    def Action():
        runProgram()
        time.sleep(3)
        for joint in joints:
            joint.free()
    
    # Déclare l'écran de contrôle
    class CommandeScreen(Screen):
    
        def fonction_1(self):
    
            print('-----Bouton 1 cycle-----')
            global cycle
            cycle = 1
            global state
            state = 1
            global fin
            fin = False
    
            if state == 1:
                for i in range(cycle):
                    print('Debut cycle n°', i+1)
                    Action()
                    print('Fin cycle n°', i+1)
                    if fin == True:
                        cycle=i
                        print('Arret')
                state = 0
    
        def fonction_2(self):
    
            print('-----Bouton 3 cycles-----')
            global cycle
            cycle = 3
            global state
            state = 1
            global fin
            fin = False
    
            if state == 1:
                for i in range(cycle):
                    print('Debut cycle n°', i+1)
                    Action()
                    print('Fin cycle n°', i+1)
                    if fin == True:
                        cycle=i
                        print('Arret')
                state = 0
    
        def fonction_arret(self):
            print('Arret demmandé')
            global fin
            fin = True
    
    
    # définition de la classe principale Kivy
    class RobotApp(App):
        def build(self):
            sm = ScreenManager()
            sm.add_widget(CommandeScreen(name='commandemanuel'))
            return sm
    
    # lancement de la boucle d’attente
    if __name__ == '__main__':
        RobotApp().run()


    Code kivy:

    #:kivy 2.0.0 
    
    <CommandeScreen>: # définition de l'interface
        FloatLayout:
            Image: # définition de l'image de fond
                source: 'robot.jpg'
                allow_stretch: True
                keep_ratio: False
    
            Label: # définition du titre de l’écran
                text: 'ROBOT - COMMANDE DE CYCLES'
                color: [0,0,0,1]
                outline_color: (1,1,1,1)
                outline_width: 5
                font_size: 40
                pos_hint: {'center_x':0.5,'y':0.45}
    
            Button: # définition du premier bouton de commande et de son action
                text: '1 cycle'  
                font_size: 30
                size_hint: (0.5,0.1)
                pos_hint: {'center_x':0.5,'y':0.7}
                on_press: 
                    #root.manager.transition.direction = 'right'
                    root.manager.current = 'pause'
                on_press:
                    root.fonction_1()
    
            Button: # définition du 2ème bouton de commande et de son action
                text: '3 cycles'
                font_size: 30
                size_hint: (0.3,0.1)
                pos_hint: {'center_x':0.5,'y':0


    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2021 à 15:19:15

      je ferai une fonction cycle(nb_cycle) dans laquelle je testerai si fin vaut True pour en sortir

      cette fonction serait appelé dans l'apui des boutons avec le nombre de cycles voulues

      (tes lignes 21-36, 41-56 sont identiques au nombre de cycle près, et comme ce sont des boucles, elles doivent se terminer avant de faire autre chose)

      En complément, il faudra sûrement utiliser un gestionnaire d'évènements https://kivy.org/doc/stable/guide/events.html# 

      • Partager sur Facebook
      • Partager sur Twitter

      Python et Kivy - problème bouton-fonction en cours

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      • Editeur
      • Markdown