Seite 1 von 1

Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 16:35
von Alod89
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

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 17:15
von Sirius3
@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()

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 17:33
von Alod89
@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)
>>>

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 18:01
von __deets__
Du musst nur das self an das tk.Tk.__init__() uebergeben - also tk.Tk.__init__(self) schreiben.

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 18:27
von Alod89
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

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 18:40
von Sirius3
@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.

Re: Tkinter Datei lesen und Wert anzeigen

Verfasst: Mittwoch 22. Juni 2016, 18:45
von Alod89
Super Danke an euch beiden! :D :D :D