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

Watch-Mode IO-Name und IO-Value Seiten getauscht

?bersetzung
Mit develop zusammenf?hren
This commit is contained in:
2018-08-14 09:22:21 +02:00
32 changed files with 1254 additions and 460 deletions

View File

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

View File

@@ -6,7 +6,9 @@
<body style="background-color:#FFFFFF;color:#000000">
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpipycontrol.shared</h1>
<p>
Shared modules.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">

View File

@@ -13,7 +13,7 @@ Packages</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="index-revpipycontrol.shared.html">shared</a></td>
<td></td>
<td>Shared modules.</td>
</tr>
</table>
@@ -30,6 +30,9 @@ Modules</h3>
<td><a style="color:#0000FF" href="revpicheckclient.html">revpicheckclient</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpidevelop.html">revpidevelop</a></td>
<td></td>
</tr><tr>
<td><a style="color:#0000FF" href="revpiinfo.html">revpiinfo</a></td>
<td></td>
</tr><tr>

View File

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

View File

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

192
doc/revpidevelop.html Normal file
View File

@@ -0,0 +1,192 @@
<!DOCTYPE html>
<html><head>
<title>revpidevelop</title>
<meta charset="UTF-8">
</head>
<body style="background-color:#FFFFFF;color:#000000"><a NAME="top" ID="top"></a>
<h1 style="background-color:#FFFFFF;color:#0000FF">
revpidevelop</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiDevelop">RevPiDevelop</a></td>
<td>Zeigt Debugfenster an.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Functions</h3>
<table>
<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>
<hr /><hr />
<a NAME="RevPiDevelop" ID="RevPiDevelop"></a>
<h2 style="background-color:#FFFFFF;color:#0000FF">RevPiDevelop</h2>
<p>
Zeigt Debugfenster an.
</p>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Derived from</h3>
ttk.Frame
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Attributes</h3>
<table>
<tr><td>app</td></tr><tr><td>cli</td></tr><tr><td>root</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Class Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Methods</h3>
<table>
<tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.__init__">RevPiDevelop</a></td>
<td>Init RevPiDevelop-Class.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop._checkclose">_checkclose</a></td>
<td>Pr&#252;ft ob Fenster beendet werden soll.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop._createwidgets">_createwidgets</a></td>
<td>Erstellt alle Widgets.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.btn_domyjob">btn_domyjob</a></td>
<td>Hochladen und neu starten.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.btn_selectpath">btn_selectpath</a></td>
<td>L&#228;sst dem Benuzter ein Verzeichnis ausw&#228;hlen.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.load_pathfiles">load_pathfiles</a></td>
<td>Aktualisiert die Dateiliste.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.refresh_stats">refresh_stats</a></td>
<td>Passt die Widgets an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiDevelop.select_pathfiles">select_pathfiles</a></td>
<td>Setzt state der Buttons.</td>
</tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Static Methods</h3>
<table>
<tr><td>None</td></tr>
</table>
<a NAME="RevPiDevelop.__init__" ID="RevPiDevelop.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop (Constructor)</h3>
<b>RevPiDevelop</b>(<i>master, xmlcli, xmlmode, revpi</i>)
<p>
Init RevPiDevelop-Class.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiDevelop._checkclose" ID="RevPiDevelop._checkclose"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop._checkclose</h3>
<b>_checkclose</b>(<i>event=None</i>)
<p>
Pr&#252;ft ob Fenster beendet werden soll.
</p><dl>
<dt><i>event</i></dt>
<dd>
tkinter-Event
</dd>
</dl><a NAME="RevPiDevelop._createwidgets" ID="RevPiDevelop._createwidgets"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop._createwidgets</h3>
<b>_createwidgets</b>(<i></i>)
<p>
Erstellt alle Widgets.
</p><a NAME="RevPiDevelop.btn_domyjob" ID="RevPiDevelop.btn_domyjob"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.btn_domyjob</h3>
<b>btn_domyjob</b>(<i></i>)
<p>
Hochladen und neu starten.
</p><a NAME="RevPiDevelop.btn_selectpath" ID="RevPiDevelop.btn_selectpath"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.btn_selectpath</h3>
<b>btn_selectpath</b>(<i></i>)
<p>
L&#228;sst dem Benuzter ein Verzeichnis ausw&#228;hlen.
</p><a NAME="RevPiDevelop.load_pathfiles" ID="RevPiDevelop.load_pathfiles"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.load_pathfiles</h3>
<b>load_pathfiles</b>(<i>silent=False</i>)
<p>
Aktualisiert die Dateiliste.
</p><dl>
<dt><i>silent</i></dt>
<dd>
Keinen Dialog anzeigen
</dd>
</dl><a NAME="RevPiDevelop.refresh_stats" ID="RevPiDevelop.refresh_stats"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.refresh_stats</h3>
<b>refresh_stats</b>(<i></i>)
<p>
Passt die Widgets an.
</p><a NAME="RevPiDevelop.select_pathfiles" ID="RevPiDevelop.select_pathfiles"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiDevelop.select_pathfiles</h3>
<b>select_pathfiles</b>(<i>tkevt</i>)
<p>
Setzt state der Buttons.
</p>
<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 />
</body></html>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -10,7 +10,7 @@ revpipycontrol</h1>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>_</td></tr><tr><td>pycontrolversion</td></tr>
<tr><td>_</td></tr><tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr><tr><td>__version__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>
@@ -78,6 +78,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcdebug">plcdebug</a></td>
<td>Baut den Debugframe und packt ihn.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plcdevelop">plcdevelop</a></td>
<td>Startet das Developfenster.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiPyControl.plclist">plclist</a></td>
<td>&#214;ffnet das Fenster f&#252;r die Verbindungen.</td>
</tr><tr>
@@ -200,7 +203,13 @@ Baut den Debugframe und packt ihn.
<dd>
None
</dd>
</dl><a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a>
</dl><a NAME="RevPiPyControl.plcdevelop" ID="RevPiPyControl.plcdevelop"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plcdevelop</h3>
<b>plcdevelop</b>(<i></i>)
<p>
Startet das Developfenster.
</p><a NAME="RevPiPyControl.plclist" ID="RevPiPyControl.plclist"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiPyControl.plclist</h3>
<b>plclist</b>(<i></i>)

View File

@@ -12,7 +12,7 @@ Verwaltet IP Adressen und deren ACLs.
<h3 style="background-color:#FFFFFF;color:#FF0000">
Global Attributes</h3>
<table>
<tr><td>None</td></tr>
<tr><td>__author__</td></tr><tr><td>__copyright__</td></tr><tr><td>__license__</td></tr>
</table>
<h3 style="background-color:#FFFFFF;color:#FF0000">
Classes</h3>

