Aktualisierungsbutton geht nicht

Fragen zu Tkinter.
Antworten
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo,

im Moment steh ich auf dem Schlauch und finde der Fehler nicht(es könnte auch mein Ansatz komplett falsch sein). Das GUI funktioniert soweit und die Werte werden nach dem Start auch angezeigt.
Nur der Aktualisierungsbutton ließt zwar die Werte neu aus, aber diese werden im GUI nicht aktualisiert.

Könnte ihr mir bitte helfen

Gruß
Franzel

Code: Alles auswählen

#Test GUI

import tkinter
import sys
import time
x = 0

def ende():
    main.destroy()

def aktuell():

    #Funktion Werte einlesen
    try:
        d = open("//Fritz-nas/nas-fritz/WD-MyPassport0827-01/Franzel/Wetterdaten/wetter-test/test_gui.txt","r")
       
    except:
        print("Dateizugriff erster Zufriff nicht erfolgreich")
        sys.exit(0)

    #Datei auslesen
    zeile = d.readline().split()

    #Datei schließen
    d.close()

    #Daten aus Datei (Liste) Variablen zuweisen
    datum = zeile[0]
    global datum
    uhrzeit = zeile[1]
    global uhrzeit
    luftfeuchte = zeile[2]
    global luftfeuchte
    temperatur1 = zeile[3]
    global temperatur1
    temperatur2 = zeile[4]
    global temperatur2
    luftdruck = zeile[5]
    global luftdruck
    meereshoehe = zeile[6]
    global meereshoehe
    leera = zeile[7]
    global leera
    uv = zeile[8]
    global uv
    helligkeit = zeile[9]
    global helligkeit
    fuellmenge = zeile[10]
    global fuellmenge
    leerb = zeile[11]
    global leerb
    mq2 = zeile[12]
    global mq2
    mq7 = zeile[13]
    global mq7
    mq135 = zeile[14]
    global mq135
    leerc = zeile[15]
    global leerc
    regena = zeile[16]
    global regena
    regend = zeile[17]
    global regend
    leerd = zeile[18]
    global leerd
    lux = zeile[19]
    global lux

    print("Test Werte einlesen ausgeführt")
    print("Nur zum testen ",datum)
    print ("Nur zum testen ",uhrzeit)

#Hauptprogramm
    
#Werte einlesen
aktuell()
   
#Hauptfenster
main = tkinter.Tk()

#Grafik einbinden
lb3 = tkinter.Label(main)
im = tkinter.PhotoImage(file="wetterstation.gif")
lb3["image"] = im
lb3.pack()

#Button Werte aktuallisieren
buttonaktuell = tkinter.Button(main, text = "Werte aktuallisieren", command =aktuell)
buttonaktuell.pack()

#Button Fenster schließen
buttonende = tkinter.Button(main, text = "Fenster schließen", command =ende)
buttonende.pack()

#Datum
lb1 = tkinter.Label(main, text =(("Datum:"), datum))
lb1["font"] = "Courier 10 bold"
lb1["height"] = 2
lb1["width"] = 35
lb1["borderwidth"] = 2
lb1["relief"] = "ridge"
lb1["bg"] = "#FFFFFF"
lb1["fg"] = "#000000"
lb1["anchor"] = "w"
lb1.pack()

#Uhrzeit
lb1 = tkinter.Label(main, text =(("Uhrzeit:"), uhrzeit))
lb1["font"] = "Courier 10 bold"
lb1["height"] = 2
lb1["width"] = 35
lb1["borderwidth"] = 2
lb1["relief"] = "ridge"
lb1["bg"] = "#FFFFFF"
lb1["fg"] = "#000000"
lb1["anchor"] = "w"
lb1.pack()


#Temperatur 1
lb1 = tkinter.Label(main, text =(("Temperatur_1:"), temperatur1, "°C"))
lb1["font"] = "Courier 10 bold"
lb1["height"] = 2
lb1["width"] = 35
lb1["borderwidth"] = 2
lb1["relief"] = "ridge"
lb1["bg"] = "#FFFFFF"
lb1["fg"] = "#FF0000"
lb1["anchor"] = "w"
lb1.pack()

#Temperatur 2
lb1 = tkinter.Label(main, text =(("Temperatur_2:"), temperatur2, "°C"))
lb1["font"] = "Courier 10 bold"
lb1["height"] = 2
lb1["width"] = 35
lb1["borderwidth"] = 2
lb1["relief"] = "ridge"
lb1["bg"] = "#FFFFFF"
lb1["fg"] = "#FF0000"
lb1["anchor"] = "w"
lb1.pack()

