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 :

tkMessageBox.showerror() fenetre fantome


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut tkMessageBox.showerror() fenetre fantome
    J'ai un petit souci avec le module de Tkinter tkMessageBox.
    J'arrive tout a fait a le faire fonctionner mais la fenetre de message apparait avec une autre fenetre fantome celle la dont je ne sais d'ou elle vient:
    -elle est titré Tk
    -ne contient rien
    -est griser
    petit code de démo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    from Tkinter import *
    import tkMessageBox
    def test_fen() :
      a=Tk() #sinon j'arrive pas a la faire disparaitre
      b=tkMessageBox.showerror(title='titre', message='tu as vu un fantome ?', parent=a)
      if b == 'ok' :
        a.destroy()
     
    test_fen()
    La fenetre apparait avec son copain la fenetre fantome et lorsqu'on clique elle disparait avec elle.
    Je tourne sur Ubuntu et sa m'embete cette fenetre.
    Merci si vous avez une solution.

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir jeune padawan,

    Pas de fantôme dans la machine. tkMessageBox utilise tk donc il y a création d'une instance tk (ton fantôme, le _default_root tk).
    C'est de même si tu lance directement python /usr/lib/pythonX.X/lib-tk/tkMessageBox.py (Ou X.X correspond à ta version) pour voir le test.
    Je te laisse voir ce que cela implique (cacher le root ? Surement.).

    Bon tests

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Pour la petite histoire voici le 'code fantôme'
    tkCommonDialog.py
    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
    from Tkinter import *
    
    class Dialog:
    ....
        def show(self, **options):
    
            # update instance options
            for k, v in options.items():
                self.options[k] = v
    
            self._fixoptions()
    
            # we need a dummy widget to properly process the options
            # (at least as long as we use Tkinter 1.63)
            w = Frame(self.master)
    
            try:
    
                s = w.tk.call(self.command, *w._options(self.options))
    
                s = self._fixresult(w, s)
    
            finally:
    
                try:
                    # get rid of the widget
                    w.destroy()
                except:
                    pass
    
            return s
    Toutes les boites de dialogue basés sur Dialog ouvrent une fenêtre tk.
    Une truc simple pour vérifier, taper ceci dans l'interpréteur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from Tkinter import *
    w = Frame()
    @+

  4. #4
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci pause kawa non pas sur le fait qu'il fallait masquer, rendre invisible la fenetre root du widget tkMessageBox, sa je le pensais déja

  5. #5
    Membre éprouvé
    Avatar de Luke spywoker
    Homme Profil pro
    Etudiant informatique autodidacte
    Inscrit en
    Juin 2010
    Messages
    1 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant informatique autodidacte

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 077
    Par défaut
    Merci PauseKawa non pas sur le fait qu'il fallait masquer, rendre invisible, la fenetre root du widget tkMessageBox, sa je le pensais déja mais je n'avais rien dans ma base de données mémorielle permettant d'effectuer l'opération, (state=HIDDEN pour une fenetre root, sa n'existe pas), mais pour m'avoir obliger a chercher: j'ai appris quelque trucs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    from Tkinter import *
    a=Tk()
    a.keys() #affiche toutes les ressources du widget, sa n'as rien donner
    help(Tk) #sinon pour les methodes et les valeurs d'options
    alors j'ai fait ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    from Tkinter import *
    import tkMessageBox
     
    def ghost_busters () :
      a=Tk()
      a.withdraw()
      b=MessageBox.showerror(parent=a, message='exorcisme')
      if b == 'ok' :
        a.destroy()
     
    ghost_busters()
    Beaucoup plus simple que ton code fantome.

    Encore merci pour tout PauseKawa.

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Citation Envoyé par Luke spywoker Voir le message
    Beaucoup plus simple que ton code fantome.
    Mon code fantôme ? Ce n'est pas de moi, c'est le code de tkCommonDialog.py et l'explication de ta fenêtre.
    A comprendre que c'est la création du Widget Frame dans Dialog qui crée la fenêtre Tk.
    Cela viens de la classe BaseWidget:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class BaseWidget(Misc):
        """Internal class."""
        def _setup(self, master, cnf):
            """Internal function. Sets up information about children."""
            if _support_default_root:
                global _default_root
                if not master:
                    if not _default_root:
                        _default_root = Tk()
    Mais bon... Comme dit c'était pour la petite histoire.

    Bon code

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Mince, je viens de tomber sur un de mes codes de test tk que j'avais oublier.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    print '-----------------------------------------'
    print 'Explications sur le _default_root Tkinter'
    print '-----------------------------------------'
     
    import Tkinter
    Tkinter.Frame()
    print "Avec Tkinter.Frame il y a creation d'une instance Tk() via _default_root=Tk()"
    raw_input('Fermez la fenetre et validez pour la suite svp.')
     
    reload(Tkinter)
    import Tkinter
     
    def replacement(self, master, cnf):
        """Replace _setup Internal function."""
        if _support_default_root:
            global _default_root
            if not master:
                if not _default_root:
                    _default_root = None # <----------
                master = _default_root
        self.master = master
        self.tk = master.tk
        name = None
        if cnf.has_key('name'):
            name = cnf['name']
            del cnf['name']
        if not name:
            name = repr(id(self))
        self._name = name
        if master._w=='.':
            self._w = '.' + name
        else:
            self._w = master._w + '.' + name
        self.children = {}
        if self.master.children.has_key(self._name):
            self.master.children[self._name].destroy()
        self.master.children[self._name] = self
     
    Tkinter.BaseWidget._setup = replacement
    print "replacement remplace Tkinter.BaseWidget._setup avec: if not _default_root: _default_root = None"
    try:
        Tkinter.Frame()
    except:
        print "Mince..., Cela ne marche pas (Pas de root tk)."
    Edit: Le code d'origine.

    Fin de l'histoire (Et la boucle est bouclée pour moi ^^).

    @+

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

Discussions similaires

  1. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  2. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51
  3. Cacher fenetre
    Par Captain Fizzou dans le forum GLUT
    Réponses: 2
    Dernier message: 25/08/2002, 17h22
  4. Réponses: 3
    Dernier message: 22/07/2002, 14h19
  5. gérer les jpg dans une fenetre directdraw???
    Par Anonymous dans le forum DirectX
    Réponses: 1
    Dernier message: 14/06/2002, 13h39

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