Problem mit NameError: name des Labels ist nicht definiert??

Fragen zu Tkinter.
Antworten
TechHippie420
User
Beiträge: 11
Registriert: Montag 22. Februar 2021, 10:03

Hallo zusammen,

ich habe folgendes Problem mit meinem Code.

Ich möchte den Text eines Tkinter Labels (lbl_portfolioOverview) mittels click auf einen Button (btn_CheckPortfolio) ändern.
Allerdings bkekomme ich immer die Meldung:
NameError: name 'lbl_portfolioOverview' is not defined
obwohl ich das meiner Ansicht nach in Zeile 103 von pages.py getan habe.

Hier der vollständige Code meines Programms soweit:
zunächst die main.py

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk

from views.pages import Disclaimer, HomePage, MyPortfolio

class PersonalBroker(tk.Tk):

    def __init__(self, *args, **kwargs):
        
        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.wm_title(self, 'Personal Broker')

        container = tk.Frame(self)
        container.pack(side='top', fill='both', expand=True)

        container.grid_columnconfigure(0, weight=1)
        container.grid_columnconfigure(1, weight=1)
        container.grid_rowconfigure(0, weight=1)

        self.frames = {}

        pages = [Disclaimer, HomePage, MyPortfolio]

        for page in pages:
            frame = page(container, self)
            self.frames[page] = frame
            frame.grid(column=0, row=0, columnspan=2, sticky='NESW')

        self.show_frame(Disclaimer)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()

app = PersonalBroker()
width = '1280'
height = '720'
screenWitdh = int((app.winfo_screenwidth() - int(width)) / 2)
screenHeight = int((app.winfo_screenheight() - int(height)) / 2)
posWidth = str(screenWitdh)
posHeight = str(screenHeight)
app.geometry(f'{width}x{height}+{posWidth}+{posHeight}')
app.mainloop()
und hier der Teil wo meiner Vermutung nach der Fehler liegt
pages.py

Code: Alles auswählen

import tkinter as tk
from tkinter import ttk
import time

LARGE_FONT = ('Verdana', 12)

class Disclaimer(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        label = tk.Label(self, text="""
        
         - Personal Broker Haftungsausschluss -

        ...
        
        """, font=LARGE_FONT)
        label.pack(pady=10, padx=10)

        button1 = ttk.Button(self, text='Zustimmen', command=lambda: controller.show_frame(HomePage))
        button1.pack()

        button2 = ttk.Button(self, text='Ablehnen', command=quit)
        button2.pack()

class HomePage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=3)
        self.grid_rowconfigure(0, weight=1)

        mainCanvas = tk.Canvas(self, bg='black')
        mainCanvas.grid(column=0, row=0, columnspan=2, sticky='nsew')

        navigationCanvas = tk.Canvas(self, bg='blue')
        navigationCanvas.grid_columnconfigure(0, weight=1)
        navigationCanvas.grid_rowconfigure((0,1,2,3), weight=1)
        navigationCanvas.grid(column=0, row=0, padx=5, pady=5, sticky='NSEW')

        btn_MyPortfolio = ttk.Button(navigationCanvas, text='Mein Portfolio',
                                                command=lambda: controller.show_frame(MyPortfolio))
        btn_MyPortfolio.grid(column=0, row=0, padx=5, pady=5, sticky='NESW')

        btn_FindStocks = ttk.Button(navigationCanvas, text='Aktien Finder', command=lambda: controller.show_frame(StockFinder))
        btn_FindStocks.grid(column=0, row=1, padx=5, pady=5, sticky='NESW')

        btn_HomePage = ttk.Button(navigationCanvas, text='Home Page', command=lambda: controller.show_frame(Disclaimer))
        btn_HomePage.state(['disabled'])
        btn_HomePage.grid(column=0, row=3, padx=5, pady=5, sticky='NESW')

        button4 = ttk.Button(navigationCanvas, text='Beenden', command=quit)
        button4.grid(column=0, row=4, padx=5, pady=5, sticky='NESW')

        userViewCanvas = tk.Canvas(self, bg='blue')
        userViewCanvas.grid_columnconfigure((0,1,2,3), weight=1)        
        userViewCanvas.grid_rowconfigure((0,1,2,3), weight=1)
        
        lbl_PageTitle = tk.Label(userViewCanvas, text='Personal Broker - Home', anchor='center', font=LARGE_FONT)
        lbl_PageTitle.grid(column=0, row=0, columnspan=4, rowspan=1, padx=5, pady=5, sticky='NESW')
        userViewCanvas.grid(column=1, row=0, columnspan=7, padx=5, pady=5, sticky='NSEW')

