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 :

FigureCanvasTkAgg : object has no attribute 'tk'


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut FigureCanvasTkAgg : object has no attribute 'tk'
    Bonjour à toutes et à tous,

    Je débute dans les interfaces graphiques sous python, je vous demande pardon par avance la question qui m'amène vous parait trop trivialle…

    J'essaye de coder un petit logiciel qui ouvre des fichiers de sortie de modèle météo (Arome 0.025°) météo pour en faire des cartes (T2m, TPW850 et Z1.5pvu etc).
    Testé sans passer par tkinter, la classe fonctionne correctement, la carte est bien dessinnée.

    Maintenant j'aimerai afficher la carte dans un canevas dans une gui avec tkinter…

    Donc je crée une classe "Application()" qui gère la fenêtre principale et une autre "Arome_0025_Carte_Pour_canvas" dans laquelle se trace la figure.
    J'ai mis les deux classes dans un même fichier dont le contenu est ci-dessous, j'ai enlevé le code inutile (je ne connais pas les us et coutumes de ce forum, je peux tout mettre si ça vous dit)

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import matplotlib
    matplotlib.use("TkAgg")
    import pygrib
     
    import numpy as np
    from datetime import datetime
    from datetime import timedelta
    import matplotlib.pyplot as plt
     
    import cartopy.crs as ccrs
    import cartopy.feature as cfeature
    #from mpl_toolkits.basemap import Basemap
    import matplotlib
    matplotlib.use("TkAgg")
    import matplotlib.dates as mdates
    import matplotlib.colors as mcolors
    import metpy.plots as metplots
     
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
     
    from tkinter import *
     
     
    class Application(Tk):
     
        def __init__(self):
     
            Tk.__init__(self)        # constructeur de la classe parente
     
            self.can = Canvas(self, width =50, height =50, bg ="white")
     
            self.can.pack(side =TOP, padx =5, pady =5)
     
            Button(self, text ="Train", command =self.dessine).pack(side =LEFT)
     
        def dessine(self):
     
            "instanciation de 4 wagons dans le canevas"
     
            #self.w1 = Wagon(self.can, 10, 30)
     
            self.c1 = Arome_0025_Carte_Pour_canvas(self.can,[])
            self.c1.envoyer_Carte_Vers_Gui()
     
    class Arome_0025_Carte_Pour_canvas(object):
     
        def __init__(self,canev,[]):
            []
            self.canev=canev
     
        def construire_Noms(self):
     
    []
     
        def envoyer_Carte_Vers_Gui(self):
     
    []
            proj = ccrs.Stereographic(central_longitude=lons_moy,central_latitude=lats_moy)
     
            f = Figure(figsize=(5,5), dpi=100)
            ax = f.add_subplot(111)
            ax = plt.axes(projection=proj)
     
    []        
            self.canev = FigureCanvasTkAgg(f, self)
            plt.show()
            self.canev.show()
            self.canev.get_tk_widget().pack(expand=True)
     
            toolbar = NavigationToolbar2TkAgg(self.canev, self)
            toolbar.update()
            self.canev._tkcanvas.pack(expand=True)
     
            del(tt_1)
            del(tt_2)
            del(titre)
            del(nom)
     
            #f = Figure(figsize=(5,5), dpi=100)
            #a = f.add_subplot(111)
            #a = fig
     
            print("coucou")
    Quand je compile, l'interface graphique apparaît mais quand je clique sur le bouton, j'ai cette erreur:
    Exception in Tkinter callback
    Traceback (most recent call last):
    File "/usr/lib/python3.5/tkinter/__init__.py", line 1562, in __call__
    return self.func(*args)
    File "/home/lucas/Documents/programmation/Aro/lumet__auieui.py", line 46, in dessine
    self.c1.envoyer_Carte_Vers_Gui()
    File "/home/lucas/Documents/programmation/Aro/lumet__auieui.py", line 307, in envoyer_Carte_Vers_Gui
    self.canev = FigureCanvasTkAgg(f, self)
    File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 227, in __init__
    highlightthickness=0)
    File "/usr/lib/python3.5/tkinter/__init__.py", line 2257, in __init__
    Widget.__init__(self, master, 'canvas', cnf, kw)
    File "/usr/lib/python3.5/tkinter/__init__.py", line 2144, in __init__
    BaseWidget._setup(self, master, cnf)
    File "/usr/lib/python3.5/tkinter/__init__.py", line 2122, in _setup
    self.tk = master.tk
    AttributeError: 'Arome_0025_Carte_Pour_canvas' object has no attribute 'tk'
    C'est donc un problème avec FigureCanvasTkAgg(f, self) et tk(inter)

    J'ai écumé le web à la recherche de la réponse mais je n'ai pas réussi à me dépatouiller de cette erreur…
    Du coup, si vous aviez une idée pour me débloquer, ça serait super!

    Merci d'avance et bon début de we!

    Grilu

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

    Citation Envoyé par grilu Voir le message
    C'est donc un problème avec FigureCanvasTkAgg(f, self) et tk(inter)

    J'ai écumé le web à la recherche de la réponse mais je n'ai pas réussi à me dépatouiller de cette erreur…
    Écumer le Web avant d'avoir lu la documentation et les exemples proposés.... ne sert qu'à faire de la mousse: vous ne savez pas ce que vous cherchez.

    Ça dit que le deuxième argument (le "self" doit être un widget ou mieux "root").

    - W

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Résolu!!
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Écumer le Web avant d'avoir lu la documentation et les exemples proposés.... ne sert qu'à faire de la mousse: vous ne savez pas ce que vous cherchez.

    Ça dit que le deuxième argument (le "self" doit être un widget ou mieux "root").

    - W
    Merci pour la réponse!

    Je vous avais bien dit que ma question était probablement bête
    Mon problème ici vient justement que je m'embrouille vite avec les histoires de root, master, boss etc.
    J'ai bien vu cette documentation, mon souci est précisément comment l'utiliser avec plusieurs classes différentes…

    Je ne suis pas à l'aise avec les constructeurs dans tkinter et c'est précisément cela qui me perd très bêtement ici, la POO/gui est encore trop neuve pour moi…

    Faut-il donc que j'ajoute quelque chose dans le constructeur de la première classe qui gère la gui, faut-il (et comment) la préciser comme root?).

    Sinon, par quoi remplacer ce fameux "self" objet du délit, parce que en l'état, ça vous crève les yeux certainement, mais moi je suis bel et bien en train de me noyer dans mon verre d'eau…

    Edit: RÉSOLU!!

    Cette entrée m'a bien aidé:
    https://www.developpez.net/forums/d1...e-master-boss/

    J'ai fait passer le type de ma classe de dessin en Frame et j'ai ajouté le constructeur de la frame à ma classe.
    J'ai ajouté boss dans les arguments que prend ma classe pour pouvoir avoir accès à des éléments de ma classe maîtresse sur la gui.
    Enfin, le fameux self qui gênait à la fin à été remplacé par un "self.master".
    Voila, c'est à peu près tout.

    Allez cadeau parce que j'en ai bien chié: vous trouvez mon code pour afficher des cartes météo sur mon site perso (voir le lien dans mon profil).

    Beau we!
    Lugri

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

    Avec tkinter, rien ne vous oblige à utiliser les constructions de la POO surtout si vous n'êtes pas familier avec (et la plupart des exemples l'évitent).
    Et les variables globales existent et peuvent être utilisées sans trop de soucis lorsqu'on débute.
    Après si vous voulez apprendre la POO, la rubrique ALM doit avoir une sous-section sur ce sujet avec forum et tutos. Comment découper son programme en "class" et comment les faire communiquer n'est pas spécifique à Python.

    - W

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

Discussions similaires

  1. 'module' object has no attribute 'maketrans'
    Par julien.63 dans le forum Général Python
    Réponses: 3
    Dernier message: 16/05/2009, 20h48
  2. Ftp : 'str' object has no attribute 'read'
    Par noquioz dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 02/01/2009, 15h46
  3. x object has no attribute y (PyQ4t et QLineEdit)
    Par EricStib dans le forum PyQt
    Réponses: 9
    Dernier message: 23/10/2008, 23h00
  4. Probleme : AttributeError: 'tuple' object has no attribute
    Par MrGecko dans le forum Général Python
    Réponses: 1
    Dernier message: 27/05/2007, 09h59
  5. Réponses: 2
    Dernier message: 26/05/2006, 14h48

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