1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 23:53:52 +01:00
Files
revpipycontrol/revpipycontrol/revpilogfile.py
NaruX a60431e456 RevPiLogfile auf neue Byte?bertragung angepasst
Reaktion auf Fehlerbytes vom RevPi f?r Logfile
In Dialogfenster ESC zum schlie?en eingebaut
_checkclose Funktionen zur Pr?fung auf ?nderung und Schlie?en hinzugef?gt
2017-06-29 20:11:55 +02:00

159 lines
5.1 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
import tkinter
from mytools import gettrans
# Übersetzung laden
_ = gettrans()
class RevPiLogfile(tkinter.Frame):
def __init__(self, master, xmlcli):
u"""Init RevPiLogfile-Class."""
super().__init__(master)
self.master.bind("<KeyPress-Escape>", self._closewin)
self.pack(fill="both", expand=True)
self.xmlcli = xmlcli
# Systemvariablen
self.loadblock = 16384
self.mrkapp = 0
self.mrkplc = 0
# Fenster bauen
self._createwidgets()
def _closewin(self, event):
self.master.destroy()
def _createwidgets(self):
u"""Erstellt alle Widgets."""
self.master.wm_title(_("RevPi Python PLC Logs"))
self.rowconfigure(0, weight=0)
self.rowconfigure(1, weight=1)
self.columnconfigure(0, weight=1)
self.columnconfigure(1, weight=0)
self.columnconfigure(2, weight=0)
self.columnconfigure(3, weight=1)
self.columnconfigure(4, weight=0)
self.columnconfigure(5, weight=0)
# PLC Log
self.lblapplog = tkinter.Label(self)
self.lblapplog["text"] = _("RevPiPyLoad - Logfile")
self.lblapplog.grid(column=0, row=0, sticky="w")
self.btnapplog = tkinter.Button(self)
self.btnapplog["command"] = self.btn_clearplc
self.btnapplog["text"] = _("Clear screen")
self.btnapplog.grid(column=1, row=0, sticky="e")
self.plclog = tkinter.Text(self)
self.plcscr = tkinter.Scrollbar(self)
self.plclog.grid(sticky="wnse", columnspan=2, column=0, row=1)
self.plcscr.grid(sticky="ns", column=2, row=1)
self.plclog["yscrollcommand"] = self.plcscr.set
self.plcscr["command"] = self.plclog.yview
# APP Log
self.lblapplog = tkinter.Label(self)
self.lblapplog["text"] = _("Python PLC program - Logfile")
self.lblapplog.grid(column=3, row=0, sticky="w")
self.btnapplog = tkinter.Button(self)
self.btnapplog["command"] = self.btn_clearapp
self.btnapplog["text"] = _("Clear screen")
self.btnapplog.grid(column=4, row=0, sticky="e")
self.applog = tkinter.Text(self)
self.appscr = tkinter.Scrollbar(self)
self.applog.grid(sticky="nesw", columnspan=2, column=3, row=1)
self.appscr.grid(sticky="ns", column=5, row=1)
self.applog["yscrollcommand"] = self.appscr.set
self.appscr["command"] = self.applog.yview
# Logtimer zum Laden starten
self.get_applog(full=True)
self.get_plclog(full=True)
def btn_clearapp(self):
u"""Leert die Logliste der App."""
self.applog.delete(1.0, tkinter.END)
def btn_clearplc(self):
u"""Leert die Logliste des PLC."""
self.plclog.delete(1.0, tkinter.END)
def get_applog(self, full=False):
u"""Ruft App Logbuch ab.
@param full: Ganzes Logbuch laden"""
# Logs abrufen und letzte Position merken
self.mrkapp = self._load_log(
self.applog, self.xmlcli.load_applog, self.mrkapp, full
)
# Timer neu starten
self.master.after(1000, self.get_applog)
def get_plclog(self, full=False):
u"""Ruft PLC Logbuch ab.
@param full: Ganzes Logbuch laden"""
# Logs abrufen und letzte Position merken
self.mrkplc = self._load_log(
self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
)
# Timer neu starten
self.master.after(1000, self.get_plclog)
def _load_log(self, textwidget, xmlcall, startposition, full):
u"""Läd die angegebenen Logfiles herunter.
@param textwidget: Widget in das Logs eingefügt werden sollen
@param xmlcall: xmlrpc Funktion zum Abrufen der Logdaten
@param startposition: Startposition ab der Logdaten kommen sollen
@param full: Komplettes Logbuch laden
@returns: Ende der Datei (neue Startposition)
"""
roll = textwidget.yview()[1] == 1.0
startposition = 0 if full else startposition
logbytes = b''
while True:
# Datenblock vom XML-RPC Server holen
bytebuff = xmlcall(startposition, self.loadblock).data
logbytes += bytebuff
startposition += len(bytebuff)
# Prüfen ob alle Daten übertragen wurden
if len(bytebuff) < self.loadblock:
break
if full:
textwidget.delete(1.0, tkinter.END)
if bytebuff == b'\x16': # 
# Kein Zugriff auf Logdatei
textwidget.delete(1.0, tkinter.END)
textwidget.insert(
tkinter.END, _("Can not access log file on the RevPi")
)
elif bytebuff == b'\x19': # 
# Logdatei neu begonnen
startposition = 0
else:
# Text in Widget übernehmen
textwidget.insert(tkinter.END, logbytes.decode("utf-8"))
# Automatisch ans Ende rollen
if roll or full:
textwidget.see(tkinter.END)
return startposition