Seite 1 von 1

Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 07:43
von M4TTHI_01
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

Re: Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 08:09
von Sirius3
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"

Re: Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 08:40
von M4TTHI_01
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.

Re: Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 08:45
von __deets__
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.

Re: Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 08:50
von M4TTHI_01
Danke für die Hilfe. 🤦‍♂️

Re: Text eines Labels in Tk verändern

Verfasst: Dienstag 15. März 2022, 09:10
von Sirius3
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