1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 15:43:52 +01:00

RevPiPyLoad Dienste als Gruppe anzeigen

Status der Dienste integriert
FileHandler wurden in Programmfenster nicht geschlossen
programpath.dat wird aufger?umt, wenn RevPi Liste gespeichert wird
This commit is contained in:
2018-04-07 13:39:21 +02:00
parent a60d029f39
commit 7fefb1aece
8 changed files with 154 additions and 111 deletions

View File

@@ -12,7 +12,7 @@ Tools-Sammlung.
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>None</td></tr> <tr><td>savefile_connections</td></tr><tr><td>savefile_programpath</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpiplclist</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr><tr><td>savefile</td></tr> <tr><td>_</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>

View File

@@ -10,7 +10,7 @@ revpiprogram</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3> Global Attributes</h3>
<table> <table>
<tr><td>_</td></tr><tr><td>savefile</td></tr> <tr><td>_</td></tr>
</table> </table>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3> Classes</h3>
@@ -23,7 +23,13 @@ Classes</h3>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3> Functions</h3>
<table> <table>
<tr><td>None</td></tr> <tr>
<td><a style="color:#0000FF" href="#_loaddefaults">_loaddefaults</a></td>
<td>&#220;bernimmt f&#252;r den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#_savedefaults">_savedefaults</a></td>
<td>Schreibt fuer den Pi die letzen Pfade.</td>
</tr>
</table> </table>
<hr /><hr /> <hr /><hr />
<a NAME="RevPiProgram" ID="RevPiProgram"></a> <a NAME="RevPiProgram" ID="RevPiProgram"></a>
@@ -63,12 +69,6 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiProgram._evt_optup">_evt_optup</a></td> <td><a style="color:#0000FF" href="#RevPiProgram._evt_optup">_evt_optup</a></td>
<td>Passt je nach gew&#228;hlter Option den Status der Widgets an.</td> <td>Passt je nach gew&#228;hlter Option den Status der Widgets an.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._loaddefault">_loaddefault</a></td>
<td>&#220;bernimmt f&#252;r den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram._savedefaults">_savedefaults</a></td>
<td>Schreibt fuer den Pi die letzen Pfade.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiProgram.check_replacedir">check_replacedir</a></td> <td><a style="color:#0000FF" href="#RevPiProgram.check_replacedir">check_replacedir</a></td>
<td>Gibt das rootdir von einem entpackten Verzeichnis zurueck.</td> <td>Gibt das rootdir von einem entpackten Verzeichnis zurueck.</td>
</tr><tr> </tr><tr>
@@ -139,34 +139,7 @@ RevPiProgram._evt_optup</h3>
<b>_evt_optup</b>(<i>text=""</i>) <b>_evt_optup</b>(<i>text=""</i>)
<p> <p>
Passt je nach gew&#228;hlter Option den Status der Widgets an. Passt je nach gew&#228;hlter Option den Status der Widgets an.
</p><a NAME="RevPiProgram._loaddefault" ID="RevPiProgram._loaddefault"></a> </p><a NAME="RevPiProgram.check_replacedir" ID="RevPiProgram.check_replacedir"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._loaddefault</h3>
<b>_loaddefault</b>(<i>full=False</i>)
<p>
&#220;bernimmt f&#252;r den Pi die letzen Pfade.
</p><dl>
<dt><i>full</i></dt>
<dd>
Einstellungen f&#252;r alle Verbindungen laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
dict() mit Einstellungen
</dd>
</dl><a NAME="RevPiProgram._savedefaults" ID="RevPiProgram._savedefaults"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram._savedefaults</h3>
<b>_savedefaults</b>(<i></i>)
<p>
Schreibt fuer den Pi die letzen Pfade.
</p><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl><a NAME="RevPiProgram.check_replacedir" ID="RevPiProgram.check_replacedir"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiProgram.check_replacedir</h3> RevPiProgram.check_replacedir</h3>
<b>check_replacedir</b>(<i>rootdir</i>) <b>check_replacedir</b>(<i>rootdir</i>)
@@ -244,5 +217,44 @@ RevPiProgram.setpictoryrsc</h3>
&#220;bertr&#228;gt die angegebene piCtory-Konfiguration. &#220;bertr&#228;gt die angegebene piCtory-Konfiguration.
</p> </p>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div> <div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_loaddefaults" ID="_loaddefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_loaddefaults</h2>
<b>_loaddefaults</b>(<i>revpiname=None</i>)
<p>
&#220;bernimmt f&#252;r den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen nur f&#252;r RevPi laden
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /><hr />
<a NAME="_savedefaults" ID="_savedefaults"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">_savedefaults</h2>
<b>_savedefaults</b>(<i>revpiname, settings</i>)
<p>
Schreibt fuer den Pi die letzen Pfade.
</p><dl>
<dt><i>revpiname</i></dt>
<dd>
Einstellungen sind f&#252;r diesen RevPi
</dd><dt><i>settings</i></dt>
<dd>
<class 'dict'> mit Einstellungen
</dd>
</dl><dl>
<dt>Returns:</dt>
<dd>
True, bei erfolgreicher Verarbeitung
</dd>
</dl>
<div align="right"><a style="color:#0000FF" href="#top">Up</a></div>
<hr /> <hr />
</body></html> </body></html>

