diff --git a/doc/aclmanager.html b/doc/aclmanager.html
index b765e24..8e2f07d 100644
--- a/doc/aclmanager.html
+++ b/doc/aclmanager.html
@@ -10,7 +10,7 @@ aclmanager
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/index-revpipycontrol.shared.html b/doc/index-revpipycontrol.shared.html
index 00f7dd6..1da8280 100644
--- a/doc/index-revpipycontrol.shared.html
+++ b/doc/index-revpipycontrol.shared.html
@@ -6,7 +6,9 @@
revpipycontrol.shared
-
+
+Shared modules.
+
diff --git a/doc/index.html b/doc/index.html
index 1a15819..82b0367 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -13,7 +13,7 @@ Packages
@@ -30,6 +30,9 @@ Modules
revpicheckclient
+revpidevelop
+
+
revpiinfo
diff --git a/doc/mytools.html b/doc/mytools.html
index db6bf59..1dd78e8 100644
--- a/doc/mytools.html
+++ b/doc/mytools.html
@@ -12,7 +12,7 @@ Tools-Sammlung.
Global Attributes
-savefile_connections savefile_programpath
+__author__ __copyright__ __license__ savefile_connections savefile_developer savefile_programpath
Classes
diff --git a/doc/revpicheckclient.html b/doc/revpicheckclient.html
index 8fd8d2e..d9f1cc7 100644
--- a/doc/revpicheckclient.html
+++ b/doc/revpicheckclient.html
@@ -10,7 +10,7 @@ revpicheckclient
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpidevelop.html b/doc/revpidevelop.html
new file mode 100644
index 0000000..b4b4a25
--- /dev/null
+++ b/doc/revpidevelop.html
@@ -0,0 +1,192 @@
+
+
+revpidevelop
+
+
+
+
+revpidevelop
+
+
+Global Attributes
+
+_ __author__ __copyright__ __license__
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiDevelop
+
+Zeigt Debugfenster an.
+
+
+Derived from
+ttk.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiDevelop (Constructor)
+RevPiDevelop (master, xmlcli, xmlmode, revpi )
+
+Init RevPiDevelop-Class.
+
+Returns:
+
+None
+
+
+
+RevPiDevelop._checkclose
+_checkclose (event=None )
+
+Prüft ob Fenster beendet werden soll.
+
+event
+
+tkinter-Event
+
+
+
+RevPiDevelop._createwidgets
+_createwidgets ( )
+
+Erstellt alle Widgets.
+
+
+RevPiDevelop.btn_domyjob
+btn_domyjob ( )
+
+Hochladen und neu starten.
+
+
+RevPiDevelop.btn_selectpath
+btn_selectpath ( )
+
+Lässt dem Benuzter ein Verzeichnis auswählen.
+
+
+RevPiDevelop.load_pathfiles
+load_pathfiles (silent=False )
+
+Aktualisiert die Dateiliste.
+
+silent
+
+Keinen Dialog anzeigen
+
+
+
+RevPiDevelop.refresh_stats
+refresh_stats ( )
+
+Passt die Widgets an.
+
+
+RevPiDevelop.select_pathfiles
+select_pathfiles (tkevt )
+
+Setzt state der Buttons.
+
+
+
+
+_loaddefaults
+_loaddefaults (revpiname=None )
+
+Übernimmt für den Pi die letzen Pfade.
+
+revpiname
+
+Einstellungen nur für RevPi laden
+
+
+Returns:
+
+ mit Einstellungen
+
+
+
+
+
+_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
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpiinfo.html b/doc/revpiinfo.html
index 228cfc2..8b0f06c 100644
--- a/doc/revpiinfo.html
+++ b/doc/revpiinfo.html
@@ -10,7 +10,7 @@ revpiinfo
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpilegacy.html b/doc/revpilegacy.html
index 5cd1125..8a03749 100644
--- a/doc/revpilegacy.html
+++ b/doc/revpilegacy.html
@@ -10,7 +10,7 @@ revpilegacy
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpilogfile.html b/doc/revpilogfile.html
index 1bf3eac..720dc3a 100644
--- a/doc/revpilogfile.html
+++ b/doc/revpilogfile.html
@@ -10,7 +10,7 @@ revpilogfile
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpioption.html b/doc/revpioption.html
index f6bfe29..e87b5ae 100644
--- a/doc/revpioption.html
+++ b/doc/revpioption.html
@@ -10,7 +10,7 @@ revpioption
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpiplclist.html b/doc/revpiplclist.html
index 1669a44..6efe31d 100644
--- a/doc/revpiplclist.html
+++ b/doc/revpiplclist.html
@@ -10,7 +10,7 @@ revpiplclist
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpiprogram.html b/doc/revpiprogram.html
index 4a8dc38..b00d344 100644
--- a/doc/revpiprogram.html
+++ b/doc/revpiprogram.html
@@ -10,7 +10,7 @@ revpiprogram
Global Attributes
-_
+_ __author__ __copyright__ __license__
Classes
diff --git a/doc/revpipycontrol.html b/doc/revpipycontrol.html
index 77aa118..81ad05d 100644
--- a/doc/revpipycontrol.html
+++ b/doc/revpipycontrol.html
@@ -10,7 +10,7 @@ revpipycontrol
Global Attributes
-_ pycontrolversion
+_ __author__ __copyright__ __license__ __version__
Classes
@@ -78,6 +78,9 @@ Methods
plcdebug
Baut den Debugframe und packt ihn.
+plcdevelop
+Startet das Developfenster.
+
plclist
Öffnet das Fenster für die Verbindungen.
@@ -200,7 +203,13 @@ Baut den Debugframe und packt ihn.
None
-
+
+
+RevPiPyControl.plcdevelop
+plcdevelop ( )
+
+Startet das Developfenster.
+
RevPiPyControl.plclist
plclist ( )
diff --git a/doc/revpipycontrol.shared.ipaclmanager.html b/doc/revpipycontrol.shared.ipaclmanager.html
index 2c5cb69..74e8808 100644
--- a/doc/revpipycontrol.shared.ipaclmanager.html
+++ b/doc/revpipycontrol.shared.ipaclmanager.html
@@ -12,7 +12,7 @@ Verwaltet IP Adressen und deren ACLs.
Global Attributes
-None
+__author__ __copyright__ __license__
Classes
diff --git a/eric-revpipycontrol.api b/eric-revpipycontrol.api
index 35d2dd1..d8723c2 100644
--- a/eric-revpipycontrol.api
+++ b/eric-revpipycontrol.api
@@ -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)
diff --git a/eric-revpipycontrol.bas b/eric-revpipycontrol.bas
index 7e6201d..b0573bb 100644
--- a/eric-revpipycontrol.bas
+++ b/eric-revpipycontrol.bas
@@ -1,5 +1,6 @@
AclManager ttk.Frame
RevPiCheckClient tkinter.Frame
+RevPiDevelop ttk.Frame
RevPiInfo tkinter.Frame
RevPiLogfile tkinter.Frame
RevPiOption tkinter.Frame
diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p
index f7fd027..c547970 100644
--- a/revpipycontrol.e4p
+++ b/revpipycontrol.e4p
@@ -1,32 +1,32 @@
-
+
en_US
66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275
Python3
Console
-
- 0.6.2
+ 0.7.0
Sven Sager
akira@narux.de
- revpipycontrol/revpipycontrol.py
+ revpipycontrol/aclmanager.py
+ revpipycontrol/mytools.py
revpipycontrol/revpicheckclient.py
- setup.py
- revpipycontrol/revpiplclist.py
+ revpipycontrol/revpidevelop.py
+ revpipycontrol/revpiinfo.py
+ revpipycontrol/revpilegacy.py
revpipycontrol/revpilogfile.py
revpipycontrol/revpioption.py
+ revpipycontrol/revpiplclist.py
revpipycontrol/revpiprogram.py
- revpipycontrol/mytools.py
- revpipycontrol/revpiinfo.py
- revpipycontrol/aclmanager.py
- revpipycontrol/revpilegacy.py
- revpipycontrol/shared/ipaclmanager.py
+ revpipycontrol/revpipycontrol.py
revpipycontrol/shared/__init__.py
+ revpipycontrol/shared/ipaclmanager.py
+ setup.py
@@ -35,8 +35,8 @@
data
doc
- stdeb.cfg
eric-revpipycontrol.api
+ stdeb.cfg
revpipycontrol/revpipycontrol.py
@@ -141,9 +141,6 @@
-
-
-
@@ -243,14 +240,6 @@
False
-
- sourceExtensions
-
-
-
-
-
-
useRecursion
@@ -265,6 +254,133 @@
+
+ PYLINT
+
+
+
+
+ configFile
+
+
+ /home/akira/Entwicklung/eric/revpipyplc/revpipycontrol/default.cnf
+
+
+ dialogReport
+
+
+ False
+
+
+ disabledMessages
+
+
+
+
+
+ enableBasic
+
+
+ True
+
+
+ enableClasses
+
+
+ True
+
+
+ enableDesign
+
+
+ True
+
+
+ enableExceptions
+
+
+ True
+
+
+ enableFormat
+
+
+ True
+
+
+ enableImports
+
+
+ True
+
+
+ enableLogging
+
+
+ True
+
+
+ enableMetrics
+
+
+ True
+
+
+ enableMiscellaneous
+
+
+ True
+
+
+ enableNewstyle
+
+
+ True
+
+
+ enableSimilarities
+
+
+ True
+
+
+ enableStringFormat
+
+
+ True
+
+
+ enableTypecheck
+
+
+ True
+
+
+ enableVariables
+
+
+ True
+
+
+ enabledMessages
+
+
+
+
+
+ htmlReport
+
+
+ True
+
+
+ txtReport
+
+
+ False
+
+
+
Pep8Checker
diff --git a/revpipycontrol/aclmanager.py b/revpipycontrol/aclmanager.py
index 72e19b2..b193753 100644
--- a/revpipycontrol/aclmanager.py
+++ b/revpipycontrol/aclmanager.py
@@ -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)
diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
index 7480959..43e7b2a 100644
--- a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
+++ b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
@@ -1,32 +1,32 @@
msgid ""
msgstr ""
"Project-Id-Version: RevPiPyControl 0.4.0\n"
-"POT-Creation-Date: 2018-04-07 14:56+0200\n"
-"PO-Revision-Date: 2018-04-07 14:56+0200\n"
+"POT-Creation-Date: 2018-08-14 09:19+0200\n"
+"PO-Revision-Date: 2018-08-14 09:21+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.8.7.1\n"
+"X-Generator: Poedit 2.0.6\n"
"X-Poedit-Basepath: ../../..\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: .\n"
-#: aclmanager.py:59
+#: aclmanager.py:58
msgid "Level"
msgstr "Level"
-#: aclmanager.py:77 aclmanager.py:277 revpilegacy.py:69 revpilegacy.py:282
-#: revpilegacy.py:329 revpioption.py:73 revpioption.py:312 revpioption.py:356
-#: revpiplclist.py:61 revpiplclist.py:197 revpiprogram.py:394
-#: revpiprogram.py:468
+#: aclmanager.py:76 aclmanager.py:276 revpilegacy.py:68 revpilegacy.py:281
+#: revpilegacy.py:328 revpioption.py:72 revpioption.py:311 revpioption.py:355
+#: revpiplclist.py:62 revpiplclist.py:203 revpiprogram.py:393
+#: revpiprogram.py:467
msgid "Question"
msgstr "Frage"
-#: aclmanager.py:78 revpilegacy.py:70 revpioption.py:74 revpiplclist.py:62
+#: aclmanager.py:77 revpilegacy.py:69 revpioption.py:73 revpiplclist.py:63
msgid ""
"Do you really want to quit? \n"
"Unsaved changes will be lost"
@@ -34,123 +34,127 @@ msgstr ""
"Wollen Sie wirklich beenden? \n"
"Nicht gespeicherte Änderungen gehen verloren"
-#: aclmanager.py:88
+#: aclmanager.py:87
msgid "IP access control list"
msgstr "IP Zugriffsliste"
-#: aclmanager.py:95
+#: aclmanager.py:94
msgid "Existing ACLs"
msgstr "Vorhandene ACLs"
-#: aclmanager.py:109 aclmanager.py:227
+#: aclmanager.py:108 aclmanager.py:226
msgid "Access level"
msgstr "Zugriffslevel"
-#: aclmanager.py:125
+#: aclmanager.py:124
msgid "load entry"
msgstr "Eintrag laden"
-#: aclmanager.py:131
+#: aclmanager.py:130
msgid "remove entry"
msgstr "Eintrag entfernen"
-#: aclmanager.py:139
+#: aclmanager.py:138
msgid "Edit acess control list"
msgstr "Liste der Zugriffslevel bearbeiten"
-#: aclmanager.py:147 revpiplclist.py:101
+#: aclmanager.py:146 revpiplclist.py:102
msgid "IP address"
msgstr "IP Adresse"
-#: aclmanager.py:241
+#: aclmanager.py:240
msgid "add to list"
msgstr "in Liste einfügen"
-#: aclmanager.py:246
+#: aclmanager.py:245
msgid "clear"
msgstr "leeren"
-#: aclmanager.py:260 revpilegacy.py:236 revpioption.py:263 revpiplclist.py:137
+#: aclmanager.py:259 revpilegacy.py:235 revpioption.py:262 revpiplclist.py:138
msgid "Save"
msgstr "Speichern"
-#: aclmanager.py:265 revpiinfo.py:141 revpilegacy.py:241 revpioption.py:268
-#: revpiplclist.py:141
+#: aclmanager.py:264 revpiinfo.py:140 revpilegacy.py:240 revpioption.py:267
+#: revpiplclist.py:142
msgid "Close"
msgstr "Schließen"
-#: aclmanager.py:278
+#: aclmanager.py:277
+#, python-brace-format
msgid ""
"Do you really want to delete the following item? \n"
"\n"
-"IP: {} / Level: {}"
+"IP: {0} / Level: {1}"
msgstr ""
"Soll das Element wirklich gelöscht werden?\n"
"\n"
-"IP: {} / Level: {}"
+"IP: {0} / Level: {1}"
-#: aclmanager.py:292 aclmanager.py:368 revpicheckclient.py:110
-#: revpicheckclient.py:442 revpilegacy.py:319 revpioption.py:87
-#: revpioption.py:346 revpiplclist.py:221 revpiprogram.py:330
-#: revpiprogram.py:361 revpiprogram.py:424 revpiprogram.py:430
-#: revpiprogram.py:436 revpiprogram.py:444 revpiprogram.py:450
-#: revpiprogram.py:483 revpiprogram.py:567 revpiprogram.py:640
-#: revpiprogram.py:671 revpiprogram.py:684 revpiprogram.py:739
-#: revpiprogram.py:759 revpiprogram.py:767 revpipycontrol.py:263
-#: revpipycontrol.py:390
+#: aclmanager.py:291 aclmanager.py:367 revpicheckclient.py:112
+#: revpicheckclient.py:335 revpicheckclient.py:460 revpidevelop.py:209
+#: revpidevelop.py:217 revpidevelop.py:244 revpilegacy.py:318 revpioption.py:86
+#: revpioption.py:345 revpiplclist.py:227 revpiprogram.py:329
+#: revpiprogram.py:360 revpiprogram.py:423 revpiprogram.py:429
+#: revpiprogram.py:435 revpiprogram.py:443 revpiprogram.py:449
+#: revpiprogram.py:482 revpiprogram.py:566 revpiprogram.py:644
+#: revpiprogram.py:675 revpiprogram.py:688 revpiprogram.py:747
+#: revpiprogram.py:767 revpiprogram.py:775 revpipycontrol.py:272
+#: revpipycontrol.py:427
msgid "Error"
msgstr "Fehler"
-#: aclmanager.py:293
+#: aclmanager.py:292
msgid "Can not delete ACL! Check format."
msgstr "Kann ACL nicht löschen! Format prüfen."
-#: aclmanager.py:369
+#: aclmanager.py:368
msgid "Can not load new ACL! Check format."
msgstr "Kann neue ACL nicht laden! Format prüfen."
-#: revpicheckclient.py:111
+#: revpicheckclient.py:113
+#, python-brace-format
msgid ""
-"Given value for Output '{}' is not valid! \n"
-"Reset to '{}'"
+"Given value for Output '{0}' is not valid! \n"
+"Reset to '{1}'"
msgstr ""
-"Angegebener Wert für Output '{}' ist nicht gültig! \n"
-"Setze auf '{}' zurück"
+"Angegebener Wert für Output '{0}' ist nicht gültig! \n"
+"Setze auf '{1}' zurück"
-#: revpicheckclient.py:211
+#: revpicheckclient.py:216
msgid "Devices of RevPi"
msgstr "Devices vom RevPi"
-#: revpicheckclient.py:243
+#: revpicheckclient.py:248
msgid "Control"
msgstr "Kontrolle"
-#: revpicheckclient.py:247
+#: revpicheckclient.py:252
msgid "Read all IOs"
msgstr "Lese alle IOs"
-#: revpicheckclient.py:252
+#: revpicheckclient.py:257
msgid "Read just Inputs"
msgstr "Nur Inputs lesen"
-#: revpicheckclient.py:259
+#: revpicheckclient.py:264
msgid "Write Outputs"
msgstr "Outputs schreiben"
-#: revpicheckclient.py:265
+#: revpicheckclient.py:270
msgid "Autorefresh values"
msgstr "Aktualisiere Werte automatisch"
-#: revpicheckclient.py:273
+#: revpicheckclient.py:278
msgid "Write values to RevPi"
msgstr "Schreibe Werte auf RevPi"
-#: revpicheckclient.py:287 revpiprogram.py:457 revpipycontrol.py:244
-#: revpipycontrol.py:300 revpipycontrol.py:318 revpipycontrol.py:351
+#: revpicheckclient.py:292 revpidevelop.py:276 revpiprogram.py:456
+#: revpipycontrol.py:254 revpipycontrol.py:303 revpipycontrol.py:337
+#: revpipycontrol.py:355 revpipycontrol.py:388
msgid "Warning"
msgstr "Warnung"
-#: revpicheckclient.py:288
+#: revpicheckclient.py:293
msgid ""
"You want to set outputs on the RevPi! Note that these are set "
"IMMEDIATELY!!! \n"
@@ -162,31 +166,92 @@ msgstr ""
"Wenn auf dem RevPi ein anderes Programm zur Steuerung läuft, könnte dies "
"gestört werden und die Ausgänge wieder zurücksetzen."
-#: revpicheckclient.py:439
-msgid "Error set value of device '{}' Output '{}': {} \n"
-msgstr "Fehler beim Setzen der Werte auf Device '{}' bei Output '{}': {} \n"
+#: revpicheckclient.py:336
+msgid "To many errors while reading IO data. Can not show the Watch-Mode."
+msgstr ""
+"Zu viele Fehler beim Lesen der IO-Daten. Watch-Mode kann nicht angezeigt "
+"werden."
-#: revpiinfo.py:41
+#: revpicheckclient.py:456
+#, python-brace-format
+msgid "Error set value of device '{0}' Output '{1}': {2} \n"
+msgstr "Fehler beim Setzen der Werte auf Device '{0}' bei Output '{1}': {2} \n"
+
+#: revpidevelop.py:116
+msgid "File watcher for PLC development"
+msgstr "Dateiüberwachung für PLC Entwicklung"
+
+#: revpidevelop.py:121
+msgid "Path to list files:"
+msgstr "Pfad für Dateiliste:"
+
+#: revpidevelop.py:126
+msgid "Select path"
+msgstr "Pfad wählen"
+
+#: revpidevelop.py:156
+msgid "Stop / Upload / Start"
+msgstr "Stoppen / Hochladen / Starten"
+
+#: revpidevelop.py:200 revpilegacy.py:273 revpilegacy.py:310 revpioption.py:299
+#: revpioption.py:337 revpiplclist.py:219 revpiprogram.py:97
+msgid "Information"
+msgstr "Information"
+
+#: revpidevelop.py:201 revpiprogram.py:98
+msgid ""
+"A PLC program has been uploaded. Please check the PLC options to see if the "
+"correct program is specified as the start program."
+msgstr ""
+"Ein PLC Programm wurde hochgeladen. Bitte prüfen Sie die PLC Optionen, ob "
+"dort das richtige Programm als Startprogramm angegeben ist."
+
+#: revpidevelop.py:210 revpiprogram.py:768
+msgid "The Revolution Pi could not process some parts of the transmission."
+msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten."
+
+#: revpidevelop.py:218 revpiprogram.py:776
+msgid "Errors occurred during transmission"
+msgstr "Bei der Übertragung traten Fehler auf"
+
+#: revpidevelop.py:229
+msgid "Directory to watch"
+msgstr "Ordner zum Überwachen"
+
+#: revpidevelop.py:245
+msgid "Can not open the selected folder."
+msgstr "Kann gewählten Ordner nicht öffnen."
+
+#: revpidevelop.py:277
+msgid ""
+"Found more than 1000 files! Only 1000 files can be shown in this dialog, all "
+"other will be ignored."
+msgstr ""
+"Mehr als 1000 Dateien gefunden! Es werden nur 1000 Dateien in diesem Dialog "
+"angezeigt, der Rest wird ignoriert."
+
+#: revpiinfo.py:40
msgid "RevPi Python PLC info"
msgstr "RevPi Python PLC Information"
-#: revpiinfo.py:54
+#: revpiinfo.py:53
msgid "RevPi Python PLC - Control"
msgstr "RevPi Python PLC - Kontrollcenter"
-#: revpiinfo.py:58
-msgid "Version: {}"
-msgstr "Version: {}"
+#: revpiinfo.py:57
+#, python-brace-format
+msgid "Version: {0}"
+msgstr "Version: {0}"
-#: revpiinfo.py:81
+#: revpiinfo.py:80
msgid "RevPiPyLoad version on RevPi:"
msgstr "RevPiPyLoad Version auf RevPi:"
-#: revpiinfo.py:86
+#: revpiinfo.py:85
msgid "not conn."
msgstr "nicht verb."
-#: revpiinfo.py:94
+#: revpiinfo.py:93
msgid ""
"\n"
"RevPiModIO, RevPiPyLoad and RevPiPyControl\n"
@@ -209,63 +274,63 @@ msgstr ""
"\n"
"(c) Sven Sager, Lizenz: LGPLv3"
-#: revpilegacy.py:80 revpioption.py:97
+#: revpilegacy.py:79 revpioption.py:96
msgid "RevPi Python PLC Options"
msgstr "RevPi Python PLC Einstellungen"
-#: revpilegacy.py:90 revpioption.py:108
+#: revpilegacy.py:89 revpioption.py:107
msgid "Start / Stop behavior"
msgstr "Start / Stop Verhalten"
-#: revpilegacy.py:99 revpioption.py:118
+#: revpilegacy.py:98 revpioption.py:117
msgid "Start program automatically"
msgstr "Starte Programm automatisch"
-#: revpilegacy.py:105 revpioption.py:124
+#: revpilegacy.py:104 revpioption.py:123
msgid "Restart program after exit"
msgstr "Starte Programm nach Beenden neu"
-#: revpilegacy.py:111 revpioption.py:140
+#: revpilegacy.py:110 revpioption.py:139
msgid "Set process image to NULL if program terminates..."
msgstr "Prozessabbild auf NULL setzen, wenn Programm..."
-#: revpilegacy.py:116 revpioption.py:145
+#: revpilegacy.py:115 revpioption.py:144
msgid "... successfully"
msgstr "... ohne Fehler beendet"
-#: revpilegacy.py:122 revpioption.py:151
+#: revpilegacy.py:121 revpioption.py:150
msgid "... with errors"
msgstr "... mit Fehlern beendet"
-#: revpilegacy.py:128 revpioption.py:159
+#: revpilegacy.py:127 revpioption.py:158
msgid "PLC program"
msgstr "PLC Programm"
-#: revpilegacy.py:139 revpioption.py:170
+#: revpilegacy.py:138 revpioption.py:169
msgid "Python version"
msgstr "Python Version"
-#: revpilegacy.py:158 revpioption.py:189
+#: revpilegacy.py:157 revpioption.py:188
msgid "Python PLC program name"
msgstr "Python PLC Programmname"
-#: revpilegacy.py:173 revpioption.py:204
+#: revpilegacy.py:172 revpioption.py:203
msgid "Program arguments"
msgstr "Programmargumente"
-#: revpilegacy.py:184 revpioption.py:225
+#: revpilegacy.py:183 revpioption.py:224
msgid "Use RevPi as PLC-Slave"
msgstr "RevPi als PLC-Slave verwenden"
-#: revpilegacy.py:190
+#: revpilegacy.py:189
msgid "XML-RPC server"
msgstr "XML-RPC Server"
-#: revpilegacy.py:202 revpioption.py:250
+#: revpilegacy.py:201 revpioption.py:249
msgid "Activate XML-RPC server on RevPi"
msgstr "Aktiviere XML-RPC Server auf RevPi"
-#: revpilegacy.py:210
+#: revpilegacy.py:209
msgid ""
"Allow download of piCtory configuration and\n"
"PLC programm"
@@ -273,7 +338,7 @@ msgstr ""
"Download von piCtroy Konfiguration und\n"
"PLC Programm zulassen"
-#: revpilegacy.py:217
+#: revpilegacy.py:216
msgid ""
"Allow upload of piCtory configuration and\n"
"PLC programm"
@@ -281,20 +346,15 @@ msgstr ""
"Hochladen von piCtroy Konfiguration und\n"
"PLC Programm zulassen"
-#: revpilegacy.py:222
+#: revpilegacy.py:221
msgid "XML-RPC server port"
msgstr "XML-RPC Serverport"
-#: revpilegacy.py:274 revpilegacy.py:311 revpioption.py:300 revpioption.py:338
-#: revpiplclist.py:213 revpiprogram.py:98
-msgid "Information"
-msgstr "Information"
-
-#: revpilegacy.py:275 revpioption.py:301
+#: revpilegacy.py:274 revpioption.py:300
msgid "You have not made any changes to save."
msgstr "Sie haben keine Änderungen zum Speichern vorgenommen."
-#: revpilegacy.py:283
+#: revpilegacy.py:282
msgid ""
"The settings are now saved on the Revolution Pi. \n"
"\n"
@@ -306,17 +366,17 @@ msgstr ""
"Sollen die neuen Einstellungen sofort in Kraft treten? \n"
"Dies bedeutet einen Neustart des Dienstes und des laufenden PLC-Programms!"
-#: revpilegacy.py:312 revpioption.py:339
+#: revpilegacy.py:311 revpioption.py:338
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
-#: revpilegacy.py:320 revpioption.py:347
+#: revpilegacy.py:319 revpioption.py:346
msgid "The settings could not be saved. This can happen if values are wrong!"
msgstr ""
"Die Einstellungen konnten nicht gesichert werden. Dies kann passieren, wenn "
"Werte falsch sind!"
-#: revpilegacy.py:330 revpioption.py:357
+#: revpilegacy.py:329 revpioption.py:356
msgid ""
"Are you sure you want to deactivate the XML-RPC server? You will NOT be able "
"to access the Revolution Pi with this program."
@@ -324,55 +384,55 @@ msgstr ""
"Soll der XML-RPC Server wirklich beendet werden? Sie können dann NICHT mehr "
"mit diesem Programm auf den Revolution Pi zugreifen."
-#: revpilogfile.py:44
+#: revpilogfile.py:43
msgid "RevPi Python PLC Logs"
msgstr "RevPi Python PLC Logdaten"
-#: revpilogfile.py:57
+#: revpilogfile.py:56
msgid "RevPiPyLoad - Logfile"
msgstr "RevPiPyLoad - Logdatei"
-#: revpilogfile.py:61 revpilogfile.py:77
+#: revpilogfile.py:60 revpilogfile.py:76
msgid "Clear screen"
msgstr "Leere Ansicht"
-#: revpilogfile.py:73
+#: revpilogfile.py:72
msgid "Python PLC program - Logfile"
msgstr "Python PLC Programm - Logdatei"
-#: revpilogfile.py:162
+#: revpilogfile.py:161
msgid "Can not access log file on the RevPi"
msgstr "Auf die Logdatei des RevPi kann nicht zugegriffen werden"
-#: revpioption.py:88
+#: revpioption.py:87
msgid "The value of 'restart delay' ist not valid."
msgstr "Der Wert für 'Neustart Verzögerung' ist nicht gültig."
-#: revpioption.py:130
+#: revpioption.py:129
msgid "Restart after n seconds of delay"
msgstr "Neustart nach n Sekunden Verzögerung"
-#: revpioption.py:214
+#: revpioption.py:213
msgid "RevPiPyLoad server services"
msgstr "RevPiPyLoad Server Dienste"
-#: revpioption.py:231 revpioption.py:256
+#: revpioption.py:230 revpioption.py:255
msgid "Edit ACL"
msgstr "ACL bearbeiten"
-#: revpioption.py:236
+#: revpioption.py:235
msgid "RevPi-Slave service is:"
msgstr "RevPi-Slave Dienst Status:"
-#: revpioption.py:242
+#: revpioption.py:241
msgid "running"
msgstr "läuft"
-#: revpioption.py:242
+#: revpioption.py:241
msgid "stopped"
msgstr "beendet"
-#: revpioption.py:313
+#: revpioption.py:312
msgid ""
"The settings will be set on the Revolution Pi now. \n"
"\n"
@@ -386,63 +446,64 @@ msgstr ""
"Programm jetzt neu starten!\n"
"ACL Änderungen und Diensteinstellungen werden sofort angewandt."
-#: revpioption.py:376
+#: revpioption.py:375
msgid "read only"
msgstr "nur lesen"
-#: revpioption.py:377
+#: revpioption.py:376
msgid "read and write"
msgstr "lesen und schreiben"
-#: revpioption.py:393
+#: revpioption.py:392
msgid "Start/Stop PLC program and read logs"
msgstr "PLC Programm starten/stoppen und Logs lesen"
-#: revpioption.py:394
+#: revpioption.py:393
msgid "+ read IOs in watch modus"
msgstr "+ IOs in 'Watch modus' lesen"
-#: revpioption.py:395
+#: revpioption.py:394
msgid "+ read properties and download PLC program"
msgstr "+ Einstellungen lesen und PLC Programm herunterladen"
-#: revpioption.py:396
+#: revpioption.py:395
msgid "+ upload PLC program"
msgstr "+ PLC Programm hochladen"
-#: revpioption.py:397
+#: revpioption.py:396
msgid "+ set properties"
msgstr "+ Einstellungen ändern"
-#: revpiplclist.py:72
+#: revpiplclist.py:73
msgid "RevPi Python PLC connections"
msgstr "RevPi Python PLC Verbindungen"
-#: revpiplclist.py:92
+#: revpiplclist.py:93
msgid "Name"
msgstr "Name"
-#: revpiplclist.py:110
+#: revpiplclist.py:111
msgid "Port"
msgstr "Port"
-#: revpiplclist.py:121
+#: revpiplclist.py:122
msgid "New"
msgstr "Neu"
-#: revpiplclist.py:125
+#: revpiplclist.py:126
msgid "Apply"
msgstr "Übernehmen"
-#: revpiplclist.py:130
+#: revpiplclist.py:131
msgid "Remove"
msgstr "Entfernen"
-#: revpiplclist.py:198
-msgid "Do you really want to delete the selected connection '{}'?"
-msgstr "Wollen Sie die ausgewählte Verbindung '{}' wirklich löschen?"
+#: revpiplclist.py:204
+#, python-brace-format
+msgid "Do you really want to delete the selected connection '{0}'?"
+msgstr "Wollen Sie die ausgewählte Verbindung '{0}' wirklich löschen?"
-#: revpiplclist.py:214
+#: revpiplclist.py:220
msgid ""
"Successfully saved. \n"
"Do you want to close this window?"
@@ -450,147 +511,139 @@ msgstr ""
"Verbindungen erfolgreich gespeichert. \n"
"Möchten Sie dieses Fenster jetzt schließen?"
-#: revpiplclist.py:222
+#: revpiplclist.py:228
msgid "Failed to save connections"
msgstr "Verbindungen konnten nicht gespeichert werden"
-#: revpiprogram.py:99
-msgid ""
-"A PLC program has been uploaded. Please check the PLC options to see if the "
-"correct program is specified as the start program."
-msgstr ""
-"Ein PLC Programm wurde hochgeladen. Bitte prüfen Sie die PLC Optionen, ob "
-"dort das richtige Programm als Startprogramm angegeben ist."
-
-#: revpiprogram.py:108
+#: revpiprogram.py:107
msgid "RevPi Python PLC program"
msgstr "RevPi Python PLC Programm"
-#: revpiprogram.py:122
+#: revpiprogram.py:121
msgid "PLC python program"
msgstr "PLC Python Programm"
-#: revpiprogram.py:132 revpiprogram.py:134 revpiprogram.py:142
-#: revpiprogram.py:146
+#: revpiprogram.py:131 revpiprogram.py:133 revpiprogram.py:141
+#: revpiprogram.py:145
msgid "Files"
msgstr "Dateien"
-#: revpiprogram.py:132 revpiprogram.py:134 revpiprogram.py:515
-#: revpiprogram.py:624
+#: revpiprogram.py:131 revpiprogram.py:133 revpiprogram.py:514
+#: revpiprogram.py:628
msgid "Zip archive"
msgstr "Zip Archiv"
-#: revpiprogram.py:132 revpiprogram.py:134 revpiprogram.py:528
-#: revpiprogram.py:654
+#: revpiprogram.py:131 revpiprogram.py:133 revpiprogram.py:527
+#: revpiprogram.py:658
msgid "TGZ archive"
msgstr "TGZ Archiv"
-#: revpiprogram.py:134
+#: revpiprogram.py:133
msgid "Folder"
msgstr "Verzeichnis"
-#: revpiprogram.py:151
+#: revpiprogram.py:150
msgid "Download PLC program as:"
msgstr "PLC Programm herunterladen als:"
-#: revpiprogram.py:162
+#: revpiprogram.py:161
msgid "include piCtory configuration"
msgstr "inkl. piCtory Konfiguration"
-#: revpiprogram.py:168 revpiprogram.py:216 revpiprogram.py:241
+#: revpiprogram.py:167 revpiprogram.py:215 revpiprogram.py:240
msgid "Download"
msgstr "Herunterladen"
-#: revpiprogram.py:173
+#: revpiprogram.py:172
msgid "Upload PLC program as:"
msgstr "PLC Programm hochladen als:"
-#: revpiprogram.py:187
+#: revpiprogram.py:186
msgid "clean upload folder before upload"
msgstr "Uploadverzeichnis vor dem Upload leeren"
-#: revpiprogram.py:194
+#: revpiprogram.py:193
msgid "includes piCtory configuration"
msgstr "enthält piCtory Konfiguration"
-#: revpiprogram.py:201 revpiprogram.py:226
+#: revpiprogram.py:200 revpiprogram.py:225
msgid "Upload"
msgstr "Hochladen"
-#: revpiprogram.py:207
+#: revpiprogram.py:206
msgid "piCtory configuration"
msgstr "piCtory Konfiguration"
-#: revpiprogram.py:211
+#: revpiprogram.py:210
msgid "Download piCtory configuration"
msgstr "piCtory Konfiguration herunterladen"
-#: revpiprogram.py:220
+#: revpiprogram.py:219
msgid "Upload piCtory configuration"
msgstr "piCtory Konfiguration hochladen"
-#: revpiprogram.py:232
+#: revpiprogram.py:231
msgid "piControl0 process image"
msgstr "piControl0 Prozessabbild"
-#: revpiprogram.py:236
+#: revpiprogram.py:235
msgid "Download process image dump"
msgstr "Prozessabbild Dump herunterladen"
-#: revpiprogram.py:247
+#: revpiprogram.py:246
msgid "Reset piControl"
msgstr "piControl zurücksetzen"
-#: revpiprogram.py:251
+#: revpiprogram.py:250
msgid "Execute piControlReset"
msgstr "piControlReset ausführen"
-#: revpiprogram.py:256
+#: revpiprogram.py:255
msgid "execute"
msgstr "ausführen"
-#: revpiprogram.py:262 revpipycontrol.py:114
+#: revpiprogram.py:261 revpipycontrol.py:117
msgid "Exit"
msgstr "Beenden"
-#: revpiprogram.py:320 revpiprogram.py:351 revpiprogram.py:511
-#: revpiprogram.py:524
+#: revpiprogram.py:319 revpiprogram.py:350 revpiprogram.py:510
+#: revpiprogram.py:523
msgid "Save as..."
msgstr "Speichern unter..."
-#: revpiprogram.py:323 revpiprogram.py:386
+#: revpiprogram.py:322 revpiprogram.py:385
msgid "piCtory config"
msgstr "piCtory Konfiguration"
-#: revpiprogram.py:323 revpiprogram.py:354 revpiprogram.py:386
-#: revpiprogram.py:515 revpiprogram.py:528 revpiprogram.py:599
-#: revpiprogram.py:624 revpiprogram.py:654
+#: revpiprogram.py:322 revpiprogram.py:353 revpiprogram.py:385
+#: revpiprogram.py:514 revpiprogram.py:527 revpiprogram.py:599
+#: revpiprogram.py:628 revpiprogram.py:658
msgid "All files"
msgstr "Alle Dateien"
-#: revpiprogram.py:331 revpiprogram.py:362 revpiprogram.py:568
+#: revpiprogram.py:330 revpiprogram.py:361 revpiprogram.py:567
msgid "Could not load and save file!"
msgstr "Datei konnte nicht geladen und gespeichert werden!"
-#: revpiprogram.py:336 revpiprogram.py:367 revpiprogram.py:405
-#: revpiprogram.py:413 revpiprogram.py:477 revpiprogram.py:573
-#: revpiprogram.py:729
+#: revpiprogram.py:335 revpiprogram.py:366 revpiprogram.py:404
+#: revpiprogram.py:412 revpiprogram.py:476 revpiprogram.py:572
+#: revpiprogram.py:737
msgid "Success"
msgstr "Erfolgreich"
-#: revpiprogram.py:337 revpiprogram.py:368 revpiprogram.py:574
+#: revpiprogram.py:336 revpiprogram.py:367 revpiprogram.py:573
msgid "File successfully loaded and saved."
msgstr "Dateien erfolgreich übertragen und gespeichert."
-#: revpiprogram.py:354
+#: revpiprogram.py:353
msgid "Imagefiles"
msgstr "Image Dateien"
-#: revpiprogram.py:382
+#: revpiprogram.py:381
msgid "Open piCtory file..."
msgstr "piCtory Datei öffnen..."
-#: revpiprogram.py:395
+#: revpiprogram.py:394
msgid ""
"Should the piControl driver be reset after uploading the piCtory "
"configuration?"
@@ -598,7 +651,7 @@ msgstr ""
"Soll nach dem Hochladen der piCtory Konfiguration ein Reset am piControl "
"Treiber durchgeführt werden?"
-#: revpiprogram.py:406
+#: revpiprogram.py:405
msgid ""
"The transfer of the piCtory configuration and the reset of piControl have "
"been successfully executed."
@@ -606,20 +659,20 @@ msgstr ""
"Die Übertragung der piCtory Konfiguration und der Reset von piControl wurden "
"erfolgreich ausgeführt."
-#: revpiprogram.py:414
+#: revpiprogram.py:413
msgid "The piCtory configuration was successfully transferred."
msgstr ""
"Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt."
-#: revpiprogram.py:425
+#: revpiprogram.py:424
msgid "Can not process the transferred file."
msgstr "Kann die übertragene Datei nicht verarbeiten."
-#: revpiprogram.py:431
+#: revpiprogram.py:430
msgid "Can not find main elements in piCtory file."
msgstr "Kann Hauptelemente in piCtory datei nicht finden."
-#: revpiprogram.py:437
+#: revpiprogram.py:436
msgid ""
"Contained devices could not be found on Revolution Pi. The configuration may "
"be from a newer piCtory version!"
@@ -627,17 +680,17 @@ msgstr ""
"Enthaltene Geräte konnten auf dem Revolution Pi nicht gefunden werden. "
"Möglicherweise stammt die Konfiguration von einer neueren piCtory Version!"
-#: revpiprogram.py:445
+#: revpiprogram.py:444
msgid "Could not load RAP catalog on Revolution Pi."
msgstr "Konnte RAP Katalog auf dem Revolution Pi nicht laden."
-#: revpiprogram.py:451
+#: revpiprogram.py:450
msgid "The piCtory configuration could not be written on the Revolution Pi."
msgstr ""
"Die piCtory Konfiguration konnte auf dem Revolution Pi nicht geschrieben "
"werden."
-#: revpiprogram.py:458
+#: revpiprogram.py:457
msgid ""
"The piCtroy configuration has been saved successfully. \n"
"An error occurred on piControl reset!"
@@ -645,7 +698,7 @@ msgstr ""
"Die piCtroy Konfiguration wurde erfolgreich gespeichert. \n"
"Beim piControl Reset trat allerdings ein Fehler auf!"
-#: revpiprogram.py:469
+#: revpiprogram.py:468
msgid ""
"Are you sure to reset piControl? \n"
"The process image and the piBridge are interrupted !!!"
@@ -653,15 +706,15 @@ msgstr ""
"Soll piControlReset wirklich durchgeführt werden? \n"
"Das Prozessabbild und die piBridge werden dann unterbrochen!!!"
-#: revpiprogram.py:478
+#: revpiprogram.py:477
msgid "piControl reset executed successfully"
msgstr "piControl reset wurde erfolgreich ausgeführt"
-#: revpiprogram.py:484
+#: revpiprogram.py:483
msgid "piControl reset could not be executed successfully"
msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden"
-#: revpiprogram.py:498
+#: revpiprogram.py:497
msgid "Directory to save"
msgstr "Verzeichnis zum speichern"
@@ -669,114 +722,111 @@ msgstr "Verzeichnis zum speichern"
msgid "Folder to upload"
msgstr "Verzeichnis zum Hochladen"
-#: revpiprogram.py:620
+#: revpiprogram.py:624
msgid "Upload Zip archive..."
msgstr "Zip Archiv hochladen..."
-#: revpiprogram.py:641
+#: revpiprogram.py:645
msgid "The specified file is not a ZIP archive."
msgstr "Die angegebene Datei ist kein ZIP Archiv."
-#: revpiprogram.py:650
+#: revpiprogram.py:654
msgid "Upload TarGz archiv..."
msgstr "TarGz Archiv hochladen..."
-#: revpiprogram.py:672
+#: revpiprogram.py:676
msgid "The specified file is not a TAR archive."
msgstr "Die angegebene Datei ist kein TAR Archiv."
-#: revpiprogram.py:685
+#: revpiprogram.py:689
msgid "There was an error deleting the files on the Revolution Pi."
msgstr ""
"Beim Löschen der Dateien auf dem Revolution Pi ist ein Fehler aufgetreten."
-#: revpiprogram.py:730
+#: revpiprogram.py:738
msgid "The PLC program was transferred successfully."
msgstr "Das PLC Programm wurde erfolgreich übertragen."
-#: revpiprogram.py:740
+#: revpiprogram.py:748
msgid "There is no piCtory configuration in this archive."
msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden."
-#: revpiprogram.py:760
-msgid "The Revolution Pi could not process some parts of the transmission."
-msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten."
-
-#: revpiprogram.py:768
-msgid "Errors occurred during transmission"
-msgstr "Bei der Übertragung traten Fehler auf"
-
-#: revpipycontrol.py:112
+#: revpipycontrol.py:115
msgid "Connections..."
msgstr "Verbindungen..."
-#: revpipycontrol.py:115
+#: revpipycontrol.py:118
msgid "Main"
msgstr "Datei"
-#: revpipycontrol.py:123
+#: revpipycontrol.py:126
msgid "Visit website..."
msgstr "Webseite besuchen..."
-#: revpipycontrol.py:125
+#: revpipycontrol.py:128
msgid "Info..."
msgstr "Info..."
-#: revpipycontrol.py:126
+#: revpipycontrol.py:129
msgid "Help"
msgstr "Hilfe"
-#: revpipycontrol.py:134
+#: revpipycontrol.py:142
msgid "PLC start"
msgstr "PLC Start"
-#: revpipycontrol.py:139
+#: revpipycontrol.py:147
msgid "PLC stop"
msgstr "PLC Stopp"
-#: revpipycontrol.py:144
+#: revpipycontrol.py:152
msgid "PLC restart"
msgstr "PLC Neustart"
-#: revpipycontrol.py:149
+#: revpipycontrol.py:157
msgid "PLC logs"
msgstr "PLC Logs"
-#: revpipycontrol.py:160
+#: revpipycontrol.py:168
msgid "PLC watch mode"
msgstr "PLC watch Modus"
-#: revpipycontrol.py:177
+#: revpipycontrol.py:185
msgid "PLC log..."
msgstr "PLC Log..."
-#: revpipycontrol.py:179
+#: revpipycontrol.py:187
msgid "PLC options..."
msgstr "PLC Optionen..."
-#: revpipycontrol.py:181
+#: revpipycontrol.py:189
msgid "PLC program..."
msgstr "PLC Programm..."
-#: revpipycontrol.py:185
+#: revpipycontrol.py:191
+msgid "PLC developer..."
+msgstr "PLC Entwickler..."
+
+#: revpipycontrol.py:195
msgid "Disconnect"
msgstr "Trennen"
-#: revpipycontrol.py:190
+#: revpipycontrol.py:200
msgid "Connect"
msgstr "Verbinden"
-#: revpipycontrol.py:245
+#: revpipycontrol.py:255
+#, python-brace-format
msgid ""
-"The watch mode ist not supported in version {} 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."
+"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."
msgstr ""
-"Der 'Watch Mode' ist nicht unterstützt in RevPiPyLoad Version {}! Es muss "
+"Der 'Watch Mode' ist nicht unterstützt in RevPiPyLoad Version {0}! Es muss "
"mindestens Version 0.5.3 installiert sein! Stellen Sie sicher, dass auch "
"python3-revpimodio2 auf dem RevPi installiert ist."
-#: revpipycontrol.py:264
+#: revpipycontrol.py:273
msgid ""
"Can not load piCtory configuration. \n"
"Did you create a hardware configuration? Please check this in piCtory!"
@@ -784,15 +834,7 @@ msgstr ""
"Kann piCtory Konfiguration nicht laden\n"
"Wurde eine Hardwarekonfiguration erstellt? Bitte in piCtory prüfen!"
-#: revpipycontrol.py:301
-msgid ""
-"This version of Logviewer ist not supported in version {} of RevPiPyLoad on "
-"your RevPi! You need at least version 0.4.1."
-msgstr ""
-"Diese Version vom Logbetrachter wird in der RevPiPyLoad Version {} auf Ihrem "
-"RevPi nicht unterstützt! Sie benötigen mindestens Version 0.4.1."
-
-#: revpipycontrol.py:319 revpipycontrol.py:352
+#: revpipycontrol.py:304 revpipycontrol.py:356 revpipycontrol.py:389
msgid ""
"XML-RPC access mode in the RevPiPyLoad configuration is too small to access "
"this dialog!"
@@ -800,7 +842,16 @@ msgstr ""
"Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um "
"diesen Dialog zu verwenden!"
-#: revpipycontrol.py:391
+#: revpipycontrol.py:338
+#, python-brace-format
+msgid ""
+"This version of Logviewer ist not supported in version {0} of RevPiPyLoad on "
+"your RevPi! You need at least version 0.4.1."
+msgstr ""
+"Diese Version vom Logbetrachter wird in der RevPiPyLoad Version {0} auf "
+"Ihrem RevPi nicht unterstützt! Sie benötigen mindestens Version 0.4.1."
+
+#: revpipycontrol.py:428
msgid ""
"Can not connect to RevPi XML-RPC Service! \n"
"\n"
diff --git a/revpipycontrol/mytools.py b/revpipycontrol/mytools.py
index 8cd4ab9..631124e 100644
--- a/revpipycontrol/mytools.py
+++ b/revpipycontrol/mytools.py
@@ -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")
diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py
index 454fa8b..d13cf22 100644
--- a/revpipycontrol/revpicheckclient.py
+++ b/revpipycontrol/revpicheckclient.py
@@ -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 != "":
diff --git a/revpipycontrol/revpidevelop.py b/revpipycontrol/revpidevelop.py
new file mode 100644
index 0000000..349c301
--- /dev/null
+++ b/revpipycontrol/revpidevelop.py
@@ -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 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:
+ 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("<>", 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()
diff --git a/revpipycontrol/revpiinfo.py b/revpipycontrol/revpiinfo.py
index 58393e5..f17c75c 100644
--- a/revpipycontrol/revpiinfo.py
+++ b/revpipycontrol/revpiinfo.py
@@ -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(
"",
lambda event: self._createwidgets(extended=not extended)
diff --git a/revpipycontrol/revpilegacy.py b/revpipycontrol/revpilegacy.py
index 115b947..d0db190 100644
--- a/revpipycontrol/revpilegacy.py
+++ b/revpipycontrol/revpilegacy.py
@@ -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")
)
diff --git a/revpipycontrol/revpilogfile.py b/revpipycontrol/revpilogfile.py
index 5666b4b..735ada7 100644
--- a/revpipycontrol/revpilogfile.py
+++ b/revpipycontrol/revpilogfile.py
@@ -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
diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py
index 963260a..ac31a2d 100644
--- a/revpipycontrol/revpioption.py
+++ b/revpipycontrol/revpioption.py
@@ -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):
diff --git a/revpipycontrol/revpiplclist.py b/revpipycontrol/revpiplclist.py
index 29900fd..2f5f076 100644
--- a/revpipycontrol/revpiplclist.py
+++ b/revpipycontrol/revpiplclist.py
@@ -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
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 7d3a1ee..b5a9527 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -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
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index 78da44e..ac37e7d 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -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")
diff --git a/revpipycontrol/shared/__init__.py b/revpipycontrol/shared/__init__.py
index d059206..0af3bfc 100644
--- a/revpipycontrol/shared/__init__.py
+++ b/revpipycontrol/shared/__init__.py
@@ -1 +1,6 @@
+# -*- coding: utf-8 -*-
"""Shared modules."""
+
+__author__ = "Sven Sager"
+__copyright__ = "Copyright (C) 2018 Sven Sager"
+__license__ = "GPLv3"
diff --git a/revpipycontrol/shared/ipaclmanager.py b/revpipycontrol/shared/ipaclmanager.py
index 5bf9aea..d1aa9fe 100644
--- a/revpipycontrol/shared/ipaclmanager.py
+++ b/revpipycontrol/shared/ipaclmanager.py
@@ -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 """
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
diff --git a/setup.py b/setup.py
index 742dc68..e1eeed6 100644
--- a/setup.py
+++ b/setup.py
@@ -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",