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

Tkinter Python Discussion :

ouvrir une (et une seule) fenêtre avec un bouton


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut ouvrir une (et une seule) fenêtre avec un bouton
    Bonjour,

    je suis débutant en Python (2.7) et Tkinter (8.5).
    Je m'étonne de ne pas avoir trouvé de réponse plus simple à ma question, d'où ce post.

    Je suis en train de créer une application avec 2 boutons (parametres et quitter) et une zone graphique (canvas).
    Le bouton paramètres ouvre une autre fenetre (toplevel) avec des infos à y modifer (et quitter envoie sur un tkMessageBox.askokcancel)

    Quand j'associe simplement le bouton parametre à ma fenêtre, il l'ouvre bien, mais je peux cliquer à nouveau sur le bouton et ouvrir une autre fenêtre. "indéfiniment".

    Pour l'instant, pour éviter cela, j'ai fait une classe listfen qui contient un dictionnaire, {"fenetre1":0, "fenetre2":0, "fenetre3":0}.
    Dès que j'ouvre une fenêtre, je passe la valeur de 0->1 pour la fenetre concernée dans la classe listfen. Et de 1->0 quand je la ferme.
    Avant d'ouvrir une fenêtre en question, je teste la valeur qui lui est associée dans listfen. Et donc, si c'est 0, je ne l'ouvre pas.

    Est-ce que c'est un bon moyen de travailler?

    Connaissez-vous un meilleur moyen?
    (désactiver le bouton en question? Empêcher de changer de fenêtre? ... ? )

    Merci!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Jijil Voir le message
    Connaissez-vous un meilleur moyen?
    (désactiver le bouton en question? Empêcher de changer de fenêtre? ... ? )
    Vous donnez vous même des solutions possibles.

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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci pour votre réponse.
    Oui, c'est parce que c'est ce que j'observe ailleurs... mais je ne sais pas comment l'implementer avec Tkinter...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Jijil Voir le message
    Oui, c'est parce que c'est ce que j'observe ailleurs... mais je ne sais pas comment l'implementer avec Tkinter...
    On ne va pas chercher sur Internet à votre place ni répondre à des questions aussi ouvertes avec des exemples de code montrant comment on peut faire çà avec la méthode X, puis la méthode Y, ...
    Vous devez choisir la méthode et essayer de la réaliser pour avoir du code à montrer, histoire de comprendre les difficultés rencontrées..

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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci. Oui, je comprends parfaitement.
    Nous nous sommes mal compris je pense, et ça m'incombe.

    Ma question sous-jacente était: y a-t-il une (ou plusieurs) bonne(s) pratique(s) à recommander pour cela?
    J'aurais aimé une simple réponse du style "avec la méthode grab_set()"

    J'ai (donc) entre temps découvert et testé .grab_set() et ça a l'air de répondre à ma demande. Je suppose que c'est LA méthode à appliquer pour ce cas à ma fenêtre toplevel?
    Y a-t-il un risque de contournement de cette méthode? (et de ce fait, dois-je conserver en parallèle mon "gestionnaire" de fenêtres ouvertes? pratiquer encore autrement?)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Jijil Voir le message
    Ma question sous-jacente était: y a-t-il une (ou plusieurs) bonne(s) pratique(s) à recommander pour cela?
    J'aurais aimé une simple réponse du style "avec la méthode grab_set()"
    C'est une question de "look & feel" de votre interface.
    Plutôt qu'afficher une nouvelle fenêtre, vous pourriez remplacer le contenu de l'actuelle.
    Et de toutes façon, il faudra gérer l'état de l'application pour savoir qu'appuyer sur le Button la première fois n'aura pas le même effet les fois suivantes.
    "grab_set" est une façon de faire car il participe à la création de fenêtres de dialogues "modales". C'est une technique à maîtriser mais pas la seule possible.

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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Merci pour le lien, maintenant je sais comment je pourrai relier le "<enter>" à mon bouton OK

    Voilà, c'est implementé avec un grab_set et ça a l'air de fonctionner (sous windows tout au moins)

    Par contre, j'ai essayé de faire en sorte que le bouton d'appel de ma fenetre Toplevel apparaisse enfoncé lorsque la fenêtre est ouverte et relâché quand la fenêtre n'est plus là... et comme ça ne marche pas, je suppose que ça doit être autre chose...

    J'ai essayé avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import Tkinter as tk
     
    [...]
     
            self.bouton2.configure(state=tk.DISABLED)
            FenStart(self)
            self.bouton2.configure(state=tk.NORMAL)
    Merci pour vos idées/suggestions

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par Jijil Voir le message
    Par contre, j'ai essayé de faire en sorte que le bouton d'appel de ma fenetre Toplevel apparaisse enfoncé lorsque la fenêtre est ouverte et relâché quand la fenêtre n'est plus là... et comme ça ne marche pas, je suppose que ça doit être autre chose...

    J'ai essayé avec ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import Tkinter as tk
     
    [...]
     
            self.bouton2.configure(state=tk.DISABLED)
            FenStart(self)
            self.bouton2.configure(state=tk.NORMAL)
    Vous montrez trop peu de code pour qu'on puisse comprendre (et reproduire) quoi que ce soit.
    C'est pas si compliqué d'écrire un petit script qui permette de voir de quoi on parle.

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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    Ok. Je pensais que ça appelait une réponse triviale. Je pense que c'est parce que j'ai changé des défaults comme fg ou bg. Je mets ça de côté pour l'instant, pour une question qui m'est plus prioritaire...

    Mon programme fonctionne en 2 étapes:
    - il demande des infos de connexion à un équipement (entre autres un port COM) et vérifie la connexion + qu'il est ok
    - ensuite, j'ai une sorte de tableau de bord permettant de piloter l'équipement

    Je cherche à faire un "passage obligé" avant d'afficher la fenêtre "tableau de bord".
    Pour l'instant, je le fais en mode texte, avant ouverture de la fenêtre en mode graphique.

    Je préférerais éviter un "toplevel" par dessus ma fenêtre. L'idée serait plutôt une premiere fenetre qui demande les infos cruciales + tests possibles et une fois qu'on a cliqué sur OK, tout est remplacé par mon tableau de bord.

    En fait, j'ai un thread qui va consulter un équipement (connecté au port com susmentionné) et un autre qui s'occupe de l'affichage (afin d'éviter de perdre des données en cas de "freeze").
    Je préférerais ne gérer l'affichage "tableau de bord" (ie: démarrer le multithreading) qu'une fois sûr que l'équipement est connecté et opérationnel.

    La seule voie que j'aie trouvée, c'est un tableau de frames, avec un selecteur pour amener celui qu'on veut avec un .tkraise() :
    https://pythonprogramming.net/change...frame-tkinter/

    Est-ce une manière propre de faire?
    Merci...

    PS: je n'ai pas de probleme avec le tu

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par Jijil Voir le message
    Ok. Je pensais que ça appelait une réponse triviale.
    Réponse triviale ou pas, si vous postez du code, c'est pour permettre de reproduire un comportement que vous ne savez pas décrire techniquement ou qui serait trop long à raconter. C'est à la machine à café qu'on peut faire des réponses triviales sur un problème qu'on ne peut pas examiner. Ici, vous avez la chance de pouvoir écrire et documenter un peu mieux. De plus, essayer de reproduire le soucis sur un petit exemple, c'est prendre quelques minutes pour penser à l'opération élémentaire et souvent çà permet de trouver des solutions tout seul.

    Citation Envoyé par Jijil Voir le message
    La seule voie que j'aie trouvée, c'est un tableau de frames, avec un selecteur pour amener celui qu'on veut avec un .tkraise() :
    https://pythonprogramming.net/change...frame-tkinter/

    Est-ce une manière propre de faire?
    C'est une manière de... mais d'après ce que vous racontez, vous avez 2 "pages" (à réaliser avec des "Frame"). Une fois la première page (et la saisie d'informations faite) passée, frame.destroy() ou frame.pack_forget() pourraient être plus adapté. Donc la question à vous poser, c'est de bien décrire l'interaction avec l'utilisateur et cela fait, y a plus qu'à (essayer de la) coder... Et éventuellement revenir ici pour poster du code et demander pourquoi "çà ne marche pas".

    Citation Envoyé par Jijil Voir le message
    PS: je n'ai pas de probleme avec le tu
    moi non plus, mais les vieux c... comme moi ont leurs habitudes.

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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 29
    Points : 14
    Points
    14
    Par défaut
    En tant que vieux c.. (moi tout seul en tous cas ), je te remercie pour tes conseils
    Je n'ai pas encore eu le temps de faire ces essais d'interfaces... les problèmes actuels n'étant pas informatiques...
    Je te tiens au courant

Discussions similaires

  1. Ouvrir une boite de dialogue JFileChooser avec un bouton
    Par zatopec dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 06/02/2016, 18h32
  2. Fermer une fenêtre avec un bouton
    Par keikoku84 dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 04/12/2014, 23h47
  3. Fermer une fenêtre avec un bouton
    Par labaf dans le forum Tkinter
    Réponses: 2
    Dernier message: 20/04/2013, 17h41
  4. créer une fenêtre avec des boutons
    Par DIDIX dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 12/11/2010, 01h20
  5. Fermer une fenêtre avec un bouton
    Par Sylv3D dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 06/04/2010, 22h42

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