View File

@@ -20,6 +20,8 @@ aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False)
aclmanager._?8 aclmanager._?8
mytools.addroot?4(filename) mytools.addroot?4(filename)
mytools.gettrans?4(proglang=None) mytools.gettrans?4(proglang=None)
mytools.savefile_connections?7
mytools.savefile_programpath?7
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None) revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None) revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
revpicheckclient.RevPiCheckClient.__saveoldvalue?6(event, tkvar) revpicheckclient.RevPiCheckClient.__saveoldvalue?6(event, tkvar)
@@ -91,13 +93,10 @@ revpiplclist.RevPiPlcList.root?7
revpiplclist.RevPiPlcList?1(master) revpiplclist.RevPiPlcList?1(master)
revpiplclist._?8 revpiplclist._?8
revpiplclist.get_connections?4() revpiplclist.get_connections?4()
revpiplclist.savefile?7
revpiprogram.RevPiProgram._checkclose?5(event=None) revpiprogram.RevPiProgram._checkclose?5(event=None)
revpiprogram.RevPiProgram._createwidgets?5() revpiprogram.RevPiProgram._createwidgets?5()
revpiprogram.RevPiProgram._evt_optdown?5(text="") revpiprogram.RevPiProgram._evt_optdown?5(text="")
revpiprogram.RevPiProgram._evt_optup?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.check_replacedir?4(rootdir)
revpiprogram.RevPiProgram.create_filelist?4(rootdir) revpiprogram.RevPiProgram.create_filelist?4(rootdir)
revpiprogram.RevPiProgram.getpictoryrsc?4() revpiprogram.RevPiProgram.getpictoryrsc?4()
@@ -108,7 +107,8 @@ revpiprogram.RevPiProgram.plcupload?4()
revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None) revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None)
revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi) revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi)
revpiprogram._?8 revpiprogram._?8
revpiprogram.savefile?7 revpiprogram._loaddefaults?5(revpiname=None)
revpiprogram._savedefaults?5(revpiname, settings)
revpipycontrol.RevPiPyControl._btnstate?5() revpipycontrol.RevPiPyControl._btnstate?5()
revpipycontrol.RevPiPyControl._closeall?5() revpipycontrol.RevPiPyControl._closeall?5()
revpipycontrol.RevPiPyControl._closeapp?5(event=None) revpipycontrol.RevPiPyControl._closeapp?5(event=None)

View File

@@ -9,8 +9,20 @@
import gettext import gettext
import locale import locale
import sys import sys
from os import environ
from os.path import dirname from os.path import dirname
from os.path import join as pathjoin 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): def addroot(filename):

View File