class MyPortfolio(tk.Frame):

    def getMyPortfolio(self, lbl_PortfolioOverview):

        try:
            print(lbl_portfolioOverview.text.set('endlich richtig'))
            print('endlich richtig')
        except Exception:
            print('\n' + 'schon wieder falsch...' + '\n')
            print(Exception.with_traceback())

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        self.text = tk.StringVar()
        self.text.set('Dummy Text ')

        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=3)
        self.grid_rowconfigure(0, weight=1)

        mainCanvas = tk.Canvas(self, bg='black')
        mainCanvas.grid(column=0, row=0, columnspan=2, sticky='nsew')

        navigationCanvas = tk.Canvas(self, bg='blue')
        navigationCanvas.grid_columnconfigure(0, weight=1)
        navigationCanvas.grid_rowconfigure((0,1,2,3), weight=1)
        navigationCanvas.grid(column=0, row=0, padx=5, pady=5, sticky='NSEW')

        btn_CheckPortfolio = ttk.Button(navigationCanvas, text='Check Portfolio',
                                                command=lambda: MyPortfolio.getMyPortfolio(self, lbl_PortfolioOverview))
        btn_CheckPortfolio.grid(column=0, row=0, padx=5, pady=5, sticky='NESW')

        btn_CreatePortfolio = ttk.Button(navigationCanvas, text='Portfolio erstellen', command=lambda: controller.show_frame(StockFinder))
        btn_CreatePortfolio.grid(column=0, row=1, padx=5, pady=5, sticky='NESW')

        btn_HomePage = ttk.Button(navigationCanvas, text='Home Page', command=lambda: controller.show_frame(HomePage))
        btn_HomePage.grid(column=0, row=3, padx=5, pady=5, sticky='NESW')

        btn_Quit = ttk.Button(navigationCanvas, text='Beenden', command=quit)
        btn_Quit.grid(column=0, row=4, padx=5, pady=5, sticky='NESW')

        userViewCanvas = tk.Canvas(self, bg='blue')
        userViewCanvas.grid_columnconfigure((0,1,2,3), weight=1)        
        userViewCanvas.grid_rowconfigure((0,1,2,3), weight=1)        

        lbl_PageTitle = tk.Label(userViewCanvas, text='Personal Broker - Mein Portfolio', anchor='center', font=LARGE_FONT)
        lbl_PageTitle.grid(column=0, row=0, columnspan=4, rowspan=1, padx=5, pady=5, sticky='NESW')
        lbl_PortfolioOverview = tk.Label(userViewCanvas, textvariable=self.text, anchor='center', font=LARGE_FONT)
        lbl_PortfolioOverview.grid(column=0, row=1, columnspan=4, rowspan=2, padx=5, pady=5, sticky='NESW')
        userViewCanvas.grid(column=1, row=0, columnspan=7, padx=5, pady=5, sticky='NSEW')

anscheinend komme ich irgendwie mit der Übergabe des Labels an die Funktion nicht klar.
Besten Dank schon mal im Voraus
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles was Du außerhalb von __init__ brauchst, mußt Du an self binden.
TechHippie420
User
Beiträge: 11
Registriert: Montag 22. Februar 2021, 10:03

Danke für die schnelle Antwort Sirius3,

Hab's ausprobiert.

Code: Alles auswählen

