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

PyQt Python Discussion :

PyQt5 et les inputs


Sujet :

PyQt Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 3
    Points
    3
    Par défaut PyQt5 et les inputs
    Bonjour à tous,

    Déjà merci pour tous les topics précédents qui m'ont beaucoup appris sur PyQt5 et Python de manière générale.

    Je vous sollicite pour un problème qui s'apparente presque plus à de l'algo mais qui concerne PyQt5.
    Dans mes projets avec ce module j'avais conçu mes fonctions du genre :

    1 -> affichage d'une question; 2 -> l'utilisateur saisie une valeur et appuie sur un bouton pour déclencher une fonction ; 3 -> action

    Récemment j'ai souhaité intégrer un programme basé sur des boucles développé par un collègue, le problème est que le programme fonctionne parfaitement en CLI avec la fonction "input" qui stoppe la fonction en attendant une réponse utilisateur.
    Voici un extrait de d'une fonction de saisie utilisateur dans un for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for arg_name, arg_tag in content.items():
         print("Clef :", arg_name, ", Valeur : ", arg_tag)
         val_arg = input(f'Veuillez saisir {arg_name} :')
    Je souhaite utiliser une interface graphique ci-dessous : Nom : interf.PNG
Affichages : 189
Taille : 14,9 Ko
    Le but est de mettre en zone 1 le print (facile) en zone 2 la réponse de l'utilisateur remplaçant le "input" et appuyer sur le bouton en zone 3 pour valider la réponse et passer à l'élément suivant (moins facile).
    Et c'est ce dernier point qui me pose problème.

    Suis-je obligé de modifier la structure des boucles ou est-ce qu'il existe un moyen de suspendre l'exécution le temps que l'utilisateur saisisse une réponse et appuie sur le bouton, remplaçant ainsi la fonction "input" ?

    La difficulté vient du fait que le programme que j'intègre n'a pas été fait pour être intégré à une interface graphique et je souhaiterai si possible éviter d'avoir à le refaire entièrement.

    Merci par avance et s'il manque de la précision ou des informations n'hésitez pas à me le faire remarquer.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on fait de la programmation graphique, il ne faut jamais perdre de vue son fonctionnement de base: le graphique s'affiche, et... attend qu'on lui demande quelque chose! C'est ce qu'on appelle le traitement des évènements (lancé au départ par le "app.exe_()" pour PyQt5). Dans le cas traité ici, ce traitement réagira après l'affichage de la question, en saisissant et en affichant la réponse de l'utilisateur, et en recevant et en traitant le clic sur le bouton de validation. C'est au programmeur de définir ce qui doit se passer quand l'utilisateur clique sur le bouton de validation (signal clicked du bouton => lancement de la méthode de traitement). Probablement ici le traitement de la réponse, suivie par la préparation de la question suivante.

    Dans ce contexte, il ne faut surtout pas faire attendre par un autre moyen, car cela figerait le graphique qui ne serait plus à l'écoute de l'utilisateur et ne pourrait plus traiter ses demandes.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Q thé 5 Voir le message
    Voici un extrait de d'une fonction de saisie utilisateur dans un for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for arg_name, arg_tag in content.items():
         print("Clef :", arg_name, ", Valeur : ", arg_tag)
         val_arg = input(f'Veuillez saisir {arg_name} :')
    Le souci, c'est qu'en programme type "console", le input fait stopper le programme et le met en attente de saisie. Or une IHM a un comportement totalement différent. Son comportement est "boucle infinie avec gestion des évènements lorsqu'ils arrivent". Ces évènements penvent être totalement variés, comme "clic sur bouton", "caractère tapé dans zone de saisie", "choix changé dans un menu déroulant", etc. Ce n'est pas du tout la même approche.

    Citation Envoyé par Q thé 5 Voir le message
    La difficulté vient du fait que le programme que j'intègre n'a pas été fait pour être intégré à une interface graphique et je souhaiterai si possible éviter d'avoir à le refaire entièrement.
    Pourtant ce sera très probablement ce qui va devoir se passer. Ce n'est malheureusement pas de ta faute. Si ton collègue avait codé son programme selon la philosophie MVC (Modèle/Vue/Contrôleur) en séparant "saisie/affichage (la Vue) du traitement des données (le Contrôleur) tu aurais pu récupérer la partie "Contrôleur" et juste recoder la Vue façon IHM mais apparemment il ne l'a pas fait. Donc la solution la moins difficile sera de prendre son programme, commencer toi par isoler tout ce qui est "saisie" du traitement pour ensuite pouvoir récupérer ce traitement et le mettre dans ton IHM.
    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]

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Le souci, c'est qu'en programme type "console", le input fait stopper le programme et le met en attente de saisie. Or une IHM a un comportement totalement différent. Son comportement est "boucle infinie avec gestion des évènements lorsqu'ils arrivent". Ces évènements penvent être totalement variés, comme "clic sur bouton", "caractère tapé dans zone de saisie", "choix changé dans un menu déroulant", etc. Ce n'est pas du tout la même approche.


    Pourtant ce sera très probablement ce qui va devoir se passer. Ce n'est malheureusement pas de ta faute. Si ton collègue avait codé son programme selon la philosophie MVC (Modèle/Vue/Contrôleur) en séparant "saisie/affichage (la Vue) du traitement des données (le Contrôleur) tu aurais pu récupérer la partie "Contrôleur" et juste recoder la Vue façon IHM mais apparemment il ne l'a pas fait. Donc la solution la moins difficile sera de prendre son programme, commencer toi par isoler tout ce qui est "saisie" du traitement pour ensuite pouvoir récupérer ce traitement et le mettre dans ton IHM.
    Bonjour Sve@r,

    Merci beaucoup pour ces explications. C'est effectivement ce que je craignais et cela parait beaucoup plus clair formulé comme ça, j'ai effectivement dû "arranger" le programme pour pourvoir d'abord afficher les données puis dans un second temps traiter les entrées utilisateurs via une seconde fonction.

    A l'avenir je ferais attention à ne plus me retrouver face à ce genre de surprise car c'est plutôt contraignant et cela oblige vraiment à concevoir un algorithme différent.

    Encore merci pour ces explications détaillé concernant la la différence de traitement entre un affichage console et un IHM !

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2021
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2021
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Quand on fait de la programmation graphique, il ne faut jamais perdre de vue son fonctionnement de base: le graphique s'affiche, et... attend qu'on lui demande quelque chose! C'est ce qu'on appelle le traitement des évènements (lancé au départ par le "app.exe_()" pour PyQt5). Dans le cas traité ici, ce traitement réagira après l'affichage de la question, en saisissant et en affichant la réponse de l'utilisateur, et en recevant et en traitant le clic sur le bouton de validation. C'est au programmeur de définir ce qui doit se passer quand l'utilisateur clique sur le bouton de validation (signal clicked du bouton => lancement de la méthode de traitement). Probablement ici le traitement de la réponse, suivie par la préparation de la question suivante.

    Dans ce contexte, il ne faut surtout pas faire attendre par un autre moyen, car cela figerait le graphique qui ne serait plus à l'écoute de l'utilisateur et ne pourrait plus traiter ses demandes.
    Bonjour Tyrtamos,

    Effectivement lorsqu'une fonction est en cours l'interface graphique est "gelée" c'est pour cela que j'étais à la recherche d'un moyen de mettre la fonction en attente d'un signal mais visiblement cela n'est pas aussi simple.
    J'ai dû revoir le code à intégrer pour avoir une partie affichage et une partie inputs bien distinctes.


    Merci beaucoup pour ces explications !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CSS] Faire un CSS juste pout les input text
    Par Oberown dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 27/07/2005, 13h42
  2. Differencier les input
    Par topolino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/05/2005, 20h35
  3. [DOM IE]:recuperer tous les input de type checkbox
    Par sleepy2002 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/12/2004, 18h38
  4. Mettre les <input> en disabled
    Par Oberown dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 05/10/2004, 15h59

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