@@ -162,7 +162,6 @@ class RevPiOption(tkinter.Frame):
self.var_pythonver = tkinter.IntVar(prog) self.var_pythonver = tkinter.IntVar(prog)
self.var_startpy = tkinter.StringVar(prog) self.var_startpy = tkinter.StringVar(prog)
self.var_startargs = tkinter.StringVar(prog) self.var_startargs = tkinter.StringVar(prog)
self.var_slave = tkinter.BooleanVar(prog)
self.var_slaveacl = tkinter.StringVar(prog) self.var_slaveacl = tkinter.StringVar(prog)
self.var_pythonver.set(3) self.var_pythonver.set(3)
@@ -210,39 +209,54 @@ class RevPiOption(tkinter.Frame):
txt["textvariable"] = self.var_startargs txt["textvariable"] = self.var_startargs
txt.grid(columnspan=2, **cpadw) txt.grid(columnspan=2, **cpadw)
# Row 6 # Gruppe Services
ckb_slave = tkinter.Checkbutton(prog, justify="left") 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["state"] = xmlstate
ckb_slave["text"] = _("Use RevPi as PLC-Slave") ckb_slave["text"] = _("Use RevPi as PLC-Slave")
ckb_slave["variable"] = self.var_slave ckb_slave["variable"] = self.var_slave
ckb_slave.grid(column=0, **cpadw) 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["command"] = self.btn_slaveacl
btn_slaveacl["text"] = _("Edit ACL") btn_slaveacl["text"] = _("Edit ACL")
btn_slaveacl.grid(column=1, row=6, **cpade) btn_slaveacl.grid(column=1, row=row, **cpade)
# Gruppe XMLRPC row = 1
xmlrpc = tkinter.LabelFrame(self) lbl = tkinter.Label(services)
xmlrpc["text"] = _("XML-RPC server") lbl["text"] = _("RevPi-Slave service is:")
xmlrpc.grid(columnspan=2, pady=2, sticky="we") lbl.grid(column=0, **cpade)
self.var_xmlon = tkinter.BooleanVar(xmlrpc) status = self.xmlcli.plcslaverunning()
self.var_xmlacl = tkinter.StringVar(xmlrpc) 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["command"] = self.askxmlon
ckb_xmlon["state"] = xmlstate ckb_xmlon["state"] = xmlstate
ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi") ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi")
ckb_xmlon["variable"] = self.var_xmlon ckb_xmlon["variable"] = self.var_xmlon
ckb_xmlon.grid(**cpadw) 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["command"] = self.btn_xmlacl
btn_slaveacl["text"] = _("Edit ACL") 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 = tkinter.Button(self)
btn_save["command"] = self._setappdata btn_save["command"] = self._setappdata
btn_save["state"] = xmlstate btn_save["state"] = xmlstate

View File

@@ -11,26 +11,22 @@ import pickle
import tkinter import tkinter
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
from mytools import gettrans from mytools import gettrans
from os import environ, makedirs from mytools import savefile_connections as savefile
from sys import platform from revpiprogram import _loaddefaults as programloaddefaults
from revpiprogram import _savedefaults as programsavedefaults
from os import makedirs
# Übersetzungen laden # Übersetzungen laden
_ = gettrans() _ = gettrans()
# Systemwerte
if platform == "linux":
homedir = environ["HOME"]
else:
homedir = environ["APPDATA"]
savefile = os.path.join(homedir, ".revpipyplc", "connections.dat")
def get_connections(): def get_connections():
u"""Verbindungen aus Datei laden. u"""Verbindungen aus Datei laden.
@return dict() mit Verbindungen""" @return dict() mit Verbindungen"""
if os.path.exists(savefile): if os.path.exists(savefile):
fh = open(savefile, "rb") with open(savefile, "rb") as fh:
connections = pickle.load(fh) connections = pickle.load(fh)
return connections return connections
else: else:
return {} return {}
@@ -151,11 +147,19 @@ class RevPiPlcList(tkinter.Frame):
@return True, bei erfolgreicher Verarbeitung""" @return True, bei erfolgreicher Verarbeitung"""
try: try:
makedirs(os.path.dirname(savefile), exist_ok=True) makedirs(os.path.dirname(savefile), exist_ok=True)
fh = open(savefile, "wb") with open(savefile, "wb") as fh:
pickle.dump(self._connections, fh) pickle.dump(self._connections, fh)
self.changes = False self.changes = False
except: except:
return False 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 return True
def build_listconn(self): def build_listconn(self):

