Text eines Labels in Tk verändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
M4TTHI_01
User
Beiträge: 5
Registriert: Montag 14. März 2022, 09:54

Hallo,

ich versuche zurzeit ein neuen Fenster im Tk zu öffnen mit mehreren Knöpfen und einem Label, dessen Text sich per Knopfdruck dann ändern lässt.
Das Fenster mit dem Label erstelle ich auf diese Weise:

Code: Alles auswählen

momentum_calc_window = tk.Toplevel(root)
momentum_calc_window.geometry('%dx%d+%d+%d' % (root.winfo_screenwidth()*2/6, root.winfo_screenheight()*3/6, root.winfo_screenwidth()/4, root.winfo_screenheight()/4))
momentum_calc_window.wm_title("Berechnung für einen neuen Graphen festlegen")

Ausgabe = tk.Label(momentum_calc_window, text="Berechnung", width=8, height=3).grid(row=1, column=2, padx='5', pady='5', sticky='ew')
Jetzt weiß ich aber leider nicht, wie ich den Text des Labels ändern kann.
Ich hoffe, dass mir hier jemand weiterhelfen kann.

Gruß
Matthias
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Erster Schritt wäre, das Label in einer Variable zu speichern um dann über dessen Eigenschaften den Text zu ändern:

Code: Alles auswählen

result_label = tk.Label(momentum_calc_window, text="Berechnung", width=8, height=3)
result_label.grid(row=1, column=2, padx='5', pady='5', sticky='ew')
...
result_label['text'] = "42"
M4TTHI_01
User
Beiträge: 5
Registriert: Montag 14. März 2022, 09:54

Vielen Dank, das funktioniert fürs erste in der gleichen Methode.

Habe jetzt nur noch ein zusätzliches Problem:
ich will den Text des Labels per Knopfdruck ändern. Habe die Variable als global deklariert und trotzdem kommt diese Fehlermeldung:
File "C:\Users\mpern\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
File "F:\Projekt Sattelstütze\Auswertung_Neu\Auswertung_Python\Auswertung_Neu.py", line 396, in <lambda>
tk.Button(momentum_calc_window, text="1", width=8, height=3, command=lambda m="1": which_button(m)).grid(row=2, column=1, padx='5', pady='5', sticky='ew')
File "F:\Projekt Sattelstütze\Auswertung_Neu\Auswertung_Python\Auswertung_Neu.py", line 437, in which_button
Ausgabe["Text"] = button_press
File "C:\Users\mpern\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1657, in __setitem__
self.configure({key: value})
File "C:\Users\mpern\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1646, in configure
return self._configure('configure', cnf, kw)
File "C:\Users\mpern\AppData\Local\Programs\Python\Python39\lib\tkinter\__init__.py", line 1636, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: unknown option "-Text"
Hier der Programmteil:

Code: Alles auswählen

    Button = tk.Button(momentum_calc_window, text="ENTER", width=8, height=3, command=lambda m="enter": which_button(m)).grid(row=1, column=0, padx='5', pady='5', 
    sticky='ew')
   
    global Ausgabe
    Ausgabe = tk.Label(momentum_calc_window, text="Berechnung", width=8, height=3)
    Ausgabe.grid(row=1, column=2, padx='5', pady='5', sticky='ew')
    Ausgabe['text'] = "42"

def which_button(button_press):
    Ausgabe["Text"] = button_press
Es tut mir lübrigens leid, falls ich gerade bei grundlegenden Dingen scheitere.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Global zu benutzen ist zb so ein grundlegendes Ding, das man nicht benutzt. Denn globale Variablen führen zu schwierig zu entwanzendem, schlecht wartbaren und kaum wiederverwendbaren Code. Das so allgemein.

Konkret kommt es beim programmieren auch aufs Detail an. Schau mal genau hin, wie du die Eigenschaft nennst, die du da ändern willst.
M4TTHI_01
User
Beiträge: 5
Registriert: Montag 14. März 2022, 09:54

Danke für die Hilfe. 🤦‍♂️
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt bindest Du schon wieder auf komplizierte Weise `None` an irgendwelche Variablen, die Du in diesem Fall nicht weiter verwendest. Variablennamen werden komplett klein geschrieben.

Für GUI-Programmierung braucht es eigentlich Klassen. Man kann sich für weniger komplexe Programme mit Argumenten behelfen, aber irgendwann wird das so unübersichtlich, dass es nicht mehr wart- oder erweiterbar ist.

Du verwendest ja schon `lambda`, besser ist es aber functools.partial zu verwenden und einfach das Label mit als Argument zu übergeben:

Code: Alles auswählen

from functools import partial

...

    result_label = tk.Label(momentum_calc_window, text="Berechnung", width=8, height=3)
    result_label.grid(row=1, column=2, padx='5', pady='5', sticky='ew')

    tk.Button(momentum_calc_window,
        text="ENTER", width=8, height=3,
        command=partial(which_button, result_label, "enter")
    ).grid(row=1, column=0, padx='5', pady='5', sticky='ew')
  
  
def which_button(label, button_press):
    label["text"] = button_press
Antworten