Seite 1 von 1

AttributeError: 'GUI' object has no attribute 'tk'

Verfasst: Freitag 17. Januar 2020, 18:15
von Hannibal87
Moin,

ich versuche einen Sensorwert zu erfassen und diesen später mit Hilfe von Matplotlib in einem Toplevel-Fenster darzustellen.
Die einzelnen Programmteile funktionieren bei mir. Also eine GUI, wo ich per Button ein Toplevel erstelle und eine GUI wo ich einen Graphen mit Matplotlib darstelle. Jetzt wollte ich die beiden Programmteile mit einander verbinden und bekomme folgende Fehlermeldung:
Traceback (most recent call last):
File "/home/pi/PythonProgramme/Wallbox/GUI_Matplotlib.py", line 66, in <module>
canvas = FigureCanvasTkAgg(fig, master = gui)
File "/usr/local/lib/python3.5/dist-packages/matplotlib/backends/_backend_tk.py", line 211, in __init__
width=w, height=h, borderwidth=0, 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: 'GUI' object has no attribute 'tk'
Was mache ich falsch?

Code: Alles auswählen

from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
import random


GUI_WIN_TITLE = 'Test'
GUI_BACK_GND = 'white'



class GUI(object):
    def __init__(self):
        self.win = tk.Tk()
        self.win.protocol("WM_DELETE_WINDOW", self.close)
        self.win.config(bg=GUI_BACK_GND)
        self.win.title(GUI_WIN_TITLE)
        
    
    def create_info_win(self):
        top_win_info = tk.Toplevel()
        #top_win.update_idletasks()
        #self.top_win_collector.append(top_win)
        top_win_info.title("Info")
        #top_win.update_idletasks()
        
    
    def create_diagram_win(self):
        top_win_diagram = tk.Toplevel()
        #top_win.update_idletasks()
        #self.top_win_collector.append(top_win)
        top_win_diagram.title("Diagram")
        #top_win.update_idletasks()
    
    def updateTemp(self, temp, label):
        label.config(text= "T = " + temp + " °C")
        
    def close(self):
        self.win.destroy()
        print ("Shut down application")

    def run(self):
        self.win.mainloop()
        

# Hauptprogramm - Testumgebung
if __name__ == '__main__':
    
    '''           Daten für den Graphen                         '''
    fig = Figure(figsize = (9, 6), facecolor = "white")
    axis = fig.add_subplot(111)

    power = list()
    time = list()
    
    for i in range(1, 20):
        power.append(random.randint(0, 10))
        time.append(i)
    
    axis.plot(time, power, "-b", label = "Power")



    gui = GUI()
    
    canvas = FigureCanvasTkAgg(fig, master = gui)
    canvas._tkcanvas.pack(side = tk.TOP, fill = tk.BOTH, expand = 1)
    
    labelTemp = tk.Label(gui.win, text='Temperatur')
    labelTemp.pack()

    # Erstelle weitere Toplevel-Fenster
    tk.Button(gui.win, text='Info', command=gui.create_info_win).pack()
    tk.Button(gui.win, text='Diagramme', command=gui.create_diagram_win).pack()
    
    # Schließen
    tk.Button(gui.win, text='Schließen', command=gui.close).pack()

    # Anzeige aktualisieren
    gui.updateTemp("18", labelTemp)

    gui.run()
Vielen Dank im Voraus

Re: AttributeError: 'GUI' object has no attribute 'tk'

Verfasst: Freitag 17. Januar 2020, 18:22
von __deets__
Dein GUI Objekt ist nun mal kein tk Widget. Das aber muss das Master der FigureCanvasTk sein. Ich nehme mal an gui.win könnte funktionieren.

Re: AttributeError: 'GUI' object has no attribute 'tk'

Verfasst: Dienstag 21. Januar 2020, 18:44
von Hannibal87
Ja, klar.
Vielen Dank