#Luftfeuchte
lb2 = tkinter.Label(main, text = (("Luftfeuchte:"), luftfeuchte, "%"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#0000FF"
lb2["anchor"] = "w"
lb2.pack()

#Luftdruck
lb2 = tkinter.Label(main, text = (("Luftdruck:"), luftdruck, "Kpa"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#0E821D"
lb2["anchor"] = "w"
lb2.pack()

#Meereshoehe
lb2 = tkinter.Label(main, text = (("Meereshöhe:"), meereshoehe, "m"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#0E821D"
lb2["anchor"] = "w"
lb2.pack()

#nicht belegt
lb2 = tkinter.Label(main, text = (("AE1_leer:"), leera, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#00AEFF"
lb2["anchor"] = "w"
lb2.pack()

#UV Intensität
lb2 = tkinter.Label(main, text = (("AE2_UV_Intensität:"), uv, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#00AEFF"
lb2["anchor"] = "w"
lb2.pack()

#Helligkeit
lb2 = tkinter.Label(main, text = (("AE3_Helligkeit:"), helligkeit, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#00AEFF"
lb2["anchor"] = "w"
lb2.pack()

#Füllmenge
lb2 = tkinter.Label(main, text = (("AE4_Füllmenge:"), fuellmenge, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#00AEFF"
lb2["anchor"] = "w"
lb2.pack()

#nicht belegt
lb2 = tkinter.Label(main, text = (("AE5_leer:"), leerb, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#FF1E9D"
lb2["anchor"] = "w"
lb2.pack()

#MQ-2 Methan Butan LPG Rauch
lb2 = tkinter.Label(main, text = (("AE6_Brennbare_Gase:"), mq2, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#FF1E9D"
lb2["anchor"] = "w"
lb2.pack()

#MQ-7 Carbon Monoxide
lb2 = tkinter.Label(main, text = (("AE7_Kohlenmonoxid:"), mq7, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#FF1E9D"
lb2["anchor"] = "w"
lb2.pack()

#MQ-135 Luftqualität, Benzon, Alkohol, Rauch
lb2 = tkinter.Label(main, text = (("AE8_Luftqualität:"), mq135, "Ohm"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#FF1E9D"
lb2["anchor"] = "w"
lb2.pack()

#nicht belegt
lb2 = tkinter.Label(main, text = (("AE9_leer:"), leerc, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#583D82"
lb2["anchor"] = "w"
lb2.pack()

#Regen analog
lb2 = tkinter.Label(main, text = (("AE10_Regen_analog:"), regena, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#583D82"
lb2["anchor"] = "w"
lb2.pack()

#Regen digital
lb2 = tkinter.Label(main, text = (("AE11_Regen_digital:"), regend, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#583D82"
lb2["anchor"] = "w"
lb2.pack()

#nicht belegt
lb2 = tkinter.Label(main, text = (("AE12_leer:"), leerd, "???"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#583D82"
lb2["anchor"] = "w"
lb2.pack()

#Licht in Lux
lb2 = tkinter.Label(main, text = (("Licht:"), lux, "lux"))
lb2["font"] = "Courier 10 bold"
lb2["height"] = 2
lb2["width"] = 35
lb2["borderwidth"] = 2
lb2["relief"] = "ridge"
lb2["bg"] = "#FFFFFF"
lb2["fg"] = "#FFD800"
lb2["anchor"] = "w"
lb2.pack()
    
#Endlosschleife
main.mainloop()
Zuletzt geändert von Anonymous am Montag 21. November 2016, 16:32, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Franzel007: Da steht ja auch nirgends Code in der Funktion der die Werte in der GUI aktualisiert. Es werden die Werte eingelesen und an Namen gebunden. Und das wars. Dadurch ändert sich nicht auf magische Weise die GUI-Anzeige.

Bevor Du das angehst solltest Du allerdings den Code auf Modulebene der keine Konstanten, Funktionen, oder Klassen definiert, in Funktionen verschwinden lassen. Und zwar echten Funktionen. Werte betreten Funktionen als Argumente und verlassen sie als Rückgabewerte. Einfach so magisch auf Werte aus der Umgebung zugreifen und alles Mögliche per ``global`` aussehalb der Funktion binden ist absolut unübersichtlich, nicht ordentlich testbar, nicht wiederverwendbar, und fehleranfällig.

Bei GUIs läuft das in der Regel darauf hinaus, dass man in Python objektorientiert Programmieren muss. Also nicht mehr nur mit Funktionen, sondern auch mit Klassen, wo das nötig ist.

Irgendwelche kryptischen und nummerierten Abkürzungen als Namen sind nicht gut. Namen sollen dem Leser vermitteln was der Wert im Kontext des Programms bedeutet, und nicht zum rätselraten zwingen. Bei nummerierten Namen will man oft auch gar nicht die einzelnen Namen nummerieren, sondern die Werte in einer Datenstruktur ablegen. Oft ist das dann eine Liste.

Bei den einzelnen `Label`-Objekten steht fast immer der gleiche Code. Das ist ein Fall für eine Funktion und/oder eine Schleife, statt da immer wieder fast das selbe hin zu schreiben.

Die ganzen Optionen für die `Label` hätte man auch alle gleich beim Erstellen des Objekts übergeben können, statt für jede einzeln eine Anweisung zu schreiben.

Das Tk Tupel von Werten in eine zusammengesetzte Zeichenkettendarstellung umwandelt würde ich für die `text`-Argumente nicht benutzen. Die Texte würde ich mit Python vor der Übergabe entsprechend formatieren.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was soll denn auch passieren? Du weist die Werte ja nur wieder globalen Namen zu. Darauf reagiert Tkinter nicht.

Du hast zwei Moeglichkeiten:

- per widget.configure(text=...) explizit alles anzupassen.
- stattdessen die *Var-Klassen, wie zB StringVar von Tkinter zu benutzen. Wenn du denen neue Werte zuweist, aktualisieren sich die abgaengigen UI-Elemente selbsttaetig. Waere mein Favorit.
BlackJack

@Franzel007: Das `time`-Modul wird importiert aber nicht verwendet.

`x` wird definiert und auch nicht verwendet.

`sys.exit()` sollte nicht in untergeordneten Funktionen verwendet werden. Eine Funktion zum Einlesen einer Datei sollte nicht ein komplettes Programm beenden. Damit wird diese Funktion viel zu unflexibel.

Ungetestet:

Code: Alles auswählen

import tkinter as tk
from functools import partial


VALUES_FILENAME = (
    '//Fritz-nas/nas-fritz/WD-MyPassport0827-01/Franzel/Wetterdaten/'
    'wetter-test/test_gui.txt'
)


def read_values(filename):
    with open(filename, 'r') as value_file:
        values = next(value_file).split()
    date, time = values[:2]
    print(date, time)
    return values[2:]
 

def update_labels(labels):
    try:
        values = read_values(VALUES_FILENAME)
    except Exception as error:
        print('Error reading values:', error)
    else:
        for (label, prefix, suffix), value in zip(labels, values):
            label['text'] = u'{}: {} {}'.format(prefix, value, suffix)


def main():
    root = tk.Tk()
     
    logo_image = tk.PhotoImage(file='wetterstation.gif')
    tk.Label(root, image=logo_image).pack()
     
    update_button = tk.Button(root, text='Werte aktualisieren')
    update_button.pack()
    tk.Button(root, text='Fenster schließen', command=root.quit).pack()

    label_data = [
        ('Datum', '', '#000000'),
        ('Uhrzeit', '', '#000000'),
        ('Temperatur_1', '°C', '#FF0000'),
        ('Temperatur_2', '°C', '#FF0000'),
        ('Luftfeuchte', '%', '#0000FF'),
        ('Luftdruck', 'Kpa', '#0E821D'),
        ('Meereshöhe', 'm', '#0E821D'),
        ('AE1_leer', '???', '#00AEFF'),
        ('AE2_UV_Intensität', 'Ohm', '#00AEFF'),
        ('AE3_Helligkeit', 'Ohm', '#00AEFF'),
        ('AE4_Füllmenge', 'Ohm', '#00AEFF'),
        ('AE5_leer', '???', '#FF1E9D'),
        ('AE6_Brennbare_Gase', 'Ohm', '#FF1E9D'),
        ('AE7_Kohlenmonoxid', 'Ohm', '#FF1E9D'),
        ('AE8_Luftqualität', 'Ohm', '#FF1E9D'),
        ('AE9_leer', '???', '#583D82'),
        ('AE10_Regen_analog', '???', '#583D82'),
        ('AE11_Regen_digital', '???', '#583D82'),
        ('AE12_leer', '???', '#583D82'),
        ('Licht', 'lux', '#FFD800'),
    ]
    labels = list()
    for prefix, suffix, color in label_data:
        label = tk.Label(
            root,
            font='Courier 10 bold',
            height=2,
            width=35,
            borderwidth=2,
            relief=tk.RIDGE,
            background='white',
            foreground=color,
            anchor=tk.W,
        )
        label.pack()
        labels.append((label, prefix, suffix))

    update_labels(labels)
    update_button['command'] = partial(update_labels, labels)
    root.mainloop()


if __name__ == '__main__':
    main()
Franzel007
User
Beiträge: 13
Registriert: Freitag 12. August 2016, 15:46

Hallo,

danke erstmal, ich werde mich mal daran versuchen.
Ich muss wohl noch sehr viel lernen, werde aber nicht aufgeben.

Danke nochmals, ich melde mich wenn ich weiter bin.

Gruß
Franzel
Antworten