So, jetzt bin ich es nochmals. Habe mal versucht eure Ratschläge umzusetzen.
Ich habe für mein kleines Programm die Klasse "Config" angelegt um dort alles was mit INI-Files lesen/schreiben zu tun hat abzuhandeln. Dann habe ich die Klasse "Filehandling" angelegt um dort alles was mit Log-Files lesen/schreiben zu tun hat abzuhandeln. Die Klasse "MainView" zur Visualisierung und Einstellung bleibt bestehen. Von ihr rufe ich dann die Klassen "Config" und "Filehandling" auf.
Werte welche immer gleich bleiben und mehrmals benützt werden habe ich als Konstanten deklariert.
@BlackJack von den Typzusätzen von den Variablen bin ich noch nicht ganz losgekommen, auch wenn du mir geraten hast dies zu tun. Habe zwar versucht diese zu eleminieren, aber teilweise fällt es mir doch leichter wenn ich z.B. bei Integer Variable ein i vorstelle.
Die Namensgebung der Funktionen habe ich nach Python-Style abgeändert.
Folgender Code läuft so wie ich es mir vorstelle. Ich würde euch bitten nochmals kurz drüber zu sehen ob der soweit in Ordnung ist.
Ach ja, eine Frage habe ich dann doch noch. In der Funktion "read_log_soll_temp" öffne ich ein TXT-File und schliesse es nicht mehr expizit. Ist das so iO. oder sollte ich da am Ende doch noch lieber ein fobj_read.close() schreiben?
Code: Alles auswählen
# -*- coding: utf-8 -*-
#Import für Qt
import sys
from PyQt5 import QtWidgets, QtCore, uic
#Import für Python
import datetime
import configparser
#Konstanten
INI_FILE = "D:\Sandbox\TestPythonProjekte\KuehlungWechselrichter\KuehlungWechselrichter.ini"
LOG_FILE_SOLL_TEMP = "D:\Sandbox\TestPythonProjekte\KuehlungWechselrichter\LogTempSoll.txt"
LOG_FILE_HYSTERESE = "D:\Sandbox\TestPythonProjekte\KuehlungWechselrichter\LogHysterese.txt"
INI_SEKTION_KUEHLUNG_WR = "KuehlungWr"
INI_ITEM_SOLL_TEMP = "SollTemp"
INI_ITEM_HYSTERESE = "Hysterese"
#Klasse Config anlegen
class Config(object):
def __init__(self, configfile):
self.configfile = configfile
self.config = self.read()
#INI File: lesen
def read(self):
config = configparser.ConfigParser()
config.read(self.configfile)
return config
#INI File: schreiben
def write(self):
with open(self.configfile, 'w') as configfile:
self.config.write(configfile)
#INI File: einen Wert ermitteln
def read_value_ini_file(self, Item):
self.read()
return self.config[INI_SEKTION_KUEHLUNG_WR][str(Item)]
#INI File: einen Wert schreiben
def write_value_ini_file(self, Item, iValue):
self.read()
#Festlegung Solltemperatur
if (str(Item) == INI_ITEM_SOLL_TEMP):
self.config[INI_SEKTION_KUEHLUNG_WR][INI_ITEM_SOLL_TEMP] = str(iValue)
#Festlegung Schalthysterese
if (str(Item) == INI_ITEM_HYSTERESE):
self.config[INI_SEKTION_KUEHLUNG_WR][INI_ITEM_HYSTERESE] = str(iValue)
self.write()
#Klasse Filehandling anlegen
class Filehandling(object):
def __init__(self):
super(Filehandling, self).__init__()
#letzte Änderung der Solltemperaur aus Log File ermitteln
def read_log_soll_temp(self):
#Datei öffnen und lesen
fobj_read = open(LOG_FILE_SOLL_TEMP, 'r').readlines()
i=0 # Laufvariable initalisieren
for line in fobj_read:
i = i+1
lastValue = fobj_read[i-1] # letzter Eintrag in Log File
Laenge_lastValue = len(lastValue) # String Länge bestimmen
strRetVal = lastValue[0:Laenge_lastValue-5]
return strRetVal
#letzte Änderung der Hysterese aus Log File ermitteln
def read_log_hysterese(self):
#Datei öffnen und lesen
fobj_read = open(LOG_FILE_HYSTERESE, 'r').readlines()
i=0 # Laufvariable initalisieren
for line in fobj_read:
i = i+1
lastValue = fobj_read[i-1] # letzter Eintrag in Log File
Laenge_lastValue = len(lastValue) # String Länge bestimmen
strRetVal = lastValue[0:Laenge_lastValue-5]
return strRetVal
#Änderung der Solltemperatur mit Zeitstempel in Log File speichern
def write_log_soll_temp(self, SollTemp):
#Zeitstempel generieren
strZeitstempel = datetime.datetime.now().strftime("%Y.%m.%d %H:%M:%S")
print (strZeitstempel + " ; " + str(SollTemp)) #Ausgabe im Python Shell
#Datei öffnen und übernommene Solltemperatur schreiben
fobj_write = open(LOG_FILE_SOLL_TEMP,"a")
fobj_write.write(strZeitstempel + " ; " + str(SollTemp) +"\n")
fobj_write.close()
#Änderung der Hysterese mit Zeitstempel in Log File speichern
def write_log_hysterese(self, Hysterese):
#Zeitstempel generieren
strZeitstempel = datetime.datetime.now().strftime("%Y.%m.%d %H:%M:%S")
print (strZeitstempel + " ; " + str(Hysterese)) #Ausgabe im Python Shell
#Datei öffnen und übernommene Hysterese schreiben
fobj_write = open(LOG_FILE_HYSTERESE,"a")
fobj_write.write(strZeitstempel + " ; " + str(Hysterese) +"\n")
fobj_write.close()
#Klasse MainView anlegen
class MainView(QtWidgets.QMainWindow):
def __init__(self, config, filehandling):
super(MainView, self).__init__()
uic.loadUi("MainView.ui", self)
#Solltemperatur lesen / Schieberegler und LCD Anzeige initalisieren
iAktValue = config.read_value_ini_file(INI_ITEM_SOLL_TEMP)
self.SliderSollTemp.setValue(int(iAktValue))
self.LcdSollTemp.display(int(iAktValue))
#Schalthysteres lesen / Schieberegler und LCD Anzeige initalisieren
iAktValue = config.read_value_ini_file(INI_ITEM_HYSTERESE)
self.SliderHysterese.setValue(int(iAktValue))
self.LcdHysterese.display(int(iAktValue))
#letzte Änderung der Solltemperatur ermitteln
self.lb_change_solltemp_akt()
#letzte Änderung der Hysterese ermitteln
self.lb_change_hysterese_akt()
#Initalisieren Signal / Slots
self.SliderSollTemp.valueChanged.connect(self.soll_temp_aenderung)
self.SliderHysterese.valueChanged.connect(self.hysterese_aenderung)
self.pB_SollTempUeber.clicked.connect(self.soll_temp_uebernahme)
self.pB_HystereseUeber.clicked.connect(self.hysterese_uebernahme)
#Schalttemperaturen für Lüfter berechnen
self.berechnung_schalttemp_luefter()
#MainView anzeigen
self.show()
#Funktion Label für letzte Änderung der Soll Temperatur richtigstellen
def lb_change_solltemp_akt(self):
strLastChange = filehandling.read_log_soll_temp()
self.lbLetztAenderungValue.setText(strLastChange)
#Funktion Label für letzte Änderung der Hysterese richtigstellen
def lb_change_hysterese_akt(self):
strLastChange = filehandling.read_log_hysterese()
self.lbLetztAenderungValueHysterese.setText(strLastChange)
#Funktion Änderung Solltemperatur
def soll_temp_aenderung(self):
Value=self.SliderSollTemp.value()
self.LcdSollTemp.display(Value)
#Funktion Änderung Hysterese
def hysterese_aenderung(self):
Value=self.SliderHysterese.value()
self.LcdHysterese.display(Value)
#Funktion Solltemperatur übernehmen
def soll_temp_uebernahme(self):
iValue=self.SliderSollTemp.value()
print(str(iValue))
config.write_value_ini_file(INI_ITEM_SOLL_TEMP, iValue)
filehandling.write_log_soll_temp(iValue)
self.lb_change_solltemp_akt()
#Funktion Solltemperatur übernehmen
def hysterese_uebernahme(self):
iValue=self.SliderHysterese.value()
print(str(iValue))
config.write_value_ini_file(INI_ITEM_HYSTERESE, iValue)
filehandling.write_log_hysterese(iValue)
self.lb_change_hysterese_akt()
def berechnung_schalttemp_luefter(self):
print("SchalttempLüfter")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
config = Config(INI_FILE)
filehandling = Filehandling()
window = MainView(config, filehandling)
sys.exit(app.exec_())
nochmals ein Danke an alle für Eure Geduld und Hilfe
michpro