View File

@@ -18,9 +18,16 @@ aclmanager.AclManager.get_acl?4()
aclmanager.AclManager.root?7
aclmanager.AclManager?1(master, minlevel, maxlevel, acl_str="", readonly=False)
aclmanager._?8
aclmanager.__author__?9
aclmanager.__copyright__?9
aclmanager.__license__?9
mytools.__author__?9
mytools.__copyright__?9
mytools.__license__?9
mytools.addroot?4(filename)
mytools.gettrans?4(proglang=None)
mytools.savefile_connections?7
mytools.savefile_developer?7
mytools.savefile_programpath?7
revpicheckclient.RevPiCheckClient.__chval?6(device, io, event=None)
revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
@@ -43,11 +50,34 @@ revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist)
revpicheckclient.RevPiCheckClient.writevalues?4()
revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpicheckclient._?8
revpicheckclient.__author__?9
revpicheckclient.__copyright__?9
revpicheckclient.__license__?9
revpidevelop.RevPiDevelop._checkclose?5(event=None)
revpidevelop.RevPiDevelop._createwidgets?5()
revpidevelop.RevPiDevelop.app?7
revpidevelop.RevPiDevelop.btn_domyjob?4()
revpidevelop.RevPiDevelop.btn_selectpath?4()
revpidevelop.RevPiDevelop.cli?7
revpidevelop.RevPiDevelop.load_pathfiles?4(silent=False)
revpidevelop.RevPiDevelop.refresh_stats?4()
revpidevelop.RevPiDevelop.root?7
revpidevelop.RevPiDevelop.select_pathfiles?4(tkevt)
revpidevelop.RevPiDevelop?1(master, xmlcli, xmlmode, revpi)
revpidevelop._?8
revpidevelop.__author__?9
revpidevelop.__copyright__?9
revpidevelop.__license__?9
revpidevelop._loaddefaults?5(revpiname=None)
revpidevelop._savedefaults?5(revpiname, settings)
revpiinfo.RevPiInfo._checkclose?5(event=None)
revpiinfo.RevPiInfo._createwidgets?5(extended=False)
revpiinfo.RevPiInfo.visitwebsite?4(event=None)
revpiinfo.RevPiInfo?1(master, xmlcli, version)
revpiinfo._?8
revpiinfo.__author__?9
revpiinfo.__copyright__?9
revpiinfo.__license__?9
revpilegacy.RevPiOption._changesdone?5()
revpilegacy.RevPiOption._checkclose?5(event=None)
revpilegacy.RevPiOption._createwidgets?5()
@@ -58,6 +88,9 @@ revpilegacy.RevPiOption.xmlmod2_tail?4()
revpilegacy.RevPiOption.xmlmod_tail?4()
revpilegacy.RevPiOption?1(master, xmlcli)
revpilegacy._?8
revpilegacy.__author__?9
revpilegacy.__copyright__?9
revpilegacy.__license__?9
revpilogfile.RevPiLogfile._checkclose?5(event=None)
revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile._load_log?5(textwidget, xmlcall, startposition, full)
@@ -67,6 +100,9 @@ revpilogfile.RevPiLogfile.get_applog?4(full=False)
revpilogfile.RevPiLogfile.get_plclog?4(full=False)
revpilogfile.RevPiLogfile?1(master, xmlcli)
revpilogfile._?8
revpilogfile.__author__?9
revpilogfile.__copyright__?9
revpilogfile.__license__?9
revpioption.RevPiOption._changesdone?5()
revpioption.RevPiOption._checkclose?5(event=None)
revpioption.RevPiOption._checkvalues?5()
@@ -78,6 +114,9 @@ revpioption.RevPiOption.btn_slaveacl?4()
revpioption.RevPiOption.btn_xmlacl?4()
revpioption.RevPiOption?1(master, xmlcli)
revpioption._?8
revpioption.__author__?9
revpioption.__copyright__?9
revpioption.__license__?9
revpiplclist.RevPiPlcList._checkclose?5(event=None)
revpiplclist.RevPiPlcList._createwidgets?5()
revpiplclist.RevPiPlcList._saveappdata?5()
@@ -92,6 +131,9 @@ revpiplclist.RevPiPlcList.myapp?7
revpiplclist.RevPiPlcList.root?7
revpiplclist.RevPiPlcList?1(master)
revpiplclist._?8
revpiplclist.__author__?9
revpiplclist.__copyright__?9
revpiplclist.__license__?9
revpiplclist.get_connections?4()
revpiprogram.RevPiProgram._checkclose?5(event=None)
revpiprogram.RevPiProgram._createwidgets?5()
@@ -107,6 +149,9 @@ revpiprogram.RevPiProgram.plcupload?4()
revpiprogram.RevPiProgram.setpictoryrsc?4(filename=None)
revpiprogram.RevPiProgram?1(master, xmlcli, xmlmode, revpi)
revpiprogram._?8
revpiprogram.__author__?9
revpiprogram.__copyright__?9
revpiprogram.__license__?9
revpiprogram._loaddefaults?5(revpiname=None)
revpiprogram._savedefaults?5(revpiname, settings)
revpipycontrol.RevPiPyControl._btnstate?5()
@@ -119,6 +164,7 @@ revpipycontrol.RevPiPyControl._opt_conn?5(text, reconnect=False)
revpipycontrol.RevPiPyControl.infowindow?4()
revpipycontrol.RevPiPyControl.myapp?7
revpipycontrol.RevPiPyControl.plcdebug?4()
revpipycontrol.RevPiPyControl.plcdevelop?4()
revpipycontrol.RevPiPyControl.plclist?4()
revpipycontrol.RevPiPyControl.plclogs?4()
revpipycontrol.RevPiPyControl.plcoptions?4()
@@ -133,7 +179,13 @@ revpipycontrol.RevPiPyControl.tmr_plcrunning?4()
revpipycontrol.RevPiPyControl.visitwebsite?4()
revpipycontrol.RevPiPyControl?1(master=None)
revpipycontrol._?8
revpipycontrol.pycontrolversion?7
revpipycontrol.__author__?9
revpipycontrol.__copyright__?9
revpipycontrol.__license__?9
revpipycontrol.__version__?9
revpipycontrol.shared.__author__?9
revpipycontrol.shared.__copyright__?9
revpipycontrol.shared.__license__?9
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_acl?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_filename?6()
revpipycontrol.shared.ipaclmanager.IpAclManager.__get_regex_acl?6()
@@ -147,4 +199,7 @@ revpipycontrol.shared.ipaclmanager.IpAclManager.loadaclfile?4(filename)
revpipycontrol.shared.ipaclmanager.IpAclManager.regex_acl?7
revpipycontrol.shared.ipaclmanager.IpAclManager.writeaclfile?4(filename=None, aclname=None)
revpipycontrol.shared.ipaclmanager.IpAclManager?1(minlevel, maxlevel, acl=None)
revpipycontrol.shared.ipaclmanager.__author__?9
revpipycontrol.shared.ipaclmanager.__copyright__?9
revpipycontrol.shared.ipaclmanager.__license__?9
revpipycontrol.shared.ipaclmanager.refullmatch?4(regex, string)

