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 :

Module simpledialog : comment ça fonctionne?


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2019
    Messages : 4
    Par défaut Module simpledialog : comment ça fonctionne?
    Bonjour à tous,

    Je ne suis pas développeur de formation, mais je me débrouille.
    J'ai toujours eu un peu de mal avec les interfaces graphiques. Tkinter est à la fois très pratique et en même temps souvent obscur (pour moi au moins).
    Je m'en suis toujours sorti dans mes dialogues en leur passant un objet vide (liste, dictionnaire ou autre) en paramètre, pour récupérer d'éventuelles données selon mes besoins.
    J'ai récemment jeté un coup d'oeil au module "simpledialog", et là, je reste totalement perdu!

    Première classe: SimpleDialog... Je vois bien ce qu'elle fait, et surtout qu'elle ouvre une Toplevel en tant qu'attribut, ce qui facilite sans doute la gestion de données récupérées.

    Classe suivante: Dialog, dérivée de Toplevel. Donc SimpleDialog ne sert à rien ici.
    Dans le constructeur, on trouve après self.grab-set() : self.wait-window(self). Je comprends bien (enfin je pense...) ces deux instructions que j'utilise régulièrement. Wait-window attend que la fenêtre soit détruite.

    On trouve ensuite une classe _QueryDialog dérivée de Dialog, donc de Toplevel. Cette classe précise les choses et ajoute un corps sous forme de composant Entry, etc...

    Et enfin, des sous-classe de _QueryDialog (_QueryInteger, etc...) qui fixent deux nouvelles informations: message d'erreur et méthode de récupération du contenu de l'entrée.

    Et là: une fonction askinteger (et les autres), qui se contente de créer une Toplevel à travers la classe _QueryInteger, et de retourner un attribut de cette classe (en l'occurence l'attribut result issu de la classe de base _QueryDialog).

    Et c'est là que je suis perdu !!!
    d = _QueryInteger(....) crée une Toplevel et attend que celle-ci soit détruite et ensuite seulement la fonction retourne d.result, attribut de la fenêtre qui vient d'être détruite (théoriquement).

    Je loupe forcément quelque chose. Je n'ai pas programmé en python depuis une paire d'années, et j'en ai peut-être perdu "l'esprit".... mais je ne comprends pas. A force de lire et de relire, je ne vois plus rien!

    Si quelqu'un pouvait m'expliquer ce qui se passe réellement, et où je loupe un truc, je lui en serais très reconnaissant.

    Je me sens un peu stupide, mais j'avoue que ça tourne à l'obsession.
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Ce module là est peu ou prou ce qui est documenté sur effbot ici.

    Et c'est là que je suis perdu !!!
    d = _QueryInteger(....) crée une Toplevel et attend que celle-ci soit détruite et ensuite seulement la fonction retourne d.result, attribut de la fenêtre qui vient d'être détruite (théoriquement).

    _QueryInteger
    n'est pas une fonction mais une classe: son appel retourne juste l'instance d'un objet.... Et vu qu'__init__ se termine par .wait_window, çà attend la fermeture du Toplevel (et la saisie du résultat) que l'on pourra récupérer dans l'attribut "result" de l'instance (dès qu'on en sort).

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2019
    Messages : 4
    Par défaut
    C'est justement ça que je ne pige pas...
    J'ai bien vu que _QueryInteger est une classe, mais dans le déroulement de l'exécution, __init__ reste sur .wait_window jusqu'à sa destruction et la deuxième ligne de la fonction askinteger(lecture de d.result pour le retourner) suit cette destruction, comment peut-on récupérer un attribut d'un objet détruit?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par mykelyon Voir le message
    comment peut-on récupérer un attribut d'un objet détruit?
    Ce qui est détruit, c'est juste la TopLevel.
    Et toutes les méthodes qui vont essayé de récupérer l'état ou le modifier vous retourneront une erreur disant que la Toplevel a été détruite...
    Mais l'instance, elle, est toujours là et son attribut result (dans lequel a été sauvegardé le résultat avant la destruction de la Toplevel et de tous les widgets qu'elle contenait) reste accessible.

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Septembre 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2019
    Messages : 4
    Par défaut
    OK.
    Pour moi, l'instance créée et la Toplevel étaient la même chose... et il me semblait que détruire la Toplevel, c'était détruire l'instance...

    Quoi qu'il en soit, merci pour votre réponse, cela confirme la seule conclusion à laquelle j'étais arrivé, sans pour autant en comprendre le mécanisme.
    Je suppose que ce sont les coulisses de tkinter qu'il faudrait que j'approfondisse.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par mykelyon Voir le message
    Pour moi, l'instance créée et la Toplevel étaient la même chose... et il me semblait que détruire la Toplevel, c'était détruire l'instance...
    L'instance est un objet Python. Et un objet Python ne sera "détruit" qu'après que le nombre de références soit passé à 0.
    Avant çà, vous pourrez toujours accéder à l'instance de l'objet récupérer certaines infos et pas d'autres car l'état de l'objet vous l'interdira.
    Imaginez une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A:
         state = 1
         def destroy(self):
              self.state = 0
         def get_xx(self):
              if self.state == 1:
                 print('get_xx')
              else:
                 print('object has been destroyed')
         def get_yy(self):
              print('get_yy')
    Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> a = A()
    >>> a.get_xx()
    get_xx
    >>> a.destroy()
    destroy change l'état mais rien ne m'empêche d'appeler une méthode qui tiendra compte de cet état "interne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> a.get_xx()
    object has been destroyed
    ou une autre qui s'en fout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> a.get_yy()
    get_yy
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Compilateur asm, comment ça fonctionne ?
    Par AsmCode dans le forum Assembleur
    Réponses: 21
    Dernier message: 29/07/2005, 23h59
  2. Comment faire fonctionner une scroll bar ???
    Par toto4650 dans le forum MFC
    Réponses: 10
    Dernier message: 18/07/2005, 16h47
  3. [JToolTip] comment ca fonctionne ?
    Par Terminator dans le forum Composants
    Réponses: 2
    Dernier message: 29/05/2005, 15h18
  4. [Chat] Comment faire fonctionner Flash 7 sous Debian ?
    Par piff62 dans le forum Evolutions du club
    Réponses: 22
    Dernier message: 07/03/2005, 15h27
  5. comment faire fonctionner l'exe sur une autre machine
    Par brian79 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/05/2004, 14h00

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