From 37e6dd6a75f206d46e7a16d952dfd8de8e318832 Mon Sep 17 00:00:00 2001 From: NaruX Date: Wed, 27 Jun 2018 08:55:49 +0200 Subject: [PATCH 1/9] Voreinstellungen vom Programmfenster werden wieder ?bernommen --- revpipycontrol.e4p | 4 ++-- revpipycontrol/revpiprogram.py | 12 ++++++------ revpipycontrol/revpipycontrol.py | 2 +- setup.py | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p index 9f0264c..f7fd027 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console - 0.6.1 + 0.6.2 Sven Sager akira@narux.de diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py index 5c19f3e..7d3a1ee 100644 --- a/revpipycontrol/revpiprogram.py +++ b/revpipycontrol/revpiprogram.py @@ -82,7 +82,7 @@ class RevPiProgram(tkinter.Frame): self.xmlstate = "normal" if xmlmode >= 3 else "disabled" # Letzte Einstellungen übernehmen - self.opt = _loaddefaults() + self.opt = _loaddefaults(revpi) # Fenster bauen self._createwidgets() @@ -339,7 +339,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name) - self._savedefaults(self.revpi, self.opt) + _savedefaults(self.revpi, self.opt) finally: fh.close() @@ -370,7 +370,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern self.opt["getprocimg_dir"] = os.path.dirname(fh.name) - self._savedefaults(self.revpi, self.opt) + _savedefaults(self.revpi, self.opt) finally: fh.close() @@ -418,7 +418,7 @@ class RevPiProgram(tkinter.Frame): # Einstellungen speichern self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name) - self._savedefaults(self.revpi, self.opt) + _savedefaults(self.revpi, self.opt) elif ec == -1: tkmsg.showerror( _("Error"), @@ -576,7 +576,7 @@ class RevPiProgram(tkinter.Frame): ) # Einstellungen speichern - self._savedefaults(self.revpi, self.opt) + _savedefaults(self.revpi, self.opt) finally: fh.close() @@ -752,7 +752,7 @@ class RevPiProgram(tkinter.Frame): self.opt["typeup"] = self.var_typeup.get() self.opt["picup"] = self.var_picup.get() - self._savedefaults(self.revpi, self.opt) + _savedefaults(self.revpi, self.opt) elif ec == -1: tkmsg.showerror( diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index ace204d..3c424eb 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -25,7 +25,7 @@ from xmlrpc.client import ServerProxy # Übersetzung laden _ = gettrans() -pycontrolversion = "0.6.1" +pycontrolversion = "0.6.2" class RevPiPyControl(tkinter.Frame): diff --git a/setup.py b/setup.py index 8a3062b..742dc68 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ globsetup = { "author_email": "akira@narux.de", "url": "https://revpimodio.org/revpipyplc/", "license": "LGPLv3", - "version": "0.6.1", + "version": "0.6.2", "name": "revpipycontrol", From e42cc1a6d2cf7922e913b68f278820248e3d861f Mon Sep 17 00:00:00 2001 From: NaruX Date: Tue, 31 Jul 2018 18:36:12 +0200 Subject: [PATCH 3/9] Wenn Ordner ?bertragen werden soll, wird dieser auch auf RevPi angelegt Developer-Dialog begonnen --- doc/index.html | 3 + doc/mytools.html | 2 +- doc/revpidevelop.html | 192 +++++++++++++++++ doc/revpipycontrol.html | 11 +- eric-revpipycontrol.api | 16 ++ eric-revpipycontrol.bas | 1 + revpipycontrol.e4p | 5 +- revpipycontrol/mytools.py | 3 + revpipycontrol/revpidevelop.py | 339 +++++++++++++++++++++++++++++++ revpipycontrol/revpiplclist.py | 7 + revpipycontrol/revpiprogram.py | 19 +- revpipycontrol/revpipycontrol.py | 29 ++- setup.py | 2 +- 13 files changed, 618 insertions(+), 11 deletions(-) create mode 100644 doc/revpidevelop.html create mode 100644 revpipycontrol/revpidevelop.py diff --git a/doc/index.html b/doc/index.html index 1a15819..71f598e 100644 --- a/doc/index.html +++ b/doc/index.html @@ -30,6 +30,9 @@ Modules revpicheckclient +revpidevelop + + revpiinfo diff --git a/doc/mytools.html b/doc/mytools.html index db6bf59..0511c04 100644 --- a/doc/mytools.html +++ b/doc/mytools.html @@ -12,7 +12,7 @@ Tools-Sammlung.

Global Attributes

- +
savefile_connections
savefile_programpath
savefile_connections
savefile_developer
savefile_programpath

Classes

diff --git a/doc/revpidevelop.html b/doc/revpidevelop.html new file mode 100644 index 0000000..9c74a42 --- /dev/null +++ b/doc/revpidevelop.html @@ -0,0 +1,192 @@ + + +revpidevelop + + + +

+revpidevelop

+ +

+Global Attributes

+ + +
_
+

+Classes

+ + + + + +
RevPiDevelopZeigt Debugfenster an.
+

+Functions

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

+ +

RevPiDevelop

+

+Zeigt Debugfenster an. +

+

+Derived from

+ttk.Frame +

+Class Attributes

+ + +
app
cli
root
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
RevPiDevelopInit RevPiDevelop-Class.
_checkclosePrüft ob Fenster beendet werden soll.
_createwidgetsErstellt alle Widgets.
btn_domyjobHochladen und neu starten.
btn_selectpathLässt dem Benuzter ein Verzeichnis auswählen.
load_pathfilesAktualisiert die Dateiliste.
refresh_statsPasst die Widgets an.
select_pathfilesSetzt state der Buttons.
+

+Static Methods

+ + +
None
+ +

+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. +

+
Up
+

+ +

_loaddefaults

+_loaddefaults(revpiname=None) +

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

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

+ +

_savedefaults

+_savedefaults(revpiname, settings) +

+Schreibt fuer den Pi die letzen Pfade. +