class MyPortfolio(tk.Frame):

    def getMyPortfolio(self, lbl_PortfolioOverview):

        try:
            print(self.lbl_portfolioOverview.text.set('endlich richtig'))
            print('endlich richtig')
        except Exception:
            print('\n' + 'schon wieder falsch...' + '\n')
            print(Exception.with_traceback())

    def __init__(self, parent, controller):

        tk.Frame.__init__(self, parent)

        self.text = tk.StringVar()
        self.text.set('Dummy Text ')

        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=3)
        self.grid_rowconfigure(0, weight=1)

        self.mainCanvas = tk.Canvas(self, bg='black')
        self.mainCanvas.grid(column=0, row=0, columnspan=2, sticky='nsew')

        self.navigationCanvas = tk.Canvas(self, bg='blue')
        self.navigationCanvas.grid_columnconfigure(0, weight=1)
        self.navigationCanvas.grid_rowconfigure((0,1,2,3), weight=1)
        self.navigationCanvas.grid(column=0, row=0, padx=5, pady=5, sticky='NSEW')

        self.btn_CheckPortfolio = ttk.Button(self.navigationCanvas, text='Check Portfolio',
                                                command=lambda: MyPortfolio.getMyPortfolio(self, self.lbl_PortfolioOverview))
        self.btn_CheckPortfolio.grid(column=0, row=0, padx=5, pady=5, sticky='NESW')

        self.btn_CreatePortfolio = ttk.Button(self.navigationCanvas, text='Portfolio erstellen', command=lambda: controller.show_frame(StockFinder))
        self.btn_CreatePortfolio.grid(column=0, row=1, padx=5, pady=5, sticky='NESW')

        self.btn_HomePage = ttk.Button(self.navigationCanvas, text='Home Page', command=lambda: controller.show_frame(HomePage))
        self.btn_HomePage.grid(column=0, row=3, padx=5, pady=5, sticky='NESW')

        self.btn_Quit = ttk.Button(self.navigationCanvas, text='Beenden', command=quit)
        self.btn_Quit.grid(column=0, row=4, padx=5, pady=5, sticky='NESW')

        self.userViewCanvas = tk.Canvas(self, bg='blue')
        self.userViewCanvas.grid_columnconfigure((0,1,2,3), weight=1)        
        self.userViewCanvas.grid_rowconfigure((0,1,2,3), weight=1)        

        self.lbl_PageTitle = tk.Label(self.userViewCanvas, text='Personal Broker - Mein Portfolio', anchor='center', font=LARGE_FONT)
        self.lbl_PageTitle.grid(column=0, row=0, columnspan=4, rowspan=1, padx=5, pady=5, sticky='NESW')
        self.lbl_PortfolioOverview = tk.Label(self.userViewCanvas, textvariable=self.text, anchor='center', font=LARGE_FONT)
        self.lbl_PortfolioOverview.grid(column=0, row=1, columnspan=4, rowspan=2, padx=5, pady=5, sticky='NESW')
        self.userViewCanvas.grid(column=1, row=0, columnspan=7, padx=5, pady=5, sticky='NSEW')
Jetzt bekomme ich:
print(self.lbl_portfolioOverview.text.set('endlich richtig'))
AttributeError: 'MyPortfolio' object has no attribute 'lbl_portfolioOverview'
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Es heißt ja auch lbl_PortfolioOverview. Variablennamen schreibt man wie Attribute komplett klein. Und benutze keine Abkürzungen, sondern sprechende Namen.
TechHippie420
User
Beiträge: 11
Registriert: Montag 22. Februar 2021, 10:03

Besten Dank,

manchmal sieht man den Wald vor lauter Bäumen nicht mehr.
Nochmal vielen Dank und noch nen schönen Tag.

ps: hab noch rausgefunden das 'label' kein 'text' Attribut hat also

Code: Alles auswählen

self.lbl_PortfolioOverview.text.set('endlich richtig ...')
nicht funktioniert.

stattdessen habe ich nun

Code: Alles auswählen

self.lbl_PortfolioOverview.configure(text = 'endlich richtig')
und das läuft.
Antworten