View File

@@ -15,22 +15,50 @@ import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg import tkinter.messagebox as tkmsg
import zipfile import zipfile
from mytools import gettrans from mytools import gettrans
from os import environ from mytools import savefile_programpath as savefile
from os import makedirs from os import makedirs
from shutil import rmtree from shutil import rmtree
from sys import platform
from tempfile import mkstemp, mkdtemp from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary from xmlrpc.client import Binary
# Übersetzung laden # Übersetzung laden
_ = gettrans() _ = gettrans()
# Systemwerte
if platform == "linux": def _loaddefaults(revpiname=None):
homedir = environ["HOME"] u"""Übernimmt für den Pi die letzen Pfade.
else: @param revpiname Einstellungen nur für RevPi laden
homedir = environ["APPDATA"] @return <class 'dict'> mit Einstellungen"""
savefile = os.path.join(homedir, ".revpipyplc", "programpath.dat") 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 <class 'dict'> 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): class RevPiProgram(tkinter.Frame):
@@ -54,7 +82,7 @@ class RevPiProgram(tkinter.Frame):
self.xmlstate = "normal" if xmlmode >= 3 else "disabled" self.xmlstate = "normal" if xmlmode >= 3 else "disabled"
# Letzte Einstellungen übernehmen # Letzte Einstellungen übernehmen
self.opt = self._loaddefault() self.opt = _loaddefaults()
# Fenster bauen # Fenster bauen
self._createwidgets() self._createwidgets()
@@ -250,33 +278,6 @@ class RevPiProgram(tkinter.Frame):
else: else:
self.ckb_picup["state"] = "normal" 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): def create_filelist(self, rootdir):
u"""Erstellt eine Dateiliste von einem Verzeichnis. u"""Erstellt eine Dateiliste von einem Verzeichnis.
@param rootdir Verzeichnis fuer das eine Liste erstellt werden soll @param rootdir Verzeichnis fuer das eine Liste erstellt werden soll
@@ -338,7 +339,7 @@ class RevPiProgram(tkinter.Frame):
) )
# Einstellungen speichern # Einstellungen speichern
self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name) self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults() self._savedefaults(self.revpi, self.opt)
finally: finally:
fh.close() fh.close()
@@ -369,7 +370,7 @@ class RevPiProgram(tkinter.Frame):
) )
# Einstellungen speichern # Einstellungen speichern
self.opt["getprocimg_dir"] = os.path.dirname(fh.name) self.opt["getprocimg_dir"] = os.path.dirname(fh.name)
self._savedefaults() self._savedefaults(self.revpi, self.opt)
finally: finally:
fh.close() fh.close()
@@ -417,7 +418,7 @@ class RevPiProgram(tkinter.Frame):
# Einstellungen speichern # Einstellungen speichern
self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name) self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults() self._savedefaults(self.revpi, self.opt)
elif ec == -1: elif ec == -1:
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
@@ -575,7 +576,7 @@ class RevPiProgram(tkinter.Frame):
) )
# Einstellungen speichern # Einstellungen speichern
self._savedefaults() self._savedefaults(self.revpi, self.opt)
finally: finally:
fh.close() fh.close()
@@ -751,7 +752,7 @@ class RevPiProgram(tkinter.Frame):
self.opt["typeup"] = self.var_typeup.get() self.opt["typeup"] = self.var_typeup.get()
self.opt["picup"] = self.var_picup.get() self.opt["picup"] = self.var_picup.get()
self._savedefaults() self._savedefaults(self.revpi, self.opt)
elif ec == -1: elif ec == -1:
tkmsg.showerror( tkmsg.showerror(