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

Calcul scientifique Python Discussion :

[matplotlib][Tkinter] Conflit figure/Tk ?


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 31
    Points
    31
    Par défaut [matplotlib][Tkinter] Conflit figure/Tk ?
    Bonjour bonjour,

    J'aimerais pouvoir afficher une figure matplotlib.pylab pendant l'exécution de l'application principale (basée sur une fenetre-mère baptisée, ô riginalité, root), puis ouvrir une boite de dialogue dans le meme temps (tkSimpleDialog.askinteger).

    L'entier attendu par le programme est à saisir par l'opérateur d'après l'observation de la courbe affichée. Et j'ai un sérieux problème qui est peut-etre du à un conflit entre root et figure1 ?... étant donné que les deux ne s'appellent pas entre eux.

    Le coeur du problème est là. Plusieurs possibilités pour choisir le parent de la boite askinteger:
    - aucun parent
    - parent = root
    - parent = figure(1) ...?

    Les 2 premiers choix ne donnent rien de bon, le 3e écrit comme ça plante allègrement. Euh... quelqu'un a compris?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    J'avoue que c'est sans doute plus compréhensible avec un p'tit bout de code. Alors voilà, j'ai choisi les parties intéressantes sinon ça fait un peu long...



    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
    
    (...)
    from Tkinter import *
    import matplotlib.pylab as m
    import tkSimpleDialog
    
    (...) # définitions de classes
    
    class App:
    
    (...) # définitions de méthodes pour la classe : saisie du dictionnaire params, de l'adresse capteur1, lectureLigne, etc...
    def initialisation(self): global capteur1, capteur2, params, cte_fin, repertoire repertoire = self.selectionRepertoire() if repertoire != 0: try: file_par, capteur1, capteur2 = self.selectionFichiers() params = self.lectureParametres(file_par) cte_fin = self.saisieFinLigne() except TypeError: Info.ecriture("L'initialisation s'est mal déroulée, ne lancez pas le traitement avant de l'avoir refaite.", couleur = 'red') pass else: Info.ecriture("L'initialisation s'est mal déroulée, ne lancez pas le traitement avant de l'avoir refaite.", couleur = 'red') pass def saisieFinLigne(self): ligne1 = self.lectureLigne(open(capteur1), long = params['Pixels/ligne']) m.plot(ligne1) m.show() cte = tkSimpleDialog.askinteger('Saisie de la valeur de fin de ligne', 'Constante (en pixels) :', parent = root) return cte root = Tk() application = App(root) root.mainloop()
    la fonction initialisation est appelée par pression sur un bouton. Avec ce code, ce qui est bizarre (sans doute logique mais bizarre pour moi!) c'est que le dialogue askinteger s'affiche d'abord avant la figure (celle-ci ne s'affiche qu'après avoir fermé la dialogue, pas très pratique puisque la valeur doit être déduite de l'observation...).
    Puis, si on appelle une 2e fois initialisation, en appuyant sur le même bouton, la figure apparait cette fois en même temps que la boite de dialogue. C'est déjà mieux, même si toujours un peu chiant à manipuler parce qu'on a du mal à voir le dialogue et la figure en même temps, vu que le dialogue est centré sur root...

    La solution serait peut-être de pouvoir affilier la figure à root, ou affilier le dialogue à la figure, mais je ne sais pas comment faire. L'aide matplotlib ne m'a pas parue très claire sur les classes et la hiérarchie utilisée, même si c'est déjà bien d'en parler!

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 36
    Points : 31
    Points
    31
    Par défaut
    Bon, problème non résolu mais plutôt contourné.

    La fonction saisieFinLigne n'est plus appelée par l'autre fonction initialisation, mais par un bouton packé dans un coin du root. Et la valeur à entrer est saisie dans une Entry juste en dessous de ce bouton...

    En fin de compte c'est même plus pratique, les 2 fenêtres (root et graphique) ne sont pas en conflit, et saisieFinLigne peut être rappelée indéfiniment par pression sur le bouton. Si la fenêtre graphique Figure1 est déjà ouverte, la valeur de l'Entry est relevée et la courbe retracée dans Figure1.

    C'était pas compliqué, en + c'est 100% interactif! Mais que demande le peuple?

    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
    def saisieFinLigne(self):
            
            ## lecture et premiers traitements sur 1e ligne du fichier brut
            ligne1 = self.depeignageLigne ( self.spaDebutLigne ( self.lectureLigne(open(Adresses['capt1']), long = Acqu_params['Pixels/ligne'] ) ) )
            
            ## la nouvelle entrée. si elle est vide, la ligne est plottée en entier et
            ## sa longueur en pixels est insérée dans l'entrée...
            if self.frame_droite.entree_fin.get() == '':
                m.plot(ligne1)
                self.frame_droite.entree_fin.insert( 0, len(ligne1) )
            
            ## si l'entrée n'est pas vide, la courbe est tronquée et tracée sur 
            ## le meme graphe que la courbe entière. L'utilisateur a donc une idée
            ## précise du troncage qu'il va effectuer
            else:
                ligne = ligne1[: int(self.frame_droite.entree_fin.get()) ]
                m.hold()
                m.plot(ligne1, 'b', ligne, 'r')
            
            m.show()

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

Discussions similaires

  1. [Python 3.X] tkinter : Conflit entre 2 fenêtres ?
    Par phau1607 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/04/2015, 22h52
  2. Réponses: 0
    Dernier message: 26/08/2014, 21h25
  3. plot de Matplotlib sous Tkinter?
    Par Invité dans le forum Tkinter
    Réponses: 7
    Dernier message: 28/02/2011, 13h22
  4. multiples calculs sur la meme figure avec matplotlib
    Par sjprm dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 23/02/2009, 17h49
  5. [matplotlib] Croubes dans une interface tkinter
    Par vinzzzz dans le forum Tkinter
    Réponses: 2
    Dernier message: 08/12/2006, 14h34

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