+
revpiname
+
+Einstellungen sind für diesen RevPi +
settings
+
+ mit Einstellungen +
+
+
Returns:
+
+True, bei erfolgreicher Verarbeitung +
+
+
Up
+
+ \ No newline at end of file diff --git a/doc/revpipycontrol.html b/doc/revpipycontrol.html index 77aa118..2100484 100644 --- a/doc/revpipycontrol.html +++ b/doc/revpipycontrol.html @@ -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/eric-revpipycontrol.api b/eric-revpipycontrol.api index 35d2dd1..e48d393 100644 --- a/eric-revpipycontrol.api +++ b/eric-revpipycontrol.api @@ -21,6 +21,7 @@ aclmanager._?8 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,6 +44,20 @@ revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist) revpicheckclient.RevPiCheckClient.writevalues?4() revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0) revpicheckclient._?8 +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._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) @@ -119,6 +134,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() 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..40f271f 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,7 +1,7 @@ - + en_US @@ -9,7 +9,7 @@ Python3 Console - 0.6.2 + 0.7.0 Sven Sager akira@narux.de @@ -27,6 +27,7 @@ revpipycontrol/revpilegacy.py revpipycontrol/shared/ipaclmanager.py revpipycontrol/shared/__init__.py + revpipycontrol/revpidevelop.py diff --git a/revpipycontrol/mytools.py b/revpipycontrol/mytools.py index 8cd4ab9..4356578 100644 --- a/revpipycontrol/mytools.py +++ b/revpipycontrol/mytools.py @@ -19,8 +19,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/revpidevelop.py b/revpipycontrol/revpidevelop.py new file mode 100644 index 0000000..3bc0c59 --- /dev/null +++ b/revpipycontrol/revpidevelop.py @@ -0,0 +1,339 @@ +# -*- coding: utf-8 -*- +# +# RevPiPyControl +# +# Webpage: https://revpimodio.org/revpipyplc/ +# (c) Sven Sager, License: LGPLv3 +# +u"""PLC Programm und Konfig hoch und runterladen.""" +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 revpilogfile import RevPiLogfile +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: + 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.master.protocol("WM_DELETE_WINDOW", self._checkclose) + self.master.bind("", self._checkclose) + 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() + + # Logfenster öffnen + self.tklog = RevPiLogfile(master, self.xmlcli) + + 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) + + # Logfile und eigenes fenster schließen + self.tklog.destroy() + self.master.destroy() + + def _createwidgets(self): + u"""Erstellt alle Widgets.""" + self.master.wm_title(_("RevPi Python PLC program")) + + 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) + + r += 1 + self.lbl_path = ttk.Label(devel) + self.lbl_path["text"] = self.watchpath + self.lbl_path.grid(row=r, column=0, columnspan=2, **cpadw) + + btn = ttk.Button(devel) + btn["command"] = self.btn_selectpath + btn["text"] = _("Select path") + btn.grid(row=r, column=1, **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") + + btn = ttk.Button(btnlist) + btn["command"] = lambda: self.xmlcli.plcstop() + btn["text"] = _("Just stop PLC") + btn.grid(row=0, column=0, **cpadwe) + + 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) + + btn = ttk.Button(btnlist) + btn["command"] = lambda: self.xmlcli.plcstart() + btn["text"] = _("Just start PLC") + btn.grid(row=0, column=2, **cpadwe) + + # Beendenbutton + btn = ttk.Button(self) + btn["command"] = self._checkclose + btn["text"] = _("Exit") + btn.grid(**cpad) + + 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: + 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 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: + 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/revpiplclist.py b/revpipycontrol/revpiplclist.py index 29900fd..acb384e 100644 --- a/revpipycontrol/revpiplclist.py +++ b/revpipycontrol/revpiplclist.py @@ -12,6 +12,8 @@ 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 @@ -154,6 +156,11 @@ class RevPiPlcList(tkinter.Frame): return False # Andere Einstellungen aufräumen + dict = developloaddefaults() + for revpi in tuple(dict.keys()): + if revpi not in self._connections: + del dict[revpi] + developsavedefaults(None, dict) dict = programloaddefaults() for revpi in tuple(dict.keys()): if revpi not in self._connections: diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py index 7d3a1ee..d9e00e8 100644 --- a/revpipycontrol/revpiprogram.py +++ b/revpipycontrol/revpiprogram.py @@ -15,8 +15,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 +48,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: @@ -588,6 +588,7 @@ class RevPiProgram(tkinter.Frame): dirtmp = None filelist = [] fileselect = None + foldername = "" rscfile = None if tup == 0: @@ -595,7 +596,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 +609,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 +711,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: diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 3c424eb..7736aa9 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -9,6 +9,7 @@ # u"""Hauptprogramm.""" import revpicheckclient +import revpidevelop import revpiinfo import revpilogfile import revpioption @@ -25,7 +26,7 @@ from xmlrpc.client import ServerProxy # Übersetzung laden _ = gettrans() -pycontrolversion = "0.6.2" +pycontrolversion = "0.7.0" class RevPiPyControl(tkinter.Frame): @@ -52,6 +53,7 @@ class RevPiPyControl(tkinter.Frame): # Globale Fenster self.tkcheckclient = None + self.tkdevelop = None self.tklogs = None self.tkoptions = None self.tkprogram = None @@ -75,6 +77,8 @@ class RevPiPyControl(tkinter.Frame): u"""Schließt alle Fenster.""" if self.tkcheckclient is not None: self.tkcheckclient.destroy() + if self.tkdevelop is not None: + self.tkdevelop.destroy() if self.tklogs is not None: self.tklogs.master.destroy() if self.tkoptions is not None: @@ -179,6 +183,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( @@ -282,6 +288,27 @@ class RevPiPyControl(tkinter.Frame): 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 + ) + else: + # Logfenster schließen + if self.tklogs is not None: + self.tklogs.master.destroy() + + win = tkinter.Toplevel(self) + win.focus_set() + win.grab_set() + self.tkdevelop = revpidevelop.RevPiDevelop( + win, self.cli, self.xmlmode, self.revpiname) + self.wait_window(win) + def plclist(self): u"""Öffnet das Fenster für die Verbindungen.""" win = tkinter.Toplevel(self) diff --git a/setup.py b/setup.py index 742dc68..cbed974 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ globsetup = { "author_email": "akira@narux.de", "url": "https://revpimodio.org/revpipyplc/", "license": "LGPLv3", - "version": "0.6.2", + "version": "0.7.0", "name": "revpipycontrol", From 554f19d0905917d24464d4fea56b48a708983445 Mon Sep 17 00:00:00 2001 From: NaruX Date: Thu, 2 Aug 2018 14:17:07 +0200 Subject: [PATCH 4/9] Developer als Frame zu Hauptfenster gelegt Sockettimeout auf 6 Sekunden ver?ndert --- revpipycontrol/revpidevelop.py | 40 ++-------- revpipycontrol/revpipycontrol.py | 121 +++++++++++++++++-------------- 2 files changed, 72 insertions(+), 89 deletions(-) diff --git a/revpipycontrol/revpidevelop.py b/revpipycontrol/revpidevelop.py index 3bc0c59..8fa8cdb 100644 --- a/revpipycontrol/revpidevelop.py +++ b/revpipycontrol/revpidevelop.py @@ -15,7 +15,6 @@ import tkinter.messagebox as tkmsg from mytools import homedir from mytools import gettrans from mytools import savefile_developer as savefile -from revpilogfile import RevPiLogfile from tkinter import ttk from xmlrpc.client import Binary @@ -70,8 +69,6 @@ class RevPiDevelop(ttk.Frame): return None super().__init__(master) - self.master.protocol("WM_DELETE_WINDOW", self._checkclose) - self.master.bind("", self._checkclose) self.pack(expand=True, fill="both") self.revpi = revpi @@ -94,9 +91,6 @@ class RevPiDevelop(ttk.Frame): self.refresh_stats() - # Logfenster öffnen - self.tklog = RevPiLogfile(master, self.xmlcli) - def _checkclose(self, event=None): u"""Prüft ob Fenster beendet werden soll. @param event tkinter-Event""" @@ -107,18 +101,12 @@ class RevPiDevelop(ttk.Frame): self.opt["watchfiles"] = self.watchfiles _savedefaults(self.revpi, self.opt) - # Logfile und eigenes fenster schließen - self.tklog.destroy() - self.master.destroy() - def _createwidgets(self): u"""Erstellt alle Widgets.""" - self.master.wm_title(_("RevPi Python PLC program")) - self.rowconfigure(0, weight=1) self.columnconfigure(0, weight=1) - cpad = {"padx": 4, "pady": 2} + # 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"} @@ -134,16 +122,16 @@ class RevPiDevelop(ttk.Frame): lbl["text"] = _("Path to list files:") lbl.grid(row=r, **cpadw) - r += 1 - self.lbl_path = ttk.Label(devel) - self.lbl_path["text"] = self.watchpath - self.lbl_path.grid(row=r, column=0, columnspan=2, **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) @@ -164,27 +152,11 @@ class RevPiDevelop(ttk.Frame): btnlist.columnconfigure(1, weight=1) btnlist.grid(row=r, columnspan=2, sticky="we") - btn = ttk.Button(btnlist) - btn["command"] = lambda: self.xmlcli.plcstop() - btn["text"] = _("Just stop PLC") - btn.grid(row=0, column=0, **cpadwe) - 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) - btn = ttk.Button(btnlist) - btn["command"] = lambda: self.xmlcli.plcstart() - btn["text"] = _("Just start PLC") - btn.grid(row=0, column=2, **cpadwe) - - # Beendenbutton - btn = ttk.Button(self) - btn["command"] = self._checkclose - btn["text"] = _("Exit") - btn.grid(**cpad) - def btn_domyjob(self): u"""Hochladen und neu starten.""" diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 7736aa9..1a5d023 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -48,12 +48,12 @@ class RevPiPyControl(tkinter.Frame): self.xmlfuncs = [] self.xmlmode = 0 - # Debugger vorbereiten + # Frames vorbereiten self.debugframe = None + self.developframe = None # Globale Fenster self.tkcheckclient = None - self.tkdevelop = None self.tklogs = None self.tkoptions = None self.tkprogram = None @@ -77,8 +77,10 @@ class RevPiPyControl(tkinter.Frame): u"""Schließt alle Fenster.""" if self.tkcheckclient is not None: self.tkcheckclient.destroy() - if self.tkdevelop is not None: - self.tkdevelop.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: @@ -129,38 +131,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") @@ -200,7 +207,7 @@ 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) @@ -218,7 +225,7 @@ class RevPiPyControl(tkinter.Frame): self.servererror() else: self._closeall() - socket.setdefaulttimeout(10) + socket.setdefaulttimeout(6) self.cli = ServerProxy( "http://{}:{}".format( self.dict_conn[text][0], int(self.dict_conn[text][1]) @@ -255,38 +262,40 @@ class RevPiPyControl(tkinter.Frame): "").format(self.cli.version()), parent=self.master ) + return + + # Debugframe laden + # FIXME: Bei neuer piCtory Konfig schneller vernichten + if self.debugframe is None \ + or self.debugframe.err_workvalues >= \ + self.debugframe.max_errors: + try: + self.debugframe = revpicheckclient.RevPiCheckClient( + self.main_frame, 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 + + # 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: - # Debugfenster laden - if self.debugframe is None \ - or self.debugframe.err_workvalues >= \ - self.debugframe.max_errors: - 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 + self.debugframe.pack(fill="x") - # 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" + self.btn_debug["state"] = "normal" def plcdevelop(self): u"""Startet das Developfenster.""" @@ -297,17 +306,19 @@ class RevPiPyControl(tkinter.Frame): "configuration is too small to access this dialog!"), parent=self.master ) - else: - # Logfenster schließen - if self.tklogs is not None: - self.tklogs.master.destroy() + return - win = tkinter.Toplevel(self) - win.focus_set() - win.grab_set() - self.tkdevelop = revpidevelop.RevPiDevelop( - win, self.cli, self.xmlmode, self.revpiname) - self.wait_window(win) + # 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.""" From 1d9c28d48b2dbc615b699e0ef620e74fc5159d17 Mon Sep 17 00:00:00 2001 From: NaruX Date: Thu, 2 Aug 2018 14:55:01 +0200 Subject: [PATCH 5/9] ?bersetzungen --- .../locale/de/LC_MESSAGES/revpipycontrol.po | 213 ++++++++++-------- 1 file changed, 125 insertions(+), 88 deletions(-) diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po index 7480959..90459c7 100644 --- a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po +++ b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po @@ -1,8 +1,8 @@ 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-02 14:50+0200\n" +"PO-Revision-Date: 2018-08-02 14:53+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -21,12 +21,12 @@ 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 +#: revpiplclist.py:63 revpiplclist.py:204 revpiprogram.py:394 #: revpiprogram.py:468 msgid "Question" msgstr "Frage" -#: aclmanager.py:78 revpilegacy.py:70 revpioption.py:74 revpiplclist.py:62 +#: aclmanager.py:78 revpilegacy.py:70 revpioption.py:74 revpiplclist.py:64 msgid "" "Do you really want to quit? \n" "Unsaved changes will be lost" @@ -58,7 +58,7 @@ msgstr "Eintrag entfernen" msgid "Edit acess control list" msgstr "Liste der Zugriffslevel bearbeiten" -#: aclmanager.py:147 revpiplclist.py:101 +#: aclmanager.py:147 revpiplclist.py:103 msgid "IP address" msgstr "IP Adresse" @@ -70,12 +70,12 @@ msgstr "in Liste einfügen" msgid "clear" msgstr "leeren" -#: aclmanager.py:260 revpilegacy.py:236 revpioption.py:263 revpiplclist.py:137 +#: aclmanager.py:260 revpilegacy.py:236 revpioption.py:263 revpiplclist.py:139 msgid "Save" msgstr "Speichern" #: aclmanager.py:265 revpiinfo.py:141 revpilegacy.py:241 revpioption.py:268 -#: revpiplclist.py:141 +#: revpiplclist.py:143 msgid "Close" msgstr "Schließen" @@ -90,14 +90,14 @@ msgstr "" "IP: {} / Level: {}" #: 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 +#: revpicheckclient.py:442 revpidevelop.py:210 revpidevelop.py:218 +#: revpidevelop.py:245 revpilegacy.py:319 revpioption.py:87 revpioption.py:346 +#: revpiplclist.py:228 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:645 revpiprogram.py:676 +#: revpiprogram.py:689 revpiprogram.py:748 revpiprogram.py:768 +#: revpiprogram.py:776 revpipycontrol.py:278 revpipycontrol.py:428 msgid "Error" msgstr "Fehler" @@ -145,8 +145,9 @@ msgstr "Aktualisiere Werte automatisch" 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:287 revpidevelop.py:277 revpiprogram.py:457 +#: revpipycontrol.py:257 revpipycontrol.py:304 revpipycontrol.py:338 +#: revpipycontrol.py:356 revpipycontrol.py:389 msgid "Warning" msgstr "Warnung" @@ -166,6 +167,59 @@ msgstr "" msgid "Error set value of device '{}' Output '{}': {} \n" msgstr "Fehler beim Setzen der Werte auf Device '{}' bei Output '{}': {} \n" +#: revpidevelop.py:117 +msgid "File watcher for PLC development" +msgstr "Dateiüberwachung für PLC Entwicklung" + +#: revpidevelop.py:122 +msgid "Path to list files:" +msgstr "Pfad für Dateiliste:" + +#: revpidevelop.py:127 +msgid "Select path" +msgstr "Pfad wählen" + +#: revpidevelop.py:157 +msgid "Stop / Upload / Start" +msgstr "Stoppen / Hochladen / Starten" + +#: revpidevelop.py:201 revpilegacy.py:274 revpilegacy.py:311 revpioption.py:300 +#: revpioption.py:338 revpiplclist.py:220 revpiprogram.py:98 +msgid "Information" +msgstr "Information" + +#: revpidevelop.py:202 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." + +#: revpidevelop.py:211 revpiprogram.py:769 +msgid "The Revolution Pi could not process some parts of the transmission." +msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten." + +#: revpidevelop.py:219 revpiprogram.py:777 +msgid "Errors occurred during transmission" +msgstr "Bei der Übertragung traten Fehler auf" + +#: revpidevelop.py:230 +msgid "Directory to watch" +msgstr "Ordner zum Überwachen" + +#: revpidevelop.py:246 +msgid "Can not open the selected folder." +msgstr "Kann gewählten Ordner nicht öffnen" + +#: revpidevelop.py:278 +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:41 msgid "RevPi Python PLC info" msgstr "RevPi Python PLC Information" @@ -285,11 +339,6 @@ msgstr "" 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 msgid "You have not made any changes to save." msgstr "Sie haben keine Änderungen zum Speichern vorgenommen." @@ -414,35 +463,35 @@ msgstr "+ PLC Programm hochladen" msgid "+ set properties" msgstr "+ Einstellungen ändern" -#: revpiplclist.py:72 +#: revpiplclist.py:74 msgid "RevPi Python PLC connections" msgstr "RevPi Python PLC Verbindungen" -#: revpiplclist.py:92 +#: revpiplclist.py:94 msgid "Name" msgstr "Name" -#: revpiplclist.py:110 +#: revpiplclist.py:112 msgid "Port" msgstr "Port" -#: revpiplclist.py:121 +#: revpiplclist.py:123 msgid "New" msgstr "Neu" -#: revpiplclist.py:125 +#: revpiplclist.py:127 msgid "Apply" msgstr "Übernehmen" -#: revpiplclist.py:130 +#: revpiplclist.py:132 msgid "Remove" msgstr "Entfernen" -#: revpiplclist.py:198 +#: revpiplclist.py:205 msgid "Do you really want to delete the selected connection '{}'?" msgstr "Wollen Sie die ausgewählte Verbindung '{}' wirklich löschen?" -#: revpiplclist.py:214 +#: revpiplclist.py:221 msgid "" "Successfully saved. \n" "Do you want to close this window?" @@ -450,18 +499,10 @@ msgstr "" "Verbindungen erfolgreich gespeichert. \n" "Möchten Sie dieses Fenster jetzt schließen?" -#: revpiplclist.py:222 +#: revpiplclist.py:229 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 msgid "RevPi Python PLC program" msgstr "RevPi Python PLC Programm" @@ -476,12 +517,12 @@ msgid "Files" msgstr "Dateien" #: revpiprogram.py:132 revpiprogram.py:134 revpiprogram.py:515 -#: revpiprogram.py:624 +#: revpiprogram.py:629 msgid "Zip archive" msgstr "Zip Archiv" #: revpiprogram.py:132 revpiprogram.py:134 revpiprogram.py:528 -#: revpiprogram.py:654 +#: revpiprogram.py:659 msgid "TGZ archive" msgstr "TGZ Archiv" @@ -549,7 +590,7 @@ msgstr "piControlReset ausführen" msgid "execute" msgstr "ausführen" -#: revpiprogram.py:262 revpipycontrol.py:114 +#: revpiprogram.py:262 revpipycontrol.py:120 msgid "Exit" msgstr "Beenden" @@ -563,8 +604,8 @@ 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:515 revpiprogram.py:528 revpiprogram.py:600 +#: revpiprogram.py:629 revpiprogram.py:659 msgid "All files" msgstr "Alle Dateien" @@ -574,7 +615,7 @@ 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:738 msgid "Success" msgstr "Erfolgreich" @@ -665,108 +706,104 @@ msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden" msgid "Directory to save" msgstr "Verzeichnis zum speichern" -#: revpiprogram.py:609 +#: revpiprogram.py:610 msgid "Folder to upload" msgstr "Verzeichnis zum Hochladen" -#: revpiprogram.py:620 +#: revpiprogram.py:625 msgid "Upload Zip archive..." msgstr "Zip Archiv hochladen..." -#: revpiprogram.py:641 +#: revpiprogram.py:646 msgid "The specified file is not a ZIP archive." msgstr "Die angegebene Datei ist kein ZIP Archiv." -#: revpiprogram.py:650 +#: revpiprogram.py:655 msgid "Upload TarGz archiv..." msgstr "TarGz Archiv hochladen..." -#: revpiprogram.py:672 +#: revpiprogram.py:677 msgid "The specified file is not a TAR archive." msgstr "Die angegebene Datei ist kein TAR Archiv." -#: revpiprogram.py:685 +#: revpiprogram.py:690 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:739 msgid "The PLC program was transferred successfully." msgstr "Das PLC Programm wurde erfolgreich übertragen." -#: revpiprogram.py:740 +#: revpiprogram.py:749 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:118 msgid "Connections..." msgstr "Verbindungen..." -#: revpipycontrol.py:115 +#: revpipycontrol.py:121 msgid "Main" msgstr "Datei" -#: revpipycontrol.py:123 +#: revpipycontrol.py:129 msgid "Visit website..." msgstr "Webseite besuchen..." -#: revpipycontrol.py:125 +#: revpipycontrol.py:131 msgid "Info..." msgstr "Info..." -#: revpipycontrol.py:126 +#: revpipycontrol.py:132 msgid "Help" msgstr "Hilfe" -#: revpipycontrol.py:134 +#: revpipycontrol.py:145 msgid "PLC start" msgstr "PLC Start" -#: revpipycontrol.py:139 +#: revpipycontrol.py:150 msgid "PLC stop" msgstr "PLC Stopp" -#: revpipycontrol.py:144 +#: revpipycontrol.py:155 msgid "PLC restart" msgstr "PLC Neustart" -#: revpipycontrol.py:149 +#: revpipycontrol.py:160 msgid "PLC logs" msgstr "PLC Logs" -#: revpipycontrol.py:160 +#: revpipycontrol.py:171 msgid "PLC watch mode" msgstr "PLC watch Modus" -#: revpipycontrol.py:177 +#: revpipycontrol.py:188 msgid "PLC log..." msgstr "PLC Log..." -#: revpipycontrol.py:179 +#: revpipycontrol.py:190 msgid "PLC options..." msgstr "PLC Optionen..." -#: revpipycontrol.py:181 +#: revpipycontrol.py:192 msgid "PLC program..." msgstr "PLC Programm..." -#: revpipycontrol.py:185 +#: revpipycontrol.py:194 +msgid "PLC developer..." +msgstr "PLC Entwickler..." + +#: revpipycontrol.py:198 msgid "Disconnect" msgstr "Trennen" -#: revpipycontrol.py:190 +#: revpipycontrol.py:203 msgid "Connect" msgstr "Verbinden" -#: revpipycontrol.py:245 +#: revpipycontrol.py:258 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 " @@ -776,7 +813,7 @@ msgstr "" "mindestens Version 0.5.3 installiert sein! Stellen Sie sicher, dass auch " "python3-revpimodio2 auf dem RevPi installiert ist." -#: revpipycontrol.py:264 +#: revpipycontrol.py:279 msgid "" "Can not load piCtory configuration. \n" "Did you create a hardware configuration? Please check this in piCtory!" @@ -784,15 +821,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:305 revpipycontrol.py:357 revpipycontrol.py:390 msgid "" "XML-RPC access mode in the RevPiPyLoad configuration is too small to access " "this dialog!" @@ -800,7 +829,15 @@ msgstr "" "Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um " "diesen Dialog zu verwenden!" -#: revpipycontrol.py:391 +#: revpipycontrol.py:339 +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:429 msgid "" "Can not connect to RevPi XML-RPC Service! \n" "\n" From 0fc9af633c31a5b5fe8770759fd5b18060e04d79 Mon Sep 17 00:00:00 2001 From: NaruX Date: Sun, 12 Aug 2018 16:57:08 +0200 Subject: [PATCH 6/9] Dateiliste sortiert ausgeben New code style --- doc/aclmanager.html | 2 +- doc/index-revpipycontrol.shared.html | 4 +- doc/index.html | 2 +- doc/mytools.html | 2 +- doc/revpicheckclient.html | 2 +- doc/revpidevelop.html | 2 +- doc/revpiinfo.html | 2 +- doc/revpilegacy.html | 2 +- doc/revpilogfile.html | 2 +- doc/revpioption.html | 2 +- doc/revpiplclist.html | 2 +- doc/revpiprogram.html | 2 +- doc/revpipycontrol.html | 2 +- doc/revpipycontrol.shared.ipaclmanager.html | 2 +- eric-revpipycontrol.api | 41 ++++- revpipycontrol.e4p | 161 +++++++++++++++++--- revpipycontrol/aclmanager.py | 23 ++- revpipycontrol/mytools.py | 11 +- revpipycontrol/revpicheckclient.py | 37 +++-- revpipycontrol/revpidevelop.py | 19 ++- revpipycontrol/revpiinfo.py | 13 +- revpipycontrol/revpilegacy.py | 35 +++-- revpipycontrol/revpilogfile.py | 15 +- revpipycontrol/revpioption.py | 39 +++-- revpipycontrol/revpiplclist.py | 37 +++-- revpipycontrol/revpiprogram.py | 21 ++- revpipycontrol/revpipycontrol.py | 37 +++-- revpipycontrol/shared/__init__.py | 5 + revpipycontrol/shared/ipaclmanager.py | 17 +-- setup.py | 7 +- 30 files changed, 351 insertions(+), 197 deletions(-) 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 71f598e..82b0367 100644 --- a/doc/index.html +++ b/doc/index.html @@ -13,7 +13,7 @@ Packages

