Problem bei Betätigen des Command-Buttons...

Fragen zu Tkinter.
Antworten
a1489@eclipso.de
User
Beiträge: 1
Registriert: Freitag 18. Februar 2022, 07:37

Hallo allerseits,

ich bin recht schnell mit meinen rudimentären Programmierkünsten an meine Grenzen gestoßen.....
Hab mir eine GUI gebastelt und möchte, dass bei Betätigen des 30-Tage-Durchschnittsbutton in das gelbe Label links daneben einfach ein vorgegebener Wert eingetragen wird, hier der Wert 1 aus dem Array "Lufttemperatur".
Aber:
Es erscheint eine Fehlermeldung:
can only concatenate str (not "int") to str

Theoretisch ist mir klar, dass sich hier Integer und String gegenüberstehen und nicht miteinenander "können". Leider kann ich dieses Problem nicht lösen.
Wer kann mir auf die Sprünge helfen? Nicht mit korrigierten Quellcode - eine Erklärung wäre klasse.


Besten Dank!

Andreas

Hier mein Quelltext:


from tkinter import *
from tkinter import Pack
import tkinter as tk
from array import array
#GPIO.setmode(GPIO.Board)

Lufttemperatur=array("f",[100.6,-200,22,33,44])

def buttonDurchschnittClick():
#Anzeige=(Lufttemperatur[1])
LabelProbe.config(text=(Lufttemperatur[1]))



Fenster = tk.Tk() #Fenster erstellen
Fenster.geometry("640x480")# Fenstergröße
Fenster.wm_title("Gewächshaus") #FensterTitel
Fenster.config(background = "black") #Hintergrund des Fensters
Frame1 = Frame(Fenster, width=0, height =0)# Rahmen richtet sich nach der Zahl und Größe der Buttons
Frame1.grid(row=0, column=0, padx=0,pady=0)# nix ändern
Lufttemperatur=Label(Frame1,width=10, height= 4,text="Luft-\ntemperatur\n °C",background="#6495ED")
Lufttemperatur.pack(side=tk.LEFT, expand=1)
Lufttemperatur.pack(ipadx=0,ipady=0)
#Lufttemperatur.place(x=0,y=2)
Button3 = Button(Frame1,width=10, height=2, text="30 Tage\nDurchnscnitt", background="#FFA550", border=20,activebackground="Yellow",command=buttonDurchschnittClick)
Button3.pack(side=tk.RIGHT, expand=1)
Button3.pack(ipadx=0,ipady=0)
#Label ohne place, hier nur Button Lufttemperatur weiss grün
LabelLufttemperatur=Label(Frame1, width=10, height=0,fg="white",bg="green",font="Arial 8",text="Lufttemperatur")
LabelLufttemperatur.pack(side=tk.TOP, ipadx=10,ipady=0,expand=1)
LabelProbe=Label(Frame1,width=10,height=0,fg="black",bg="yellow")
LabelProbe.pack(side=tk.BOTTOM)

buttonDurchschnitt=Button(Frame1,bg="blue",command=buttonDurchschnittClick)

Fenster.mainloop() # gui wird geupdated. danach keine Elemente
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem nennt sich String formatting und ist in der entsprechenden Sektion der Python Dokumentation gut erklärt.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast einen *-Import importierst aber gleichzeitig tkinter als tk. Warum beides? Ersteres sollte nicht existieren. tkinter.Pack wird dann nochmal in den eigenen Namensraum eingebunden, aber gar nicht benutzt (ich wüßte auch keinen Grund das jemals zu benutzen).
`array` wird selten gebraucht. Bei Dir ist das nicht der Fall. Da reicht eine einfache Liste.
Die Variable `Lufttemperatur` überschreibst Du dann auch gleich durch ein Label.
Variablennamen schreibt man generell klein, ebenso Funktionen. Globale Variablen benutzt man nicht. Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen.
Die Größe des Fensters ergibt sich durch dessen Inhalt, man gibt keine Größe explizit an.
Was soll die 1 bei Frame1 oder die 3 bei Button3? Variablennamen sollen aussagekräftig sein und keine nichtssagenden Nummern enthalten. Manche Variablen sind gar nicht nötig, wie bei Button3, weil das später nicht mehr gebraucht wird.
Die doppelten pack-Aufrufe sind unsinnig.
`buttonDurchschnitt` wird gar nicht ins Fenster gepackt, ist also überflüssig.

Jetzt wäre es noch nett gewesen, genau zu schreiben, wo der Fehler auftritt.
Du versuchst auf die Option 1 eines Labels zuzugreifen. Optionen haben aber Namen als Strings.
Wenn man raten müßte, willst Du Lufttemperatur gar nicht mit einem Label überschreiben, sondern eigentlich die Liste verwenden.

Code: Alles auswählen

from functools import partial
import tkinter as tk

def button_durchschnitt_click(label_probe, lufttemperatur):
    label_probe.config(text=lufttemperatur[1])

def main():
    lufttemperatur = [100.6,-200,22,33,44]

    fenster = tk.Tk()
    fenster.wm_title("Gewächshaus")
    fenster.config(background = "black")

    frame = tk.Frame(fenster, width=0, height =0)
    frame.grid(row=0, column=0, padx=0,pady=0)
    tk.Label(frame, width=10, height=4,
        text="Luft-\ntemperatur\n °C", background="#6495ED"
    ).pack(side=tk.LEFT, expand=1)
    label_probe = tk.Label(frame, width=10, height=0, fg="black", bg="yellow")

    tk.Button(frame, width=10, height=2,
        text="30 Tage\nDurchnscnitt", background="#FFA550",
        border=20,activebackground="Yellow",
        command=partial(button_durchschnitt_click, label_probe, lufttemperatur)
    ).pack(side=tk.RIGHT, expand=1)
    label_lufttemperatur = tk.Label(frame, width=10, height=0,
        fg="white",bg="green",font="Arial 8", text="Lufttemperatur")
    label_lufttemperatur.pack(side=tk.TOP, ipadx=10, ipady=0, expand=1)
    label_probe.pack(side=tk.BOTTOM)
    fenster.mainloop()

if __name__ == "__main__":
    main()
Antworten