diff --git a/doc/mytools.html b/doc/mytools.html index fc798c4..db6bf59 100644 --- a/doc/mytools.html +++ b/doc/mytools.html @@ -12,7 +12,7 @@ Tools-Sammlung.

Global Attributes

- +
None
savefile_connections
savefile_programpath

Classes

diff --git a/doc/revpiplclist.html b/doc/revpiplclist.html index 35924db..1669a44 100644 --- a/doc/revpiplclist.html +++ b/doc/revpiplclist.html @@ -10,7 +10,7 @@ revpiplclist

Global Attributes

- +
_
savefile
_

Classes

diff --git a/doc/revpiprogram.html b/doc/revpiprogram.html index a739a06..4a8dc38 100644 --- a/doc/revpiprogram.html +++ b/doc/revpiprogram.html @@ -10,7 +10,7 @@ revpiprogram

Global Attributes

- +
_
savefile
_

Classes

@@ -23,7 +23,13 @@ Classes

Functions

- + + + + + + +
None
_loaddefaultsÜbernimmt für den Pi die letzen Pfade.
_savedefaultsSchreibt fuer den Pi die letzen Pfade.


@@ -63,12 +69,6 @@ Methods _evt_optup Passt je nach gewählter Option den Status der Widgets an. -_loaddefault -Übernimmt für den Pi die letzen Pfade. - -_savedefaults -Schreibt fuer den Pi die letzen Pfade. - check_replacedir Gibt das rootdir von einem entpackten Verzeichnis zurueck. @@ -139,34 +139,7 @@ RevPiProgram._evt_optup _evt_optup(text="")

Passt je nach gewählter Option den Status der Widgets an. -

-

-RevPiProgram._loaddefault

-_loaddefault(full=False) -

-Übernimmt für den Pi die letzen Pfade. -

-
full
-
-Einstellungen für alle Verbindungen laden -
-
-
Returns:
-
-dict() mit Einstellungen -
-
-

-RevPiProgram._savedefaults

-_savedefaults() -

-Schreibt fuer den Pi die letzen Pfade. -

-
Returns:
-
-True, bei erfolgreicher Verarbeitung -
-
+

RevPiProgram.check_replacedir

check_replacedir(rootdir) @@ -244,5 +217,44 @@ RevPiProgram.setpictoryrsc Überträgt die angegebene piCtory-Konfiguration.

Up
+

+ +

_loaddefaults

+_loaddefaults(revpiname=None) +

+Übernimmt für den Pi die letzen Pfade. +

+
revpiname
+
+Einstellungen nur für RevPi laden +
+
+
Returns:
+
+ mit Einstellungen +
+
+
Up
+

+ +

_savedefaults

+_savedefaults(revpiname, settings) +

+Schreibt fuer den Pi die letzen Pfade. +

+
revpiname
+
+Einstellungen sind für diesen RevPi +
settings
+
+ mit Einstellungen +
+
+
Returns:
+
+True, bei erfolgreicher Verarbeitung +
+
+
Up

