Tkinter Datei lesen und Wert anzeigen

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
Alod89
User
Beiträge: 4
Registriert: Mittwoch 22. Juni 2016, 16:08

Hallo zusammen,
ich habe eine ein Problem bei der Verbindung von 2 Programmen zu einem Programm. Leider bin ich mit Python nicht so vertraut und aus Zeitgründen suche ich daher hier um Hilfe. :K

Dieser Programmcode soll dazu dienen eine log Datei jede Sekunde auszulesen und den Eintrag dann zu löschen:

Code: Alles auswählen

import time
while True:
  time.sleep(1)
  fobj= open("/opt/fhem/log/fhem.log")
  for line in fobj:
    Speicher=line.rstrip()
    print Speicher[25:28]
  with open("/opt/fhem/log/fhem.log", 'w'):
    pass
  fobj.close()
Das ist unser Tkinter Programm:

Code: Alles auswählen

import sys
import time
from Tkinter import *
Einheit="""m/s"""
Speicher = 11
root = Tk()
root.configure(background='black')
bild = PhotoImage(file="/home/pi/Desktop/Bild4.gif")
w1 = Label(root, image=bild).pack(side="top")
w2 = Label(root,text=Speicher ,fg = "green",bg = "black",font = "Helvetica 70 bold italic").pack(side="top")
w3 = Label(root,pady = -140,text=Einheit,fg = "green",bg = "black",font = "Helvetica 50 bold italic").pack(side="top")
root.mainloop()

Mein Problem ist es nun diese beiden Programme zu verbinden. Ziel ist es das die Log Datei ausgelesen wird und dann der aktuelle Wert auf dem Bildschirm erscheint.Das Program läuft über Python 2.7.9 und einem raspberry pi.

Ich bin für jede Hilfe oder Tipp dankbar. :D

Gruß Kevin
Zuletzt geändert von Anonymous am Mittwoch 22. Juni 2016, 17:08, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alod89: will man etwas periodisch in Tkinter aufrufen gibt es die after-Methode:

Code: Alles auswählen

import Tkinter as tk

EINHEIT = "m/s"
LOG_FILE = "/opt/fhem/log/fhem.log"

class MainWin(tk.Tk):
    def __init__(self):
        tk.Tk.__init__()
        self.bild = tk.PhotoImage(file="/home/pi/Desktop/Bild4.gif")
        self.speicher = tk.StringVar()
        self.configure(background='black')
        tk.Label(self, image=self.bild).pack(side="top")
        tk.Label(self, textvariable=self.speicher, fg="green", bg="black", font="Helvetica 70 bold italic").pack(side="top")
        tk.Label(self, pady=-140, text=EINHEIT, fg="green", bg="black", font="Helvetica 50 bold italic").pack(side="top")
        self.after(1000, self.read)
        
    def read(self):
        with open(LOG_FILE) as lines:
            for line in lines:
                pass
            self.speicher.set(line.rstrip()[25:28])
        with open(LOG_FILE, 'w'):
            pass
        self.after(1000, self.read)
        
def main():
    root = MainWin()
    root.mainloop()

if __name__ == '__main__':
    main()
Alod89
User
Beiträge: 4
Registriert: Mittwoch 22. Juni 2016, 16:08

@Sirius3 Erstmal dickes Dankeschön für deine schnelle Hilfe :oops: .Ohne weiteres wäre ich auf deine Lösung nie gekommen.
Habe dein Programm ausprobiert bekomme aber leider eine Fehlermeldung. Vielleicht kannst du damit was anfangen:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/pi/Desktop/Test2.py", line 31, in <module>
    main()
  File "/home/pi/Desktop/Test2.py", line 27, in main
    root = MainWin()
  File "/home/pi/Desktop/Test2.py", line 8, in __init__
    tk.Tk.__init__()
TypeError: unbound method __init__() must be called with Tk instance as first argument (got nothing instead)
>>>
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst nur das self an das tk.Tk.__init__() uebergeben - also tk.Tk.__init__(self) schreiben.
Alod89
User
Beiträge: 4
Registriert: Mittwoch 22. Juni 2016, 16:08

Danke :D
Ich habe ehrlich gesagt nicht so schnell mit einer Lösung gerechnet. Dickes Lob an euch beiden.

1 Frage hätte ich noch :oops:

Code: Alles auswählen

self.after(1000, self.read)

Wiederholt das Programm die schleife 1000 mal oder wofür steht das?
Und falls ja gibt es eine Möglichkeit dort eine Endlosschleife einzubauen? :K
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alod89: die 1000 sind Millisekunden, also wird read wieder nach 1 Sekunde aufgerufen, und da es am Ende von read steht, wird read endlos aufgerufen.
Alod89
User
Beiträge: 4
Registriert: Mittwoch 22. Juni 2016, 16:08

Super Danke an euch beiden! :D :D :D
Antworten