View File

@@ -1,5 +1,6 @@
AclManager ttk.Frame
RevPiCheckClient tkinter.Frame
RevPiDevelop ttk.Frame
RevPiInfo tkinter.Frame
RevPiLogfile tkinter.Frame
RevPiOption tkinter.Frame

View File

@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol -->
<!-- Saved: 2018-05-25, 08:26:59 -->
<!-- Saved: 2018-08-12, 16:56:01 -->
<!-- Copyright (C) 2018 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
<Hash>66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275</Hash>
<ProgLanguage mixed="0">Python3</ProgLanguage>
<ProjectType>Console</ProjectType>
<Description></Description>
<Version>0.6.2</Version>
<Version>0.7.0</Version>
<Author>Sven Sager</Author>
<Email>akira@narux.de</Email>
<Eol index="1"/>
<Sources>
<Source>revpipycontrol/revpipycontrol.py</Source>
<Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/mytools.py</Source>
<Source>revpipycontrol/revpicheckclient.py</Source>
<Source>setup.py</Source>
<Source>revpipycontrol/revpiplclist.py</Source>
<Source>revpipycontrol/revpidevelop.py</Source>
<Source>revpipycontrol/revpiinfo.py</Source>
<Source>revpipycontrol/revpilegacy.py</Source>
<Source>revpipycontrol/revpilogfile.py</Source>
<Source>revpipycontrol/revpioption.py</Source>
<Source>revpipycontrol/revpiplclist.py</Source>
<Source>revpipycontrol/revpiprogram.py</Source>
<Source>revpipycontrol/mytools.py</Source>
<Source>revpipycontrol/revpiinfo.py</Source>
<Source>revpipycontrol/aclmanager.py</Source>
<Source>revpipycontrol/revpilegacy.py</Source>
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
<Source>revpipycontrol/revpipycontrol.py</Source>
<Source>revpipycontrol/shared/__init__.py</Source>
<Source>revpipycontrol/shared/ipaclmanager.py</Source>
<Source>setup.py</Source>
</Sources>
<Forms/>
<Translations/>
@@ -35,8 +35,8 @@
<Others>
<Other>data</Other>
<Other>doc</Other>
<Other>stdeb.cfg</Other>
<Other>eric-revpipycontrol.api</Other>
<Other>stdeb.cfg</Other>
</Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs>
@@ -141,9 +141,6 @@
</value>
</dict>
</VcsOptions>
<VcsOtherData>
<dict/>
</VcsOtherData>
</Vcs>
<FiletypeAssociations>
<FiletypeAssociation pattern="*.idl" type="INTERFACES"/>
@@ -243,14 +240,6 @@
<value>
<bool>False</bool>
</value>
<key>
<string>sourceExtensions</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>useRecursion</string>
</key>
@@ -265,6 +254,133 @@
<Checkers>
<CheckersParams>
<dict>
<key>
<string>PYLINT</string>
</key>
<value>
<dict>
<key>
<string>configFile</string>
</key>
<value>
<string>/home/akira/Entwicklung/eric/revpipyplc/revpipycontrol/default.cnf</string>
</value>
<key>
<string>dialogReport</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>disabledMessages</string>
</key>
<value>
<string></string>
</value>
<key>
<string>enableBasic</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableClasses</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableDesign</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableExceptions</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableFormat</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableImports</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableLogging</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableMetrics</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableMiscellaneous</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableNewstyle</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableSimilarities</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableStringFormat</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableTypecheck</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enableVariables</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>enabledMessages</string>
</key>
<value>
<string></string>
</value>
<key>
<string>htmlReport</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>txtReport</string>
</key>
<value>
<bool>False</bool>
</value>
</dict>
</value>
<key>
<string>Pep8Checker</string>
</key>

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Manager für ACL Einträge."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
@@ -56,8 +55,8 @@ class AclManager(ttk.Frame):
self.aclinfo = ttk.Frame(self)
for acltext in self.__dict_acltext:
lbl = ttk.Label(self.aclinfo)
lbl["text"] = _("Level") + " {}: {}".format(
acltext, self.__dict_acltext[acltext]
lbl["text"] = _("Level") + " {id}: {text}".format(
id=acltext, text=self.__dict_acltext[acltext]
)
lbl.pack(anchor="w")
@@ -276,12 +275,12 @@ class AclManager(ttk.Frame):
ask = tkmsg.askyesno(
_("Question"),
_("Do you really want to delete the following item? \n"
"\nIP: {} / Level: {}").format(*lst_ipacl),
"\nIP: {0} / Level: {1}").format(*lst_ipacl),
parent=self.master, default="no"
)
if ask:
new_acl = self.__acl.acl.replace(
"{},{}".format(*lst_ipacl), ""
"{0},{1}".format(*lst_ipacl), ""
).replace(" ", " ")
if self.__acl.loadacl(new_acl.strip()):
@@ -354,7 +353,7 @@ class AclManager(ttk.Frame):
def _savefields(self):
u"""Übernimmt neuen ACL Eintrag."""
new_acl = "{}.{}.{}.{},{}".format(
new_acl = "{0}.{1}.{2}.{3},{4}".format(
self.var_ip1.get(),
self.var_ip2.get(),
self.var_ip3.get(),
@@ -386,8 +385,8 @@ class AclManager(ttk.Frame):
acltext = property(__get_acltext, __set_acltext)
# Debugging
if __name__ == "__main__":
root = AclManager(tkinter.Tk(), 0, 9, " 192.168.50.100,2 127.0.0.*,1")
root.acltext = {0: "Keine Rechte", 1: "Hohe Rechte"}
root.mainloop()
print(root.acl)

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
"""Tools-Sammlung."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gettext
import locale
import sys
@@ -19,8 +18,11 @@ if platform == "linux":
homedir = environ["HOME"]
else:
homedir = environ["APPDATA"]
savefile_connections = pathjoin(
homedir, ".revpipyplc", "connections.dat")
savefile_developer = pathjoin(
homedir, ".revpipyplc", "developer.dat")
savefile_programpath = pathjoin(
homedir, ".revpipyplc", "programpath.dat")

View File

@@ -1,13 +1,15 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
# scrollbar-to-a-group-of-widgets-in-tkinter
u"""Fenstererweiterung für den 'watch modus'."""
u"""Fenstererweiterung für den 'watch modus'.
Thranks to: http://stackoverflow.com/questions/3085696/adding-a-
scrollbar-to-a-group-of-widgets-in-tkinter
"""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import pickle
import tkinter
import tkinter.messagebox as tkmsg
@@ -108,8 +110,11 @@ class RevPiCheckClient(tkinter.Frame):
io[5].set(self.__oldvalue)
tkmsg.showerror(
_("Error"),
_("Given value for Output '{}' is not valid! \nReset to ""'{}'"
"").format(self.dict_devices[device], self.__oldvalue),
_("Given value for Output '{0}' is not valid! \n"
"Reset to '{1}'").format(
self.dict_devices[device],
self.__oldvalue
),
parent=self.dict_wins[device]
)
@@ -135,7 +140,7 @@ class RevPiCheckClient(tkinter.Frame):
canvas = tkinter.Canvas(
frame,
borderwidth=0,
width=180,
width=190,
heigh=calc_heigh if calc_heigh <= 600 else 600
)
s_frame = tkinter.Frame(canvas)
@@ -166,7 +171,7 @@ class RevPiCheckClient(tkinter.Frame):
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
tkinter.Label(s_frame, text=io[0]).grid(
column=0, row=rowcount, sticky="w"
column=1, row=rowcount, sticky="w"
)
if io[4] >= 0:
@@ -177,7 +182,7 @@ class RevPiCheckClient(tkinter.Frame):
check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = ""
check["variable"] = var
check.grid(column=1, row=rowcount)
check.grid(column=0, row=rowcount)
else:
var = tkinter.IntVar()
txt = tkinter.Spinbox(s_frame, to=self.maxint(io[1]))
@@ -196,7 +201,7 @@ class RevPiCheckClient(tkinter.Frame):
self.maxint(io[1]) == 0 else "normal"
txt["width"] = 5
txt["textvariable"] = var
txt.grid(column=1, row=rowcount)
txt.grid(column=0, row=rowcount)
# Steuerelementvariable in IO übernehmen (mutabel)
io.append(var)
@@ -213,7 +218,7 @@ class RevPiCheckClient(tkinter.Frame):
for dev in self.lst_devices:
win = tkinter.Toplevel(self)
win.wm_title("{} | {}".format(dev, self.dict_devices[dev]))
win.wm_title("{0} | {1}".format(dev, self.dict_devices[dev]))
win.protocol(
"WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win)
@@ -235,7 +240,7 @@ class RevPiCheckClient(tkinter.Frame):
# Button erstellen
btn = tkinter.Button(devgrp)
btn["command"] = lambda win=win: self.__showwin(win)
btn["text"] = "{} | {}".format(dev, self.dict_devices[dev])
btn["text"] = "{0} | {1}".format(dev, self.dict_devices[dev])
btn.pack(**cfxpxy53)
# Steuerungsfunktionen
@@ -311,7 +316,7 @@ class RevPiCheckClient(tkinter.Frame):
try:
ba_values = bytearray(self.cli.ps_values().data)
self.err_workvalues = 0
except:
except Exception:
if self.autorw.get():
self.err_workvalues += 1
else:
@@ -329,7 +334,7 @@ class RevPiCheckClient(tkinter.Frame):
tkmsg.showerror(
_("Error"),
_("To many errors while reading IO data. "
"Can not show the Watch-Mode."),
"Can not show the Watch-Mode."),
parent=self.master
)
@@ -402,7 +407,7 @@ class RevPiCheckClient(tkinter.Frame):
if not self.autorw.get():
try:
self.chk_auto["state"] = "normal"
except:
except Exception:
pass
return None
@@ -448,7 +453,7 @@ class RevPiCheckClient(tkinter.Frame):
# Fehlermeldungen erstellen
devicename = self.dict_devices[lst_result[0]]
str_errmsg += _(
"Error set value of device '{}' Output '{}': {} \n"
"Error set value of device '{0}' Output '{1}': {2} \n"
).format(devicename, lst_result[1], lst_result[3])
if str_errmsg != "":

View File

@@ -0,0 +1,310 @@
# -*- coding: utf-8 -*-
u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip
import os
import pickle
import tkinter
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
from mytools import homedir
from mytools import gettrans
from mytools import savefile_developer as savefile
from tkinter import ttk
from xmlrpc.client import Binary
# Übersetzung laden
_ = gettrans()
def _loaddefaults(revpiname=None):
u"""Übernimmt für den Pi die letzen Pfade.
@param revpiname Einstellungen nur für RevPi laden
@return <class 'dict'> 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 <class 'dict'> mit Einstellungen
@return True, bei erfolgreicher Verarbeitung
"""
try:
os.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 Exception:
return False
return True
class RevPiDevelop(ttk.Frame):
u"""Zeigt Debugfenster an."""
def __init__(self, master, xmlcli, xmlmode, revpi):
u"""Init RevPiDevelop-Class.
@return None"""
if xmlmode < 3:
return None
super().__init__(master)
self.pack(expand=True, fill="both")
self.revpi = revpi
self.xmlcli = xmlcli
# Letzte Einstellungen übernehmen
self.opt = _loaddefaults(revpi)
# Einstellungen
self.pathselected = self.opt.get("pathselected", False)
self.watchpath = self.opt.get("watchpath", homedir)
self.watchfiles = self.opt.get("watchfiles", [])
# Fenster bauen
self._createwidgets()
# Alte Einstellungen anwenden
if self.pathselected:
self.load_pathfiles(silent=True)
self.refresh_stats()
def _checkclose(self, event=None):
u"""Prüft ob Fenster beendet werden soll.
@param event tkinter-Event"""
# Einstellungen speichern
self.opt["pathselected"] = self.pathselected
self.opt["watchpath"] = self.watchpath
self.opt["watchfiles"] = self.watchfiles
_savedefaults(self.revpi, self.opt)
def _createwidgets(self):
u"""Erstellt alle Widgets."""
self.rowconfigure(0, weight=1)
self.columnconfigure(0, weight=1)
# cpad = {"padx": 4, "pady": 2}
# cpade = {"padx": 4, "pady": 2, "sticky": "e"}
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
# Gruppe Develop
devel = ttk.LabelFrame(self)
devel.columnconfigure(0, weight=1)
devel["text"] = _("File watcher for PLC development")
devel.grid(**cpadwe)
r = 0
lbl = ttk.Label(devel)
lbl["text"] = _("Path to list files:")
lbl.grid(row=r, **cpadw)
btn = ttk.Button(devel)
btn["command"] = self.btn_selectpath
btn["text"] = _("Select path")
btn.grid(row=r, column=1, **cpadw)
r += 1
self.lbl_path = ttk.Label(devel)
self.lbl_path["width"] = 50
self.lbl_path.grid(row=r, column=0, columnspan=2, **cpadw)
# Listbox
r += 1
trv = ttk.Frame(devel)
trv.columnconfigure(0, weight=1)
trv.grid(row=r, columnspan=2, sticky="we")
scb_files = ttk.Scrollbar(trv)
self.trv_files = ttk.Treeview(trv)
self.trv_files.bind("<<TreeviewSelect>>", self.select_pathfiles)
self.trv_files["height"] = 15
self.trv_files["yscrollcommand"] = scb_files.set
self.trv_files.grid(row=0, column=0, sticky="we")
scb_files["command"] = self.trv_files.yview
scb_files.grid(row=0, column=1, sticky="ns")
# Uploadbutton
r += 1
btnlist = ttk.Frame(devel)
btnlist.columnconfigure(1, weight=1)
btnlist.grid(row=r, columnspan=2, sticky="we")
self.btn_jobs = ttk.Button(btnlist)
self.btn_jobs["command"] = self.btn_domyjob
self.btn_jobs["text"] = _("Stop / Upload / Start")
self.btn_jobs.grid(row=0, column=1, **cpadwe)
def btn_domyjob(self):
u"""Hochladen und neu starten."""
# PLC Programm anhalten
self.xmlcli.plcstop()
# Aktuell konfiguriertes Programm lesen (für uploaded Flag)
opt_program = self.xmlcli.get_config()
opt_program = opt_program.get("plcprogram", "none.py")
uploaded = True
ec = 0
for fname in self.watchfiles:
# FIXME: Fehlerabfang bei Dateilesen
with open(fname, "rb") as fh:
# Ordnernamen vom System entfernen
sendname = fname.replace(self.watchpath, "")[1:]
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program:
uploaded = False
# Datei übertragen
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname
)
except Exception:
ec = -2
break
if not ustatus:
ec = -1
break
if ec == 0:
# Wenn eines der Dateien nicht das Hauptprogram ist, info
if uploaded:
tkmsg.showinfo(
_("Information"),
_("A PLC program has been uploaded. Please check the "
"PLC options to see if the correct program is "
"specified as the start program."),
parent=self.master
)
elif ec == -1:
tkmsg.showerror(
_("Error"),
_("The Revolution Pi could not process some parts of the "
"transmission."),
parent=self.master
)
elif ec == -2:
tkmsg.showerror(
_("Error"),
_("Errors occurred during transmission"),
parent=self.master
)
# PLC Programm starten
self.xmlcli.plcstart()
def btn_selectpath(self):
u"""Lässt dem Benuzter ein Verzeichnis auswählen."""
dirselect = tkfd.askdirectory(
parent=self.master,
title=_("Directory to watch"),
mustexist=False,
initialdir=self.watchpath
)
if not dirselect:
return
# Neuen Pfad übernehmen
if os.path.exists(dirselect):
self.pathselected = True
self.watchpath = dirselect
self.load_pathfiles()
else:
tkmsg.showerror(
_("Error"),
_("Can not open the selected folder."),
parent=self.master
)
self.refresh_stats()
def load_pathfiles(self, silent=False):
u"""Aktualisiert die Dateiliste.
@param silent Keinen Dialog anzeigen"""
# Liste leeren
self.trv_files.delete(*self.trv_files.get_children())
# Dateiliste erstellen
filecount = 0
for tup_walk in os.walk(self.watchpath):
for filename in sorted(tup_walk[2]):
fullname = os.path.join(tup_walk[0], filename)
self.trv_files.insert(
"", "end", fullname,
text=fullname.replace(self.watchpath, "")[1:],
values=fullname
)
# Dateiobergrenze
filecount += 1
if filecount >= 1000:
break
if filecount >= 1000:
if not silent:
tkmsg.showwarning(
_("Warning"),
_("Found more than 1000 files! Only 1000 files can be "
"shown in this dialog, all other will be ignored."
""),
parent=self.master
)
break
# Alle Elemente für Selection prüfen und anwenden
for watchfile in self.watchfiles.copy():
try:
self.trv_files.item(watchfile)
except Exception:
self.watchfiles.remove(watchfile)
self.trv_files.selection_set(self.watchfiles)
def select_pathfiles(self, tkevt):
u"""Setzt state der Buttons."""
self.watchfiles = list(self.trv_files.selection())
self.refresh_stats()
def refresh_stats(self):
u"""Passt die Widgets an."""
self.btn_jobs["state"] = "normal" if len(self.watchfiles) > 0 \
else "disabled"
self.lbl_path["text"] = self.watchpath
# Debugging
if __name__ == "__main__":
from xmlrpc.client import ServerProxy
cli = ServerProxy("http://localhost:55123")
root = tkinter.Tk()
app = RevPiDevelop(root, cli, 3, "debugging")
app.mainloop()

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Programminformationen anzeigen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.font as tkf
import webbrowser
@@ -55,7 +54,7 @@ class RevPiInfo(tkinter.Frame):
lbl.pack(pady=5)
lbl = tkinter.Label(self)
lbl["font"] = fntmid
lbl["text"] = _("Version: {}").format(self.version)
lbl["text"] = _("Version: {0}").format(self.version)
lbl.bind(
"<ButtonPress-2>",
lambda event: self._createwidgets(extended=not extended)

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Alte Klassen laden hier, bevor sie entsorgt werden."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
@@ -23,7 +22,7 @@ class RevPiOption(tkinter.Frame):
@return None"""
try:
self.dc = xmlcli.get_config()
except:
except Exception:
self.dc = None
return None
@@ -46,17 +45,17 @@ class RevPiOption(tkinter.Frame):
u"""Prüft ob sich die Einstellungen geändert haben.
@return True, wenn min. eine Einstellung geändert wurde"""
return (
self.var_start.get() != self.dc.get("autostart", "1")
or self.var_reload.get() != self.dc.get("autoreload", "1")
or self.var_zexit.get() != self.dc.get("zeroonexit", "0")
or self.var_zerr.get() != self.dc.get("zeroonerror", "0")
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
or self.var_startargs.get() != self.dc.get("plcarguments", "")
or self.var_pythonver.get() != self.dc.get("pythonversion", "3")
or self.var_slave.get() != self.dc.get("plcslave", "0")
or self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1)
or self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2)
or self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
self.var_start.get() != self.dc.get("autostart", "1") or
self.var_reload.get() != self.dc.get("autoreload", "1") or
self.var_zexit.get() != self.dc.get("zeroonexit", "0") or
self.var_zerr.get() != self.dc.get("zeroonerror", "0") or
self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
self.var_startargs.get() != self.dc.get("plcarguments", "") or
self.var_pythonver.get() != self.dc.get("pythonversion", "3") or
self.var_slave.get() != self.dc.get("plcslave", "0") or
self.var_xmlon.get() != (self.dc.get("xmlrpc", 0) >= 1) or
self.var_xmlmod2.get() != (self.dc.get("xmlrpc", 0) >= 2) or
self.var_xmlmod3.get() != (self.dc.get("xmlrpc", 0) >= 3)
# or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
)

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Zeigt die Logfiles an."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
from mytools import gettrans
@@ -106,7 +105,7 @@ class RevPiLogfile(tkinter.Frame):
self.applog, self.xmlcli.load_applog, self.mrkapp, full
)
self.errapp = 0
except:
except Exception:
self.errapp += 1
# Timer neu starten
@@ -122,7 +121,7 @@ class RevPiLogfile(tkinter.Frame):
self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
)
self.errplc = 0
except:
except Exception:
self.errplc += 1
# Timer neu starten

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Optionsfenster."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import tkinter
import tkinter.messagebox as tkmsg
from aclmanager import AclManager
@@ -24,7 +23,7 @@ class RevPiOption(tkinter.Frame):
@return None"""
try:
self.dc = xmlcli.get_config()
except:
except Exception:
self.dc = None
return None
@@ -48,20 +47,20 @@ class RevPiOption(tkinter.Frame):
u"""Prüft ob sich die Einstellungen geändert haben.
@return True, wenn min. eine Einstellung geändert wurde"""
return (
self.var_start.get() != self.dc.get("autostart", 1)
or self.var_reload.get() != self.dc.get("autoreload", 1)
or self.var_reload_delay.get() !=
str(self.dc.get("autoreloaddelay", 5))
or self.var_zexit.get() != self.dc.get("zeroonexit", 0)
or self.var_zerr.get() != self.dc.get("zeroonerror", 0)
self.var_start.get() != self.dc.get("autostart", 1) or
self.var_reload.get() != self.dc.get("autoreload", 1) or
self.var_reload_delay.get() !=
str(self.dc.get("autoreloaddelay", 5)) or
self.var_zexit.get() != self.dc.get("zeroonexit", 0) or
self.var_zerr.get() != self.dc.get("zeroonerror", 0) or
# TODO: rtlevel (0)
or self.var_startpy.get() != self.dc.get("plcprogram", "none.py")
or self.var_startargs.get() != self.dc.get("plcarguments", "")
or self.var_pythonver.get() != self.dc.get("pythonversion", 3)
or self.var_slave.get() != self.dc.get("plcslave", 0)
or self.var_slaveacl.get() != self.dc.get("plcslaveacl", "")
or self.var_xmlon.get() != self.dc.get("xmlrpc", 0)
or self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
self.var_startpy.get() != self.dc.get("plcprogram", "none.py") or
self.var_startargs.get() != self.dc.get("plcarguments", "") or
self.var_pythonver.get() != self.dc.get("pythonversion", 3) or
self.var_slave.get() != self.dc.get("plcslave", 0) or
self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or
self.var_xmlon.get() != self.dc.get("xmlrpc", 0) or
self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "")
)
def _checkclose(self, event=None):

View File

@@ -1,17 +1,18 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Fenster um RevPi-Verbindungen einzurichten."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import os.path
import pickle
import tkinter
import tkinter.messagebox as tkmsg
from mytools import gettrans
from mytools import savefile_connections as savefile
from revpidevelop import _loaddefaults as developloaddefaults
from revpidevelop import _savedefaults as developsavedefaults
from revpiprogram import _loaddefaults as programloaddefaults
from revpiprogram import _savedefaults as programsavedefaults
from os import makedirs
@@ -150,15 +151,20 @@ class RevPiPlcList(tkinter.Frame):
with open(savefile, "wb") as fh:
pickle.dump(self._connections, fh)
self.changes = False
except:
except Exception:
return False
# Andere Einstellungen aufräumen
dict = programloaddefaults()
for revpi in tuple(dict.keys()):
dict_o = developloaddefaults()
for revpi in tuple(dict_o.keys()):
if revpi not in self._connections:
del dict[revpi]
programsavedefaults(None, dict)
del dict_o[revpi]
developsavedefaults(None, dict_o)
dict_o = programloaddefaults()
for revpi in tuple(dict_o.keys()):
if revpi not in self._connections:
del dict_o[revpi]
programsavedefaults(None, dict_o)
return True
@@ -195,7 +201,7 @@ class RevPiPlcList(tkinter.Frame):
item = self.list_conn.get(item_index[0])
ask = tkmsg.askyesno(
_("Question"),
_("Do you really want to delete the selected connection '{}'?"
_("Do you really want to delete the selected connection '{0}'?"
"").format(item),
parent=self.master
)
@@ -243,9 +249,9 @@ class RevPiPlcList(tkinter.Frame):
def evt_keypress(self, evt=None):
u"""Passt bei Tastendruck den Status der Buttons an."""
okvalue = "normal" if (
self.var_address.get() != ""
and self.var_name.get() != ""
and self.var_port.get() != ""
self.var_address.get() != "" and
self.var_name.get() != "" and
self.var_port.get() != ""
) else "disabled"
self.btn_add["state"] = okvalue

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""PLC Programm und Konfig hoch und runterladen."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
import gzip
import os
import pickle
@@ -15,8 +14,8 @@ import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
import zipfile
from mytools import gettrans
from mytools import homedir
from mytools import savefile_programpath as savefile
from os import makedirs
from shutil import rmtree
from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary
@@ -48,7 +47,7 @@ def _savedefaults(revpiname, settings):
"""
try:
makedirs(os.path.dirname(savefile), exist_ok=True)
os.makedirs(os.path.dirname(savefile), exist_ok=True)
if revpiname is None:
dict_all = settings
else:
@@ -56,7 +55,7 @@ def _savedefaults(revpiname, settings):
dict_all[revpiname] = settings
with open(savefile, "wb") as fh:
pickle.dump(dict_all, fh)
except:
except Exception:
return False
return True
@@ -325,7 +324,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None:
try:
fh.write(self.xmlcli.get_pictoryrsc().data)
except:
except Exception:
tkmsg.showerror(
_("Error"),
_("Could not load and save file!"),
@@ -356,7 +355,7 @@ class RevPiProgram(tkinter.Frame):
if fh is not None:
try:
fh.write(self.xmlcli.get_procimg().data)
except:
except Exception:
tkmsg.showerror(
_("Error"),
_("Could not load and save file!"),
@@ -561,7 +560,7 @@ class RevPiProgram(tkinter.Frame):
self.opt["typedown"] = self.var_typedown.get()
self.opt["picdown"] = self.var_picdown.get()
except:
except Exception:
raise
tkmsg.showerror(
_("Error"),
@@ -588,6 +587,7 @@ class RevPiProgram(tkinter.Frame):
dirtmp = None
filelist = []
fileselect = None
foldername = ""
rscfile = None
if tup == 0:
@@ -595,7 +595,7 @@ class RevPiProgram(tkinter.Frame):
fileselect = tkfd.askopenfilenames(
parent=self.master,
title="Upload Python program...",
initialdir=self.opt.get("plcupload_dir", ""),
initialdir=self.opt.get("plcupload_dir", homedir),
filetypes=(("Python", "*.py"), (_("All files"), "*.*"))
)
if type(fileselect) == tuple and len(fileselect) > 0:
@@ -608,8 +608,12 @@ class RevPiProgram(tkinter.Frame):
parent=self.master,
title=_("Folder to upload"),
mustexist=True,
initialdir=self.opt.get("plcupload_dir", self.revpi)
initialdir=self.opt.get("plcupload_dir", homedir)
)
# Ordnernamen merken um diesen auf RevPi anzulegen
foldername = os.path.basename(dirselect)
if type(dirselect) == str and dirselect != "":
filelist = self.create_filelist(dirselect)
@@ -706,7 +710,11 @@ class RevPiProgram(tkinter.Frame):
if dirselect == "":
sendname = os.path.basename(fname)
else:
sendname = fname.replace(dirselect, "")[1:]
# Ordnernamen in Dateipfad für RevPi übernehmen
sendname = os.path.join(
foldername,
fname.replace(dirselect, "")[1:]
)
# Prüfen ob Dateiname bereits als Startprogramm angegeben ist
if sendname == opt_program:
@@ -716,7 +724,7 @@ class RevPiProgram(tkinter.Frame):
try:
ustatus = self.xmlcli.plcupload(
Binary(gzip.compress(fh.read())), sendname)
except:
except Exception:
ec = -2
break

View File

@@ -1,14 +1,14 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# RevPiPyControl
# Version: see global var pycontrolverion
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
u"""Hauptprogramm."""
u"""RevPiPyControl main program."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
__version__ = "0.7.0"
import revpicheckclient
import revpidevelop
import revpiinfo
import revpilogfile
import revpioption
@@ -25,8 +25,6 @@ from xmlrpc.client import ServerProxy
# Übersetzung laden
_ = gettrans()
pycontrolversion = "0.6.2"
class RevPiPyControl(tkinter.Frame):
@@ -47,8 +45,9 @@ class RevPiPyControl(tkinter.Frame):
self.xmlfuncs = []
self.xmlmode = 0
# Debugger vorbereiten
# Frames vorbereiten
self.debugframe = None
self.developframe = None
# Globale Fenster
self.tkcheckclient = None
@@ -75,6 +74,10 @@ class RevPiPyControl(tkinter.Frame):
u"""Schließt alle Fenster."""
if self.tkcheckclient is not None:
self.tkcheckclient.destroy()
if self.developframe is not None:
self.developframe._checkclose()
self.developframe.destroy()
self.developframe = None
if self.tklogs is not None:
self.tklogs.master.destroy()
if self.tkoptions is not None:
@@ -86,7 +89,7 @@ class RevPiPyControl(tkinter.Frame):
self.debugframe = None
try:
self.cli.psstop()
except:
except Exception:
pass
def _closeapp(self, event=None):
@@ -125,38 +128,43 @@ class RevPiPyControl(tkinter.Frame):
menu1.add_command(label=_("Info..."), command=self.infowindow)
self.mbar.add_cascade(label=_("Help"), menu=menu1)
self.var_conn = tkinter.StringVar(self)
self.txt_connect = tkinter.Entry(self, state="readonly", width=40)
self.main_frame = tkinter.Frame(self)
self.main_frame.pack(side="left", fill="y")
self.var_conn = tkinter.StringVar(self.main_frame)
self.txt_connect = tkinter.Entry(
self.main_frame, state="readonly", width=40
)
self.txt_connect["textvariable"] = self.var_conn
self.txt_connect.pack(fill="x")
self.btn_plcstart = tkinter.Button(self)
self.btn_plcstart = tkinter.Button(self.main_frame)
self.btn_plcstart["text"] = _("PLC start")
self.btn_plcstart["command"] = self.plcstart
self.btn_plcstart.pack(fill="x")
self.btn_plcstop = tkinter.Button(self)
self.btn_plcstop = tkinter.Button(self.main_frame)
self.btn_plcstop["text"] = _("PLC stop")
self.btn_plcstop["command"] = self.plcstop
self.btn_plcstop.pack(fill="x")
self.btn_plcrestart = tkinter.Button(self)
self.btn_plcrestart = tkinter.Button(self.main_frame)
self.btn_plcrestart["text"] = _("PLC restart")
self.btn_plcrestart["command"] = self.plcrestart
self.btn_plcrestart.pack(fill="x")
self.btn_plclogs = tkinter.Button(self)
self.btn_plclogs = tkinter.Button(self.main_frame)
self.btn_plclogs["text"] = _("PLC logs")
self.btn_plclogs["command"] = self.plclogs
self.btn_plclogs.pack(fill="x")
self.var_status = tkinter.StringVar(self)
self.txt_status = tkinter.Entry(self)
self.var_status = tkinter.StringVar(self.main_frame)
self.txt_status = tkinter.Entry(self.main_frame)
self.txt_status["state"] = "readonly"
self.txt_status["textvariable"] = self.var_status
self.txt_status.pack(fill="x")
self.btn_debug = tkinter.Button(self)
self.btn_debug = tkinter.Button(self.main_frame)
self.btn_debug["text"] = _("PLC watch mode")
self.btn_debug["command"] = self.plcdebug
self.btn_debug.pack(fill="x")
@@ -179,6 +187,8 @@ class RevPiPyControl(tkinter.Frame):
label=_("PLC options..."), command=self.plcoptions)
self.mplc.add_command(
label=_("PLC program..."), command=self.plcprogram)
self.mplc.add_command(
label=_("PLC developer..."), command=self.plcdevelop)
self.mplc.add_separator()
self.mplc.add_command(
@@ -194,12 +204,12 @@ class RevPiPyControl(tkinter.Frame):
@param text Verbindungsname
@param reconnect Socket Timeout nicht heruntersetzen"""
if reconnect:
socket.setdefaulttimeout(10)
socket.setdefaulttimeout(6)
else:
socket.setdefaulttimeout(2)
sp = ServerProxy(
"http://{}:{}".format(
"http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1])
)
)
@@ -208,18 +218,18 @@ class RevPiPyControl(tkinter.Frame):
self.xmlfuncs = sp.system.listMethods()
self.xmlmode = sp.xmlmodus()
self.revpipyversion = list(map(int, sp.version().split(".")))
except:
except Exception:
self.servererror()
else:
self._closeall()
socket.setdefaulttimeout(10)
socket.setdefaulttimeout(6)
self.cli = ServerProxy(
"http://{}:{}".format(
"http://{0}:{1}".format(
self.dict_conn[text][0], int(self.dict_conn[text][1])
)
)
self.revpiname = text
self.var_conn.set("{} - {}:{}".format(
self.var_conn.set("{0} - {1}:{2}".format(
text, self.dict_conn[text][0], int(self.dict_conn[text][1])
))
self.mbar.entryconfig("PLC", state="normal")
@@ -229,7 +239,7 @@ class RevPiPyControl(tkinter.Frame):
win = tkinter.Toplevel(self)
win.focus_set()
win.grab_set()
revpiinfo.RevPiInfo(win, self.cli, pycontrolversion)
revpiinfo.RevPiInfo(win, self.cli, __version__)
self.wait_window(win)
self.dict_conn = revpiplclist.get_connections()
self._fillconnbar()
@@ -242,48 +252,72 @@ class RevPiPyControl(tkinter.Frame):
if "psstart" not in self.xmlfuncs:
tkmsg.showwarning(
_("Warning"),
_("The watch mode ist not supported in version {} "
_("The watch mode ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version "
"0.5.3! Maybe the python3-revpimodio2 module is not "
"installed on your RevPi at least version 2.0.0."
"").format(self.cli.version()),
parent=self.master
)
else:
# Debugfenster laden
if self.debugframe is None:
try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self, self.cli, self.xmlmode
)
except:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None
return
# Fehler prüfen
if self.debugframe.err_workvalues >= self.debugframe.max_errors:
self.debugframe = None
# FIXME: Bei neuer piCtory Konfig schneller vernichten
if self.debugframe is None:
try:
self.debugframe = revpicheckclient.RevPiCheckClient(
self.main_frame, self.cli, self.xmlmode
)
except Exception:
tkmsg.showwarning(
_("Error"),
_("Can not load piCtory configuration. \n"
"Did you create a hardware configuration? "
"Please check this in piCtory!"),
parent=self.master
)
self.btn_debug["state"] = "normal"
return None
# Show/Hide wechseln
if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows()
if self.debugframe.autorw.get():
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
self.debugframe.pack(fill="x")
# Fehler prüfen
if self.debugframe.err_workvalues >= self.debugframe.max_errors:
self.debugframe = None
return None
self.btn_debug["state"] = "normal"
# Show/Hide wechseln
if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows()
if self.debugframe.autorw.get():
self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False)
self.debugframe.pack_forget()
else:
self.debugframe.pack(fill="x")
self.btn_debug["state"] = "normal"
def plcdevelop(self):
u"""Startet das Developfenster."""
if self.xmlmode < 3:
tkmsg.showwarning(
_("Warning"),
_("XML-RPC access mode in the RevPiPyLoad "
"configuration is too small to access this dialog!"),
parent=self.master
)
return
# Developframe laden
if self.developframe is None:
self.developframe = revpidevelop.RevPiDevelop(
self, self.cli, self.xmlmode, self.revpiname
)
if self.developframe.winfo_viewable():
self.developframe._checkclose()
self.developframe.pack_forget()
else:
self.developframe.pack(side="right") # fill="x")
def plclist(self):
u"""Öffnet das Fenster für die Verbindungen."""
@@ -301,7 +335,7 @@ class RevPiPyControl(tkinter.Frame):
if "load_plclog" not in self.xmlfuncs:
tkmsg.showwarning(
_("Warning"),
_("This version of Logviewer ist not supported in version {} "
_("This version of Logviewer ist not supported in version {0} "
"of RevPiPyLoad on your RevPi! You need at least version "
"0.4.1.").format(self.cli.version()),
parent=self.master
@@ -407,7 +441,7 @@ class RevPiPyControl(tkinter.Frame):
else:
try:
plcec = self.cli.plcexitcode()
except:
except Exception:
self.errcount += 1
if self.errcount >= 5:
self.var_status.set("SERVER ERROR")

View File

@@ -1 +1,6 @@
# -*- coding: utf-8 -*-
"""Shared modules."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"

View File

@@ -1,11 +1,10 @@
# -*- coding: utf-8 -*-
#
# IpAclManager
#
# (c) Sven Sager, License: LGPLv3
# Version 0.1.0
#
"""Verwaltet IP Adressen und deren ACLs."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "GPLv3"
from os import access, R_OK, W_OK
from re import match as rematch
@@ -66,7 +65,7 @@ class IpAclManager():
return ACLs als <class 'str'>"""
str_acl = ""
for aclip in sorted(self.__dict_acl):
str_acl += "{},{} ".format(aclip, self.__dict_acl[aclip])
str_acl += "{0},{1} ".format(aclip, self.__dict_acl[aclip])
return str_acl.strip()
def __get_filename(self):
@@ -173,14 +172,14 @@ class IpAclManager():
if not access(filename, W_OK):
return False
header = "# {}Access Control List (acl)\n" \
header = "# {0}Access Control List (acl)\n" \
"# One entry per Line IPADRESS,LEVEL\n" \
"#\n".format("" if aclname is None else aclname + " ")
with open(filename, "w") as fh:
fh.write(header)
for aclip in sorted(self.__dict_acl):
fh.write("{},{}\n".format(aclip, self.__dict_acl[aclip]))
fh.write("{0},{1}\n".format(aclip, self.__dict_acl[aclip]))
return True

View File

@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
#
# (c) Sven Sager, License: LGPLv3
#
"""Setupscript fuer RevPiPyLoad."""
__author__ = "Sven Sager"
__copyright__ = "Copyright (C) 2018 Sven Sager"
__license__ = "LGPLv3"
import distutils.command.install_egg_info
from sys import platform
from glob import glob
@@ -22,7 +23,7 @@ globsetup = {
"author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3",
"version": "0.6.2",
"version": "0.7.0",
"name": "revpipycontrol",