\ No newline at end of file diff --git a/revpipycontrol.api b/revpipycontrol.api index 4822d28..35d2dd1 100644 --- a/revpipycontrol.api +++ b/revpipycontrol.api @@ -20,6 +20,8 @@ aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False) aclmanager._?8 mytools.addroot?4(filename) mytools.gettrans?4(proglang=None) +mytools.savefile_connections?7 +mytools.savefile_programpath?7 revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None) revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None) revpicheckclient.RevPiCheckClient.__saveoldvalue?6(event, tkvar) @@ -91,13 +93,10 @@ revpiplclist.RevPiPlcList.root?7 revpiplclist.RevPiPlcList?1(master) revpiplclist._?8 revpiplclist.get_connections?4() -revpiplclist.savefile?7 revpiprogram.RevPiProgram._checkclose?5(event=None) revpiprogram.RevPiProgram._createwidgets?5() revpiprogram.RevPiProgram._evt_optdown?5(text="") revpiprogram.RevPiProgram._evt_optup?5(text="") -revpiprogram.RevPiProgram._loaddefault?5(full=False) -revpiprogram.RevPiProgram._savedefaults?5() revpiprogram.RevPiProgram.check_replacedir?4(rootdir) revpiprogram.RevPiProgram.create_filelist?4(rootdir) revpiprogram.RevPiProgram.getpictoryrsc?4() @@ -108,7 +107,8 @@ revpiprogram.RevPiProgram.plcupload?4() revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None) revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi) revpiprogram._?8 -revpiprogram.savefile?7 +revpiprogram._loaddefaults?5(revpiname=None) +revpiprogram._savedefaults?5(revpiname, settings) revpipycontrol.RevPiPyControl._btnstate?5() revpipycontrol.RevPiPyControl._closeall?5() revpipycontrol.RevPiPyControl._closeapp?5(event=None) diff --git a/revpipycontrol/mytools.py b/revpipycontrol/mytools.py index a1e0a1d..8cd4ab9 100644 --- a/revpipycontrol/mytools.py +++ b/revpipycontrol/mytools.py @@ -9,8 +9,20 @@ import gettext import locale import sys +from os import environ from os.path import dirname from os.path import join as pathjoin +from sys import platform + +# Systemwerte und SaveFiles +if platform == "linux": + homedir = environ["HOME"] +else: + homedir = environ["APPDATA"] +savefile_connections = pathjoin( + homedir, ".revpipyplc", "connections.dat") +savefile_programpath = pathjoin( + homedir, ".revpipyplc", "programpath.dat") def addroot(filename): diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py index 4d78532..4726293 100644 --- a/revpipycontrol/revpioption.py +++ b/revpipycontrol/revpioption.py @@ -162,7 +162,6 @@ class RevPiOption(tkinter.Frame): self.var_pythonver = tkinter.IntVar(prog) self.var_startpy = tkinter.StringVar(prog) self.var_startargs = tkinter.StringVar(prog) - self.var_slave = tkinter.BooleanVar(prog) self.var_slaveacl = tkinter.StringVar(prog) self.var_pythonver.set(3) @@ -210,39 +209,54 @@ class RevPiOption(tkinter.Frame): txt["textvariable"] = self.var_startargs txt.grid(columnspan=2, **cpadw) - # Row 6 - ckb_slave = tkinter.Checkbutton(prog, justify="left") + # Gruppe Services + services = tkinter.LabelFrame(self) + services["text"] = _("RevPiPyLoad server services") + services.grid(columnspan=2, pady=2, sticky="we") + + self.var_slave = tkinter.BooleanVar(services) + self.var_xmlon = tkinter.BooleanVar(services) + self.var_xmlacl = tkinter.StringVar(services) + + # RevPiSlave Service + row = 0 + ckb_slave = tkinter.Checkbutton(services, justify="left") ckb_slave["state"] = xmlstate ckb_slave["text"] = _("Use RevPi as PLC-Slave") ckb_slave["variable"] = self.var_slave ckb_slave.grid(column=0, **cpadw) - btn_slaveacl = tkinter.Button(prog, justify="center") + btn_slaveacl = tkinter.Button(services, justify="center") btn_slaveacl["command"] = self.btn_slaveacl btn_slaveacl["text"] = _("Edit ACL") - btn_slaveacl.grid(column=1, row=6, **cpade) + btn_slaveacl.grid(column=1, row=row, **cpade) - # Gruppe XMLRPC - xmlrpc = tkinter.LabelFrame(self) - xmlrpc["text"] = _("XML-RPC server") - xmlrpc.grid(columnspan=2, pady=2, sticky="we") + row = 1 + lbl = tkinter.Label(services) + lbl["text"] = _("RevPi-Slave service is:") + lbl.grid(column=0, **cpade) - self.var_xmlon = tkinter.BooleanVar(xmlrpc) - self.var_xmlacl = tkinter.StringVar(xmlrpc) + status = self.xmlcli.plcslaverunning() + lbl = tkinter.Label(services) + lbl["fg"] = "green" if status else "red" + lbl["text"] = _("running") if status else _("stopped") + lbl.grid(column=1, row=row, **cpadwe) - ckb_xmlon = tkinter.Checkbutton(xmlrpc) + # XML-RPC Service + row = 2 + ckb_xmlon = tkinter.Checkbutton(services) ckb_xmlon["command"] = self.askxmlon ckb_xmlon["state"] = xmlstate ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi") ckb_xmlon["variable"] = self.var_xmlon ckb_xmlon.grid(**cpadw) - btn_slaveacl = tkinter.Button(xmlrpc, justify="center") + btn_slaveacl = tkinter.Button(services, justify="center") btn_slaveacl["command"] = self.btn_xmlacl btn_slaveacl["text"] = _("Edit ACL") - btn_slaveacl.grid(column=1, row=0, **cpade) + btn_slaveacl.grid(column=1, row=row, **cpade) - # Buttons + # Buttons am Ende btn_save = tkinter.Button(self) btn_save["command"] = self._setappdata btn_save["state"] = xmlstate diff --git a/revpipycontrol/revpiplclist.py b/revpipycontrol/revpiplclist.py index ede576c..29900fd 100644 --- a/revpipycontrol/revpiplclist.py +++ b/revpipycontrol/revpiplclist.py @@ -11,26 +11,22 @@ import pickle import tkinter import tkinter.messagebox as tkmsg from mytools import gettrans -from os import environ, makedirs -from sys import platform +from mytools import savefile_connections as savefile +from revpiprogram import _loaddefaults as programloaddefaults +from revpiprogram import _savedefaults as programsavedefaults +from os import makedirs + # Übersetzungen laden _ = gettrans() -# Systemwerte -if platform == "linux": - homedir = environ["HOME"] -else: - homedir = environ["APPDATA"] -savefile = os.path.join(homedir, ".revpipyplc", "connections.dat") - def get_connections(): u"""Verbindungen aus Datei laden. @return dict() mit Verbindungen""" if os.path.exists(savefile): - fh = open(savefile, "rb") - connections = pickle.load(fh) + with open(savefile, "rb") as fh: + connections = pickle.load(fh) return connections else: return {} @@ -151,11 +147,19 @@ class RevPiPlcList(tkinter.Frame): @return True, bei erfolgreicher Verarbeitung""" try: makedirs(os.path.dirname(savefile), exist_ok=True) - fh = open(savefile, "wb") - pickle.dump(self._connections, fh) + with open(savefile, "wb") as fh: + pickle.dump(self._connections, fh) self.changes = False except: return False + + # Andere Einstellungen aufräumen + dict = programloaddefaults() + for revpi in tuple(dict.keys()): + if revpi not in self._connections: + del dict[revpi] + programsavedefaults(None, dict) + return True def build_listconn(self): diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py index 899fadf..5c19f3e 100644 --- a/revpipycontrol/revpiprogram.py +++ b/revpipycontrol/revpiprogram.py @@ -15,22 +15,50 @@ import tkinter.filedialog as tkfd import tkinter.messagebox as tkmsg import zipfile from mytools import gettrans -from os import environ +from mytools import savefile_programpath as savefile from os import makedirs from shutil import rmtree -from sys import platform from tempfile import mkstemp, mkdtemp from xmlrpc.client import Binary # Übersetzung laden _ = gettrans() -# Systemwerte -if platform == "linux": - homedir = environ["HOME"] -else: - homedir = environ["APPDATA"] -savefile = os.path.join(homedir, ".revpipyplc", "programpath.dat") + +def _loaddefaults(revpiname=None): + u"""Übernimmt für den Pi die letzen Pfade. + @param revpiname Einstellungen nur für RevPi laden + @return mit Einstellungen""" + if os.path.exists(savefile): + with open(savefile, "rb") as fh: + dict_all = pickle.load(fh) + if revpiname is None: + return dict_all + else: + return dict_all.get(revpiname, {}) + return {} + + +def _savedefaults(revpiname, settings): + u"""Schreibt fuer den Pi die letzen Pfade. + + @param revpiname Einstellungen sind für diesen RevPi + @param settings mit Einstellungen + @return True, bei erfolgreicher Verarbeitung + + """ + try: + makedirs(os.path.dirname(savefile), exist_ok=True) + if revpiname is None: + dict_all = settings + else: + dict_all = _loaddefaults() + dict_all[revpiname] = settings + with open(savefile, "wb") as fh: + pickle.dump(dict_all, fh) + except: + return False + return True class RevPiProgram(tkinter.Frame): @@ -54,7 +82,7 @@ class RevPiProgram(tkinter.Frame): self.xmlstate = "normal" if xmlmode >= 3 else "disabled" # Letzte Einstellungen übernehmen - self.opt = self._loaddefault() + self.opt = _loaddefaults() # Fenster bauen self._createwidgets() @@ -250,33 +278,6 @@ class RevPiProgram(tkinter.Frame): else: self.ckb_picup["state"] = "normal" - def _loaddefault(self, full=False): - u"""Übernimmt für den Pi die letzen Pfade. - @param full Einstellungen für alle Verbindungen laden - @return dict() mit Einstellungen""" - if os.path.exists(savefile): - fh = open(savefile, "rb") - dict_all = pickle.load(fh) - if full: - return dict_all - else: - return dict_all.get(self.revpi, {}) - return {} - - def _savedefaults(self): - u"""Schreibt fuer den Pi die letzen Pfade. - @return True, bei erfolgreicher Verarbeitung""" - try: - makedirs(os.path.dirname(savefile), exist_ok=True) - dict_all = self._loaddefault(full=True) - dict_all[self.revpi] = self.opt - fh = open(savefile, "wb") - pickle.dump(dict_all, fh) - self.changes = False - except: - return False - return True - def create_filelist(self, rootdir): u"""Erstellt eine Dateiliste von einem Verzeichnis. @param rootdir Verzeichnis fuer das eine Liste erstellt werden soll @@ -338,7 +339,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name) - self._savedefaults() + self._savedefaults(self.revpi, self.opt) finally: fh.close() @@ -369,7 +370,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern self.opt["getprocimg_dir"] = os.path.dirname(fh.name) - self._savedefaults() + self._savedefaults(self.revpi, self.opt) finally: fh.close() @@ -417,7 +418,7 @@ class RevPiProgram(tkinter.Frame): # Einstellungen speichern self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name) - self._savedefaults() + self._savedefaults(self.revpi, self.opt) elif ec == -1: tkmsg.showerror( _("Error"), @@ -575,7 +576,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern - self._savedefaults() + self._savedefaults(self.revpi, self.opt) finally: fh.close() @@ -751,7 +752,7 @@ class RevPiProgram(tkinter.Frame): self.opt["typeup"] = self.var_typeup.get() self.opt["picup"] = self.var_picup.get() - self._savedefaults() + self._savedefaults(self.revpi, self.opt) elif ec == -1: tkmsg.showerror(