- +
sharedShared modules.
diff --git a/doc/mytools.html b/doc/mytools.html index 0511c04..1dd78e8 100644 --- a/doc/mytools.html +++ b/doc/mytools.html @@ -12,7 +12,7 @@ Tools-Sammlung.

Global Attributes

- +
savefile_connections
savefile_developer
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 index 9c74a42..b4b4a25 100644 --- a/doc/revpidevelop.html +++ b/doc/revpidevelop.html @@ -10,7 +10,7 @@ revpidevelop

Global Attributes

- +
_
_
__author__
__copyright__
__license__

Classes

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 2100484..81ad05d 100644 --- a/doc/revpipycontrol.html +++ b/doc/revpipycontrol.html @@ -10,7 +10,7 @@ revpipycontrol

Global Attributes

- +
_
pycontrolversion
_
__author__
__copyright__
__license__
__version__

Classes

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 e48d393..d8723c2 100644 --- a/eric-revpipycontrol.api +++ b/eric-revpipycontrol.api @@ -18,6 +18,12 @@ 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 @@ -44,6 +50,9 @@ 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 @@ -56,6 +65,9 @@ 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) @@ -63,6 +75,9 @@ 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() @@ -73,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) @@ -82,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() @@ -93,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() @@ -107,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() @@ -122,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() @@ -149,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() @@ -163,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/revpipycontrol.e4p b/revpipycontrol.e4p index 40f271f..c547970 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,33 +1,32 @@ - + en_US 66103e2eaf8a762f14d1fd51d8b1c9dcaf35a275 Python3 Console - 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/revpidevelop.py + revpipycontrol/shared/ipaclmanager.py + setup.py @@ -36,8 +35,8 @@ data doc - stdeb.cfg eric-revpipycontrol.api + stdeb.cfg revpipycontrol/revpipycontrol.py @@ -142,9 +141,6 @@ - - - @@ -244,14 +240,6 @@ False - - sourceExtensions - - - - - - useRecursion @@ -266,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/mytools.py b/revpipycontrol/mytools.py index 4356578..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 diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py index f75b103..5b475a1 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] ) @@ -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: @@ -390,7 +395,7 @@ class RevPiCheckClient(tkinter.Frame): if not self.autorw.get(): try: self.chk_auto["state"] = "normal" - except: + except Exception: pass return None @@ -436,7 +441,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 != "": tkmsg.showerror(_("Error"), str_errmsg) diff --git a/revpipycontrol/revpidevelop.py b/revpipycontrol/revpidevelop.py index 8fa8cdb..349c301 100644 --- a/revpipycontrol/revpidevelop.py +++ b/revpipycontrol/revpidevelop.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 @@ -53,7 +52,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 @@ -186,7 +185,7 @@ class RevPiDevelop(ttk.Frame): ustatus = self.xmlcli.plcupload( Binary(gzip.compress(fh.read())), sendname ) - except: + except Exception: ec = -2 break @@ -258,7 +257,7 @@ class RevPiDevelop(ttk.Frame): # Dateiliste erstellen filecount = 0 for tup_walk in os.walk(self.watchpath): - for filename in tup_walk[2]: + for filename in sorted(tup_walk[2]): fullname = os.path.join(tup_walk[0], filename) self.trv_files.insert( "", "end", fullname, @@ -286,7 +285,7 @@ class RevPiDevelop(ttk.Frame): for watchfile in self.watchfiles.copy(): try: self.trv_files.item(watchfile) - except: + except Exception: self.watchfiles.remove(watchfile) self.trv_files.selection_set(self.watchfiles) 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 acb384e..2f5f076 100644 --- a/revpipycontrol/revpiplclist.py +++ b/revpipycontrol/revpiplclist.py @@ -1,11 +1,10 @@ # -*- 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 @@ -152,20 +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 = developloaddefaults() - 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] - developsavedefaults(None, dict) - dict = programloaddefaults() - for revpi in tuple(dict.keys()): + 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[revpi] - programsavedefaults(None, dict) + del dict_o[revpi] + programsavedefaults(None, dict_o) return True @@ -202,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 ) @@ -250,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 d9e00e8..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 @@ -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"), @@ -725,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 1a5d023..befddc8 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -1,13 +1,12 @@ #!/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 @@ -26,8 +25,6 @@ from xmlrpc.client import ServerProxy # Übersetzung laden _ = gettrans() -pycontrolversion = "0.7.0" - class RevPiPyControl(tkinter.Frame): @@ -92,7 +89,7 @@ class RevPiPyControl(tkinter.Frame): self.debugframe = None try: self.cli.psstop() - except: + except Exception: pass def _closeapp(self, event=None): @@ -212,7 +209,7 @@ class RevPiPyControl(tkinter.Frame): socket.setdefaulttimeout(2) sp = ServerProxy( - "http://{}:{}".format( + "http://{0}:{1}".format( self.dict_conn[text][0], int(self.dict_conn[text][1]) ) ) @@ -221,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(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") @@ -242,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() @@ -255,7 +252,7 @@ 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." @@ -273,7 +270,7 @@ class RevPiPyControl(tkinter.Frame): self.debugframe = revpicheckclient.RevPiCheckClient( self.main_frame, self.cli, self.xmlmode ) - except: + except Exception: tkmsg.showwarning( _("Error"), _("Can not load piCtory configuration. \n" @@ -336,7 +333,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 @@ -442,7 +439,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 cbed974..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 From ef912fa9079bcc78fbdd98f0e509c80663773401 Mon Sep 17 00:00:00 2001 From: NaruX Date: Sun, 12 Aug 2018 17:07:32 +0200 Subject: [PATCH 7/9] ?bersetzungen --- .../locale/de/LC_MESSAGES/revpipycontrol.po | 435 +++++++++--------- 1 file changed, 221 insertions(+), 214 deletions(-) diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po index 90459c7..79a0bb4 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-08-02 14:50+0200\n" -"PO-Revision-Date: 2018-08-02 14:53+0200\n" +"POT-Creation-Date: 2018-08-12 17:06+0200\n" +"PO-Revision-Date: 2018-08-12 17:06+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:63 revpiplclist.py:204 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:64 +#: 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,124 +34,126 @@ 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:103 +#: 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:139 +#: 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:143 +#: 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 revpidevelop.py:210 revpidevelop.py:218 -#: revpidevelop.py:245 revpilegacy.py:319 revpioption.py:87 revpioption.py:346 -#: revpiplclist.py:228 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:645 revpiprogram.py:676 -#: revpiprogram.py:689 revpiprogram.py:748 revpiprogram.py:768 -#: revpiprogram.py:776 revpipycontrol.py:278 revpipycontrol.py:428 +#: aclmanager.py:291 aclmanager.py:367 revpicheckclient.py:112 +#: revpicheckclient.py:447 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:275 revpipycontrol.py:425 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 revpidevelop.py:277 revpiprogram.py:457 -#: revpipycontrol.py:257 revpipycontrol.py:304 revpipycontrol.py:338 -#: revpipycontrol.py:356 revpipycontrol.py:389 +#: revpicheckclient.py:292 revpidevelop.py:276 revpiprogram.py:456 +#: revpipycontrol.py:254 revpipycontrol.py:301 revpipycontrol.py:335 +#: revpipycontrol.py:353 revpipycontrol.py:386 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" @@ -163,32 +165,33 @@ 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:444 +#, 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:117 +#: revpidevelop.py:116 msgid "File watcher for PLC development" msgstr "Dateiüberwachung für PLC Entwicklung" -#: revpidevelop.py:122 +#: revpidevelop.py:121 msgid "Path to list files:" msgstr "Pfad für Dateiliste:" -#: revpidevelop.py:127 +#: revpidevelop.py:126 msgid "Select path" msgstr "Pfad wählen" -#: revpidevelop.py:157 +#: revpidevelop.py:156 msgid "Stop / Upload / Start" msgstr "Stoppen / Hochladen / Starten" -#: revpidevelop.py:201 revpilegacy.py:274 revpilegacy.py:311 revpioption.py:300 -#: revpioption.py:338 revpiplclist.py:220 revpiprogram.py:98 +#: 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:202 revpiprogram.py:99 +#: 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." @@ -196,23 +199,23 @@ msgstr "" "Ein PLC Programm wurde hochgeladen. Bitte prüfen Sie die PLC Optionen, ob " "dort das richtige Programm als Startprogramm angegeben ist." -#: revpidevelop.py:211 revpiprogram.py:769 +#: 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:219 revpiprogram.py:777 +#: revpidevelop.py:218 revpiprogram.py:776 msgid "Errors occurred during transmission" msgstr "Bei der Übertragung traten Fehler auf" -#: revpidevelop.py:230 +#: revpidevelop.py:229 msgid "Directory to watch" msgstr "Ordner zum Überwachen" -#: revpidevelop.py:246 +#: revpidevelop.py:245 msgid "Can not open the selected folder." msgstr "Kann gewählten Ordner nicht öffnen" -#: revpidevelop.py:278 +#: revpidevelop.py:277 msgid "" "Found more than 1000 files! Only 1000 files can be shown in this dialog, all " "other will be ignored." @@ -220,27 +223,28 @@ msgstr "" "Mehr als 1000 Dateien gefunden! Es werden nur 1000 Dateien in diesem Dialog " "angezeigt, der Rest wird ignoriert." -#: revpiinfo.py:41 +#: 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" @@ -263,63 +267,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" @@ -327,7 +331,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" @@ -335,15 +339,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: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" @@ -355,17 +359,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." @@ -373,55 +377,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" @@ -435,63 +439,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:74 +#: revpiplclist.py:73 msgid "RevPi Python PLC connections" msgstr "RevPi Python PLC Verbindungen" -#: revpiplclist.py:94 +#: revpiplclist.py:93 msgid "Name" msgstr "Name" -#: revpiplclist.py:112 +#: revpiplclist.py:111 msgid "Port" msgstr "Port" -#: revpiplclist.py:123 +#: revpiplclist.py:122 msgid "New" msgstr "Neu" -#: revpiplclist.py:127 +#: revpiplclist.py:126 msgid "Apply" msgstr "Übernehmen" -#: revpiplclist.py:132 +#: revpiplclist.py:131 msgid "Remove" msgstr "Entfernen" -#: revpiplclist.py:205 -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:221 +#: revpiplclist.py:220 msgid "" "Successfully saved. \n" "Do you want to close this window?" @@ -499,139 +504,139 @@ msgstr "" "Verbindungen erfolgreich gespeichert. \n" "Möchten Sie dieses Fenster jetzt schließen?" -#: revpiplclist.py:229 +#: revpiplclist.py:228 msgid "Failed to save connections" msgstr "Verbindungen konnten nicht gespeichert werden" -#: 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:629 +#: 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:659 +#: 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:120 +#: 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:600 -#: revpiprogram.py:629 revpiprogram.py:659 +#: 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:738 +#: 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?" @@ -639,7 +644,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." @@ -647,20 +652,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!" @@ -668,17 +673,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!" @@ -686,7 +691,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 !!!" @@ -694,126 +699,127 @@ 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" -#: revpiprogram.py:610 +#: revpiprogram.py:609 msgid "Folder to upload" msgstr "Verzeichnis zum Hochladen" -#: revpiprogram.py:625 +#: revpiprogram.py:624 msgid "Upload Zip archive..." msgstr "Zip Archiv hochladen..." -#: revpiprogram.py:646 +#: revpiprogram.py:645 msgid "The specified file is not a ZIP archive." msgstr "Die angegebene Datei ist kein ZIP Archiv." -#: revpiprogram.py:655 +#: revpiprogram.py:654 msgid "Upload TarGz archiv..." msgstr "TarGz Archiv hochladen..." -#: revpiprogram.py:677 +#: revpiprogram.py:676 msgid "The specified file is not a TAR archive." msgstr "Die angegebene Datei ist kein TAR Archiv." -#: revpiprogram.py:690 +#: 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:739 +#: revpiprogram.py:738 msgid "The PLC program was transferred successfully." msgstr "Das PLC Programm wurde erfolgreich übertragen." -#: revpiprogram.py:749 +#: revpiprogram.py:748 msgid "There is no piCtory configuration in this archive." msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden." -#: revpipycontrol.py:118 +#: revpipycontrol.py:115 msgid "Connections..." msgstr "Verbindungen..." -#: revpipycontrol.py:121 +#: revpipycontrol.py:118 msgid "Main" msgstr "Datei" -#: revpipycontrol.py:129 +#: revpipycontrol.py:126 msgid "Visit website..." msgstr "Webseite besuchen..." -#: revpipycontrol.py:131 +#: revpipycontrol.py:128 msgid "Info..." msgstr "Info..." -#: revpipycontrol.py:132 +#: revpipycontrol.py:129 msgid "Help" msgstr "Hilfe" -#: revpipycontrol.py:145 +#: revpipycontrol.py:142 msgid "PLC start" msgstr "PLC Start" -#: revpipycontrol.py:150 +#: revpipycontrol.py:147 msgid "PLC stop" msgstr "PLC Stopp" -#: revpipycontrol.py:155 +#: revpipycontrol.py:152 msgid "PLC restart" msgstr "PLC Neustart" -#: revpipycontrol.py:160 +#: revpipycontrol.py:157 msgid "PLC logs" msgstr "PLC Logs" -#: revpipycontrol.py:171 +#: revpipycontrol.py:168 msgid "PLC watch mode" msgstr "PLC watch Modus" -#: revpipycontrol.py:188 +#: revpipycontrol.py:185 msgid "PLC log..." msgstr "PLC Log..." -#: revpipycontrol.py:190 +#: revpipycontrol.py:187 msgid "PLC options..." msgstr "PLC Optionen..." -#: revpipycontrol.py:192 +#: revpipycontrol.py:189 msgid "PLC program..." msgstr "PLC Programm..." -#: revpipycontrol.py:194 +#: revpipycontrol.py:191 msgid "PLC developer..." msgstr "PLC Entwickler..." -#: revpipycontrol.py:198 +#: revpipycontrol.py:195 msgid "Disconnect" msgstr "Trennen" -#: revpipycontrol.py:203 +#: revpipycontrol.py:200 msgid "Connect" msgstr "Verbinden" -#: revpipycontrol.py:258 +#: 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:279 +#: revpipycontrol.py:276 msgid "" "Can not load piCtory configuration. \n" "Did you create a hardware configuration? Please check this in piCtory!" @@ -821,7 +827,7 @@ msgstr "" "Kann piCtory Konfiguration nicht laden\n" "Wurde eine Hardwarekonfiguration erstellt? Bitte in piCtory prüfen!" -#: revpipycontrol.py:305 revpipycontrol.py:357 revpipycontrol.py:390 +#: revpipycontrol.py:302 revpipycontrol.py:354 revpipycontrol.py:387 msgid "" "XML-RPC access mode in the RevPiPyLoad configuration is too small to access " "this dialog!" @@ -829,15 +835,16 @@ msgstr "" "Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um " "diesen Dialog zu verwenden!" -#: revpipycontrol.py:339 +#: revpipycontrol.py:336 +#, python-brace-format msgid "" -"This version of Logviewer ist not supported in version {} of RevPiPyLoad on " +"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 {} auf Ihrem " -"RevPi nicht unterstützt! Sie benötigen mindestens Version 0.4.1." +"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:429 +#: revpipycontrol.py:426 msgid "" "Can not connect to RevPi XML-RPC Service! \n" "\n" From 7d3957a9d196cbf708b4f1cbd841cfa0091b5695 Mon Sep 17 00:00:00 2001 From: NaruX Date: Tue, 14 Aug 2018 08:53:56 +0200 Subject: [PATCH 8/9] Fehlerabfang f?r Watch-Mode verbessert --- revpipycontrol/revpicheckclient.py | 15 ++++++++++++++- revpipycontrol/revpipycontrol.py | 9 ++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py index f75b103..454fa8b 100644 --- a/revpipycontrol/revpicheckclient.py +++ b/revpipycontrol/revpicheckclient.py @@ -318,9 +318,21 @@ class RevPiCheckClient(tkinter.Frame): self.err_workvalues = self.max_errors if self.err_workvalues >= self.max_errors: + # Fenster zerstören bei zu vielen Fehlern self.hideallwindows() + if self.autorw.get(): + self.autorw.set(False) + self.toggleauto() + self.dowrite.set(False) self.pack_forget() + tkmsg.showerror( + _("Error"), + _("To many errors while reading IO data. " + "Can not show the Watch-Mode."), + parent=self.master + ) + return None # Multicall zum Schreiben vorbereiten @@ -438,8 +450,9 @@ class RevPiCheckClient(tkinter.Frame): str_errmsg += _( "Error set value of device '{}' Output '{}': {} \n" ).format(devicename, lst_result[1], lst_result[3]) + if str_errmsg != "": - tkmsg.showerror(_("Error"), str_errmsg) + tkmsg.showerror(_("Error"), str_errmsg, parent=self.master) def writevalues(self): u"""Schreibt geänderte Outputs auf den RevPi.""" diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 3c424eb..78da44e 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -251,9 +251,7 @@ class RevPiPyControl(tkinter.Frame): ) else: # Debugfenster laden - if self.debugframe is None \ - or self.debugframe.err_workvalues >= \ - self.debugframe.max_errors: + if self.debugframe is None: try: self.debugframe = revpicheckclient.RevPiCheckClient( self, self.cli, self.xmlmode @@ -269,6 +267,11 @@ class RevPiPyControl(tkinter.Frame): self.btn_debug["state"] = "normal" return None + # Fehler prüfen + if self.debugframe.err_workvalues >= self.debugframe.max_errors: + self.debugframe = None + return None + # Show/Hide wechseln if self.debugframe.winfo_viewable(): self.debugframe.hideallwindows() From 220de037747dbafd6fb8d43ffeb3698f36d76bfd Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 3 Sep 2018 12:20:18 +0200 Subject: [PATCH 9/9] Programme auf RevPi sortiert anzeigen --- revpipycontrol/revpioption.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py index ac31a2d..4b85f47 100644 --- a/revpipycontrol/revpioption.py +++ b/revpipycontrol/revpioption.py @@ -190,8 +190,11 @@ class RevPiOption(tkinter.Frame): # Row 3 lst = self.xmlcli.get_filelist() + lst.sort() if len(lst) == 0: lst.append("none") + if ".placeholder" in lst: + lst.remove(".placeholder") opt_startpy = tkinter.OptionMenu( prog, self.var_startpy, *lst )