IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Actions liées entre elles


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut Actions liées entre elles
    Bonjour,

    Je suis nouveau sur ce forum et mon pseudo donne la mesure de mon souci.

    J'apprends en jouant ... pour aider un étudiant étranger.
    Ces étudiants ont un projets un peu vaste et j'aide juste sur une partie (un truc style visiophone) en tant que bénévole.

    La personne voulait avoir une action multiples avec un bouton (choix de passer par GPIO sur Raspberry Pi car pays pauvre donc il faut baisser les coûts)
    Pour le moment, ça fonctionne.

    Je donne un exemple simplifié pour illustrer car facilement reproductible en phase de test :
    Si le bouton est actionné,
    ça prend une photo,
    ça envoie la photo par courriel.

    Cette action étant réalisée en intégralité, ça revient au début.

    Là, facile, même pour un débutant :-)
    J'ajoute mêmes des tas d'étapes intermédiaires sans souci.

    Maintenant, il "m'embête" car il voudrait des actions séparées mais liées.
    Si je prends le même exemple :
    Si le bouton1 est actionné,
    ça prend une photo,
    ça affiche la photo avec un texte de choix =
    - Si bouton 2 actionné = ça envoie la photo puis ça revient au début.
    - Mais si bouton 3 actionné = ça n'envoie pas la photo puis ça revient au début.

    Je dois être bête, mais je n'arrive pas à lier des actions.
    Et mes recherches restent sans résultat (je ne trouve pas d'exemples proches).

    En l'état, j'arrive à faire toutes les actions sur le bouton 1 (pas le but recherché)
    ou séparer les actions, mais pas le but recherché.

    Vous auriez la gentillesse de nous donner un coup de main sur la partie "liaison des actions" ?

    En vous remerciant,

  2. #2
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Bonjour,

    Alors si j'ai bien compris vous voulez un bouton1 qui permet de prendre la photo et éventuellement la possibilité de mettre du texte sur la photo etc ...
    Ensuite un bouton2 qui lorsque la photo est prise, permet de l'envoyer.
    Et finalement un bouton3 qui permet de revenir au début, autrement dit un statut initiale de l'application.

    Alors dès lors que vous cliquez sur un bouton (exemple : bouton1) une tâche sera lancé et se terminera si tout se passe bien dans le code (exemple : prendre une photo), dans ce cas vous pouvez faire en sorte que cette tâche à la fin retourne un booléen True si tout c'est bien passé, et False si une erreur c'est produite. Si vous cliquez ensuite sur un second bouton (exemple : bouton2) il faudra aller voir l'objet créé lors de l’exécution de la tâche du bouton1 et vérfier son état (True ou False) et ensuite envoyer ou non la photo en fonction de l'état de cet objet.

    C'est une façon de faire, mais il existe plusieurs façon d'obtenir le bon résultat tout dépend ensuite de comment vous voulez que votre application fonctionne.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 716
    Par défaut
    Salut,

    Citation Envoyé par Debutant_mais_joueur Voir le message
    Je dois être bête, mais je n'arrive pas à lier des actions.
    Et mes recherches restent sans résultat (je ne trouve pas d'exemples proches).
    La programmation est quelque chose qui s'apprend et c'est tellement peu naturel que même les personnes qui paraissent plus intelligentes que d'autres doivent s'y coller (à apprendre).
    Et c'est pas sur Internet que vous allez trouver comment écrire une boucle avec des conditions pour choisir d’exécuter A ou B mais dans un tuto.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Bonjour nekcorp

    Citation Envoyé par nekcorp Voir le message
    faire en sorte que cette tâche à la fin retourne un booléen True si tout c'est bien passé, et False si une erreur c'est produite.
    Merci pour cette intervention et cette piste (booléen True) que je vais étudier.
    Il est vrai que quand on n'y connais rien, on peut se débrouiller, mais il reste difficile de faire des recherches par manque de connaissance dans l'appellation des fonctions.

    Citation Envoyé par nekcorp Voir le message
    C'est une façon de faire, mais il existe plusieurs façon d'obtenir le bon résultat tout dépend ensuite de comment vous voulez que votre application fonctionne.
    En simplifiant :
    On allume le Raspberry et ça lance automatiquement le script python.
    (C'est une sorte de photomaton en somme)
    Si la personne appuie sur le bouton 1 = ça prend la photo puis ça demande "envoyer ? oui=bouton2 ; non=bouton3"
    On a donc - soit bouton 2 --> expédition puis retour au début (possibilité d'appuyer sur 1)
    - soit bouton 3 --> pas d’expédition puis retour au début (possibilité d'appuyer sur 1)

    Évidemment, bouton 2 et 3 ne deviennent actifs qu'après activation du bouton 1

    A bientôt,

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Bonjour wiztricks,

    Citation Envoyé par wiztricks Voir le message
    La programmation est quelque chose qui s'apprend et c'est tellement peu naturel que même les personnes qui paraissent plus intelligentes que d'autres doivent s'y coller (à apprendre).
    Si j'ai laissé cette impression, je précise donc qu'en aucun cas je ne pense être une personne plus intelligente que d'autres.
    J'ai bien conscience que la programmation est un métier et je ne prétends pas devenir codeur en qq heures. J'ai trop de respect pour les métiers/diplômes de chacun(e).
    J'ai réussi des codes python/bash/php rendant fier un simple débutant mais je sais rester à ma place ; tout comme je sais faire une pâte à pizza intégralement sans me prendre pour un boulanger ;-)
    Sans aucune formation en informatique, effectivement, je tente de lire des articles pour comprendre voire apprendre.

    Citation Envoyé par wiztricks Voir le message
    Et c'est pas sur Internet que vous allez trouver comment écrire une boucle avec des conditions pour choisir d’exécuter A ou B mais dans un tuto.
    En fait, c'est ce que je cherche ; des tutos et des exemples.
    Mais là où je me sens "bête", c'est que je n'arrive pas à trouver ce que je cherche à faire puisque je ne sais pas nommer mes recherches.

    Au plaisir,

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 716
    Par défaut
    Salut,

    Citation Envoyé par Debutant_mais_joueur Voir le message
    En fait, c'est ce que je cherche ; des tutos et des exemples.
    Mais là où je me sens "bête", c'est que je n'arrive pas à trouver ce que je cherche à faire puisque je ne sais pas nommer mes recherches.
    Parce que toute technique à son jargon et que si vous ne savez pas "nommer" plus ou moins correctement ce dont vous voulez parler, vous n'allez pas savoir quoi ni où chercher.

    Et ce jargon là, c'est justement celui que vous apprend les tutos: ils ne sont pas juste des recueil de lignes de code mais du vocabulaire autour qui vont les présenter.

    De plus, c'est ce jargon là qui va vous servir d'intermédiaire entre la description de ce que vous allez faire et comment le coder: tiens là on va mettre une liste, une condition, une fonction, une itération,...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Il est vrai que quand on n'y connais rien, on peut se débrouiller, mais il reste difficile de faire des recherches par manque de connaissance dans l'appellation des fonctions.
    Vous n'avez pas le choix, il va falloir vous plonger dans la littérature, je ne peux que vous conseiller de lire dans un premier temps l'excellent livre écrit par Gérard Swinnen, apprendre à programmer avec Python3, sans quoi vous n'arriverez pas à vous familiariser avec les linguistes du Python.

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Debutant_mais_joueur Voir le message
    J'apprends en jouant ... pour aider un étudiant étranger.
    Ca me rappelle une blague dans je ne sais plus quel film avec un vieux sage chinois qui parle d'un aveugle qui en guide un autre le long d'un précipice et qui demande ce qui va arriver...

    Citation Envoyé par Debutant_mais_joueur Voir le message
    Maintenant, il "m'embête" car il voudrait des actions séparées mais liées.
    Si je prends le même exemple :
    Si le bouton1 est actionné,
    ça prend une photo,
    ça affiche la photo avec un texte de choix =
    - Si bouton 2 actionné = ça envoie la photo puis ça revient au début.
    - Mais si bouton 3 actionné = ça n'envoie pas la photo puis ça revient au début.

    Je dois être bête, mais je n'arrive pas à lier des actions.
    Et mes recherches restent sans résultat (je ne trouve pas d'exemples proches).

    En l'état, j'arrive à faire toutes les actions sur le bouton 1 (pas le but recherché)
    ou séparer les actions, mais pas le but recherché.

    Vous auriez la gentillesse de nous donner un coup de main sur la partie "liaison des actions" ?
    Certains outils IHM ont des modules tout fait permettant de poser une question et attendre qu'on clique sur oui/non. Et si on clique sur oui le module renvoie une valeur et non il en renvoie une autre. Ca ressemble assez à ce que tu cherches à faire (action1 si bouton1 sinon action2 si bouton2).
    Et en plus le module est assez bien fait car il permet de choisir les boutons à afficher (oui, non, ok, cancel, etc). Les habitués reconnaitront ici le QMessageBox de Qt.

    Donc bon ça dépend évidemment de ta librairie IHM mais moi je vois le truc un peu de cette façon
    - l'outil prend la photo
    - l'outil affiche ce genre de boite de dialogue et selon son retour, envoie la photo ou non
    - l'outil revient au début
    ...

    Citation Envoyé par Debutant_mais_joueur Voir le message
    Si j'ai laissé cette impression, je précise donc qu'en aucun cas je ne pense être une personne plus intelligente que d'autres.
    wiztricks voulait dire que même ceux qui semblent "à l'aise" en prog doivent quand-même ouvrir un tuto chaque fois qu'ils veulent apprendre quelque chose d'autre. J'ai fait du C pendant des années mais quand j'ai voulu apprendre Python, j'ai ouvert un tuto. J'en fait maintenant depuis quelques années mais si demain je veux apprendre perl alors j'ouvrirai un tuto. Et je suis sûr que même wiztricks, qui fait du Python en H24 depuis 40000 ans , a lui aussi ouvert un tuto à ses débuts (il y a bien longtemps, dans une galaxie lointaine... )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Re,

    Désolé, un peu pris aujourd'hui.
    Voici un retour de principe.

    [Aparté]Des tutos, j'en ai lu des tas sur des tas de sujets et j'en ai même écrit quelques uns (je suis plus proche de mes 80 ans que de mes 20 ans )[/Aparté]

    Malgré mon absence de formation en informatique, j'utilise Linux depuis 20 ans donc j'ai forcément appris à chercher et trouver (et aider).
    Mais, même si je sais utiliser python pour de "simples bases basiques", je n'ai pas appris d'où mes lacunes linguistiques.
    Comme le gars qui fait de l'électricité ou du carrelage sans connaître les termes car non formé ... je n'avais pas réussi à trouver les tuto adéquats.

    Merci pour vos interventions,
    Merci pour les divers idées/pistes,
    Merci notamment pour l'axe de recherche avec booléen True.

    Vos propos m'ont permis de faire d'autres recherches et de trouver de nouvelles lectures (sujet/questions/forums/cours).
    Faute de temps, je n'ai lu que de biais mes trouvailles et il reste encore bcp de travail d'apprentissage.
    Cependant, j'ai pu pondre un script "à choix" une fois tranquille (vive les soirées).

    Ce script est bien léger pour des gens de votre rang, j'en suis conscient, mais il fonctionne et va me permettre d'avancer.

    Je ne vais pas dire que mon sujet est résolu, mais j'ose espérer qu'il est en passe de l'être.
    Au pire, j'ai plus avancé en 2h qu'en 3 jours donc mes mercis sont réels et sincères !

    Voici le code
    (pour ne pas gêner les plus jeunes enfants avec mes tests, je bosse en SSH depuis un PC Linux donc fonctionne sans les GPIO pour le moment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #!/usr/bin/python3
    # -*-coding:UTF-8 -*
     
    import os
    from datetime import datetime
     
    def Photo(nom_image):
        os.system("sudo raspistill -t 1000 -w 960 -h 720 -o "+ nom_image +"")
     
    while True: 
        print("\n--- Appuyer sur 1 et valider pour simuler le bouton ---\n")
     
        input_diff = False
        while input_diff == False:
            ordre = input()
            ordre = int(ordre)
            if ordre == 1:
                input_diff = True
                print('\nOK --> on travaille \n')
                date_du_jour = datetime.now()
                nom_image = date_du_jour.strftime('%d-%m-%Y_%H-%M-%S')
                chemin_photo = '/home/pi/Desktop/TEST/'+nom_image+'.jpeg'
                Photo(chemin_photo)
            elif ordre != 1:
                input_diff = False
                print('\nOK, OK, ... on ne fait rien !')
                print('\nDu coup, appuyer sur 1 et "entrée" ;-)')
     
     
        print("\n--> --> Yes ; C'est gagné ! \n")
     
    os.system("pause")
    Bonne soirée,

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 828
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 828
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Debutant_mais_joueur Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    input_diff = False
    while input_diff == False:
        ordre = input()
        ordre = int(ordre)
        if ordre == 1:
            input_diff = True
            print('\nOK --> on travaille \n')
            date_du_jour = datetime.now()
            nom_image = date_du_jour.strftime('%d-%m-%Y_%H-%M-%S')
            chemin_photo = '/home/pi/Desktop/TEST/'+nom_image+'.jpeg'
            Photo(chemin_photo)
        elif ordre != 1:
            input_diff = False
            print('\nOK, OK, ... on ne fait rien !')
            print('\nDu coup, appuyer sur 1 et "entrée" ;-)')
    Déjà on ne compare jamais un booléen avec True ou False. Parce que ce sont des int masqués (True vaut 1 et False vaut 0 => tente print(True+True) dans ton idle pour voir). Donc imagine que tu aies une fonction toto() qui retourne une chaine. En Python, une chaine non vide est assimilée à vrai. Mais si tu écris if toto() == True, ton test sera faux parce que littéralement, une chaine non vide n'est pas égale à 1.
    Tu peux écrire if bool(toto()) == True et ça fonctionnera mais c'est encore plus simple de tester directement l'état booléen plutôt que la valeur => if toto() ou if not toto().
    Donc ici while not input_diff...

    Ensuite d'un point de vue logique, je serais plutôt parti sur une boucle avec input_diff qui est à True plutôt qu'à False. Ce n'est pas que ça ne pourra pas fonctionner comme tu l'as écrit mais ça rend le code un peu contre intuitif. Un while continue tant que sa condition est vraie et dire "tant qu'il est vrai que input_diff sera faux" casse un peu le naturel.

    Et enfin tester si un truc, qui ne peut valoir que 1 ou "pas 1" sous forme if truc == 1 ... elif truc != 1 ... est un peu absurde => if truc == 1 ... else ....

    Par ailleurs on peut aussi jouer judicieusement du break pour éviter une variable

    Ce qui donne
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while True
    	if int(input()) == 1:
    		print('\nOK --> on travaille \n')
    		date_du_jour = datetime.now()
    		nom_image = date_du_jour.strftime('%d-%m-%Y_%H-%M-%S')
    		chemin_photo = os.path.join('/home/pi/Desktop/TEST', "%s.jpeg" % nom_image)
    		Photo(chemin_photo)			# On peut éviter "chemin_photo" en écrivant directement Photo(os.path.join(...))
    		break
    	# if
    	print('\nOK, OK, ... on ne fait rien !')
    	print('\nDu coup, appuyer sur 1 et "entrée" ;-)')
    # while
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 5
    Par défaut
    Bonjour Sve@r et merci pour le code ainsi que les explications.
    Il me reste en effet, bcp à lire sur le sujet :-)

    Le Rpi étant éteint, je corrigerai tout à l’heure et retenterai l’intégration du principe dans l’autre code (échec cette nuit).

Discussions similaires

  1. [c#][.NET 2.0] Datagrid avec 2 combobox liées entre elles
    Par axl63800 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/04/2007, 09h31
  2. Deux listes deroulantes liées entre elles
    Par killerhertz dans le forum ASP
    Réponses: 4
    Dernier message: 16/07/2006, 22h43
  3. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10
  4. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo