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

Fragen zu Tkinter.
Antworten
Hannibal87
User
Beiträge: 4
Registriert: Freitag 17. Januar 2020, 18:03

Freitag 17. Januar 2020, 18:15

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
__deets__
User
Beiträge: 7356
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 17. Januar 2020, 18:22

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.
Hannibal87
User
Beiträge: 4
Registriert: Freitag 17. Januar 2020, 18:03

Dienstag 21. Januar 2020, 18:44

Ja, klar.
Vielen Dank
Antworten