From 256a95aa8b0313b12b8f97b8e24d300c29280cc2 Mon Sep 17 00:00:00 2001 From: NaruX Date: Fri, 30 Jun 2017 21:06:06 +0200 Subject: [PATCH] Buxfix: mkstemp Umstellung R?ckmeldungen bei piCtory Konfiguration detailierter Info-Fenster eingebunden --- doc/mytools.html | 59 +++++ doc/revpiinfo.html | 99 ++++++++ doc/revpilogfile.html | 19 +- doc/revpiplclist.html | 53 +++-- doc/revpipycontrol.html | 6 +- revpipycontrol.api | 12 +- .../locale/de/LC_MESSAGES/revpipycontrol.po | 220 ++++++++++++------ revpipycontrol/revpicheckclient.py | 2 +- revpipycontrol/revpiinfo.py | 150 ++++++++++++ revpipycontrol/revpilogfile.py | 6 +- revpipycontrol/revpiplclist.py | 19 +- revpipycontrol/revpiprogram.py | 41 +++- revpipycontrol/revpipycontrol.py | 4 +- 13 files changed, 568 insertions(+), 122 deletions(-) create mode 100644 doc/mytools.html create mode 100644 doc/revpiinfo.html create mode 100644 revpipycontrol/revpiinfo.py diff --git a/doc/mytools.html b/doc/mytools.html new file mode 100644 index 0000000..f7b99f6 --- /dev/null +++ b/doc/mytools.html @@ -0,0 +1,59 @@ + + +mytools + + + +

+mytools

+ +

+Global Attributes

+ + +
None
+

+Classes

+ + +
None
+

+Functions

+ + + + + + + + +
addrootHängt root-dir der Anwendung vor Dateinamen.
gettrans
+

+ +

addroot

+addroot(filename) +

+Hängt root-dir der Anwendung vor Dateinamen. +

+ Je nach Ausführungsart der Anwendung muss das root-dir über + andere Arten abgerufen werden. +

+
filename:
+
+Datei oder Ordnername +
+
+
Returns:
+
+root dir +
+
+
Up
+

+ +

gettrans

+gettrans(proglang=None) + +
Up
+
+ \ No newline at end of file diff --git a/doc/revpiinfo.html b/doc/revpiinfo.html new file mode 100644 index 0000000..3ff9473 --- /dev/null +++ b/doc/revpiinfo.html @@ -0,0 +1,99 @@ + + +revpiinfo + + + +

+revpiinfo

+ +

+Global Attributes

+ + +
_
+

+Classes

+ + + + + +
RevPiInfo
+

+Functions

+ + +
None
+

+ +

RevPiInfo

+ +

+Derived from

+tkinter.Frame +

+Class Attributes

+ + +
app
cli
root
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + + + + + + + + + + +
RevPiInfoInit RevPiLogfile-Class.
_checkclosePrüft ob Fenster beendet werden soll.
_createwidgetsErstellt alle Widgets.
visitwebsiteÖffnet auf dem System einen Webbrowser zur Projektseite.
+

+Static Methods

+ + +
None
+ +

+RevPiInfo (Constructor)

+RevPiInfo(master, xmlcli, version) +

+Init RevPiLogfile-Class. +

+

+RevPiInfo._checkclose

+_checkclose(event=None) +

+Prüft ob Fenster beendet werden soll. +

+
event:
+
+tkinter-Event +
+
+

+RevPiInfo._createwidgets

+_createwidgets(extended=False) +

+Erstellt alle Widgets. +

+

+RevPiInfo.visitwebsite

+visitwebsite(event=None) +

+Öffnet auf dem System einen Webbrowser zur Projektseite. +

+
Up
+
+ \ No newline at end of file diff --git a/doc/revpilogfile.html b/doc/revpilogfile.html index 79fb54b..ce4abb1 100644 --- a/doc/revpilogfile.html +++ b/doc/revpilogfile.html @@ -49,8 +49,8 @@ Methods RevPiLogfile Init RevPiLogfile-Class. -_closewin - +_checkclose +Prüft ob Fenster beendet werden soll. _createwidgets Erstellt alle Widgets. @@ -82,11 +82,18 @@ RevPiLogfile (Constructor) RevPiLogfile(master, xmlcli)

Init RevPiLogfile-Class. -

+

-RevPiLogfile._closewin

-_closewin(event) - +RevPiLogfile._checkclose +_checkclose(event=None) +

+Prüft ob Fenster beendet werden soll. +

+
event:
+
+tkinter-Event +
+

RevPiLogfile._createwidgets

_createwidgets() diff --git a/doc/revpiplclist.html b/doc/revpiplclist.html index b7c66e1..cd2168b 100644 --- a/doc/revpiplclist.html +++ b/doc/revpiplclist.html @@ -25,7 +25,7 @@ Functions - +
get_connectionsVerbindungen aus Datei laden.


@@ -50,22 +50,19 @@ Methods - + - + - - - - + - + - + @@ -95,27 +92,43 @@ Static Methods

RevPiPlcList (Constructor)

RevPiPlcList(master) - +

+Init RevPiPlcList-class. +

+
master:
+
+tkinter master +
+

RevPiPlcList._checkclose

_checkclose(event=None) - +

+Prüft ob Fenster beendet werden soll. +

+
event:
+
+tkinter-Event +
+

RevPiPlcList._createwidgets

_createwidgets() - -

-RevPiPlcList._loadappdata

-_loadappdata() - +

+Erstellt alle Widgets. +

RevPiPlcList._saveappdata

_saveappdata() - +

+Speichert Verbindungen im home Dir. +

RevPiPlcList.build_listconn

build_listconn() - +

+Füllt Verbindungsliste. +

RevPiPlcList.evt_btnadd

evt_btnadd() @@ -145,7 +158,9 @@ RevPiPlcList.evt_listconn

get_connections

get_connections() - +

+Verbindungen aus Datei laden. +

Up

\ No newline at end of file diff --git a/doc/revpipycontrol.html b/doc/revpipycontrol.html index 819a6c4..e66a046 100644 --- a/doc/revpipycontrol.html +++ b/doc/revpipycontrol.html @@ -10,7 +10,7 @@ revpipycontrol

Global Attributes

RevPiPlcListInit RevPiPlcList-class.
_checkclosePrüft ob Fenster beendet werden soll.
_createwidgets
_loadappdataErstellt alle Widgets.
_saveappdataSpeichert Verbindungen im home Dir.
build_listconnFüllt Verbindungsliste.
evt_btnadd
- +
_
_
pycontrolversion

Classes

@@ -71,7 +71,7 @@ Methods infowindow -Öffnet das Fenster für die Verbindungen. +Öffnet das Fenster für die Info. plcdebug Baut den Debugframe und packt ihn. @@ -176,7 +176,7 @@ RevPiPyControl._opt_conn RevPiPyControl.infowindow infowindow()

-Öffnet das Fenster für die Verbindungen. +Öffnet das Fenster für die Info.

RevPiPyControl.plcdebug

diff --git a/revpipycontrol.api b/revpipycontrol.api index 91279e4..b0b3957 100644 --- a/revpipycontrol.api +++ b/revpipycontrol.api @@ -19,13 +19,15 @@ revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist) revpicheckclient.RevPiCheckClient.writevalues?4() revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0) revpicheckclient._?8 -revpiinfo.RevPiInfo._closewin?5(event=None) -revpiinfo.RevPiInfo._createwidgets?5() +revpiinfo.RevPiInfo._checkclose?5(event=None) +revpiinfo.RevPiInfo._createwidgets?5(extended=False) revpiinfo.RevPiInfo.app?7 +revpiinfo.RevPiInfo.cli?7 revpiinfo.RevPiInfo.root?7 -revpiinfo.RevPiInfo?1(master) +revpiinfo.RevPiInfo.visitwebsite?4(event=None) +revpiinfo.RevPiInfo?1(master, xmlcli, version) revpiinfo._?8 -revpilogfile.RevPiLogfile._closewin?5(event) +revpilogfile.RevPiLogfile._checkclose?5(event=None) revpilogfile.RevPiLogfile._createwidgets?5() revpilogfile.RevPiLogfile._load_log?5(textwidget, xmlcall, startposition, full) revpilogfile.RevPiLogfile.btn_clearapp?4() @@ -45,7 +47,6 @@ revpioption.RevPiOption?1(master, xmlcli, xmlmode) revpioption._?8 revpiplclist.RevPiPlcList._checkclose?5(event=None) revpiplclist.RevPiPlcList._createwidgets?5() -revpiplclist.RevPiPlcList._loadappdata?5() revpiplclist.RevPiPlcList._saveappdata?5() revpiplclist.RevPiPlcList.build_listconn?4() revpiplclist.RevPiPlcList.evt_btnadd?4() @@ -101,3 +102,4 @@ revpipycontrol.RevPiPyControl.tmr_plcrunning?4() revpipycontrol.RevPiPyControl.visitwebsite?4() revpipycontrol.RevPiPyControl?1(master=None) revpipycontrol._?8 +revpipycontrol.pycontrolversion?7 diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po index 521bfb6..493f953 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: 2017-06-30 13:50+0200\n" -"PO-Revision-Date: 2017-06-30 13:50+0200\n" +"POT-Creation-Date: 2017-06-30 21:05+0200\n" +"PO-Revision-Date: 2017-06-30 21:05+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de\n" @@ -16,11 +16,12 @@ msgstr "" "X-Poedit-SearchPath-0: .\n" #: revpicheckclient.py:103 revpicheckclient.py:395 revpioption.py:288 -#: revpiplclist.py:198 revpiprogram.py:306 revpiprogram.py:337 -#: revpiprogram.py:400 revpiprogram.py:433 revpiprogram.py:515 -#: revpiprogram.py:587 revpiprogram.py:618 revpiprogram.py:631 -#: revpiprogram.py:686 revpiprogram.py:706 revpiprogram.py:714 -#: revpipycontrol.py:342 +#: revpiplclist.py:199 revpiprogram.py:306 revpiprogram.py:337 +#: revpiprogram.py:401 revpiprogram.py:407 revpiprogram.py:413 +#: revpiprogram.py:421 revpiprogram.py:427 revpiprogram.py:460 +#: revpiprogram.py:544 revpiprogram.py:616 revpiprogram.py:647 +#: revpiprogram.py:660 revpiprogram.py:715 revpiprogram.py:735 +#: revpiprogram.py:743 revpipycontrol.py:342 msgid "Error" msgstr "Fehler" @@ -60,7 +61,7 @@ msgstr "Aktualisiere automatisch" msgid "Write values to RevPi" msgstr "Schreibe Werte auf RevPi" -#: revpicheckclient.py:276 revpiprogram.py:407 revpipycontrol.py:228 +#: revpicheckclient.py:276 revpiprogram.py:434 revpipycontrol.py:228 #: revpipycontrol.py:267 revpipycontrol.py:285 revpipycontrol.py:303 msgid "Warning" msgstr "Warnung" @@ -81,32 +82,79 @@ msgstr "" msgid "Error set value of device '{}' Output '{}': {} \n" msgstr "Fehler beim Setzen auf Device '{}' bei Output '{}': {}\n" -#: revpilogfile.py:37 +#: revpiinfo.py:38 +msgid "RevPi Python PLC info" +msgstr "RevPi Python PLC Information" + +#: revpiinfo.py:51 +msgid "RevPi Python PLC - Control" +msgstr "RevPi Python PLC - Kontrollcenter" + +#: revpiinfo.py:55 +msgid "Version: {}" +msgstr "Version: {}" + +#: revpiinfo.py:78 +msgid "RevPiPyLoad version on RevPi:" +msgstr "RevPiPyLoad Version am RevPi:" + +#: revpiinfo.py:83 +msgid "not conn." +msgstr "nicht verb." + +#: revpiinfo.py:91 +msgid "" +"\n" +"RevPiModIO, RevPiPyLoad and RevPiPyControl\n" +"are community driven projects. They are all\n" +"free and open source software.\n" +"All of them comes with ABSOLUTELY NO\n" +"WARRANTY, to the extent permitted by \n" +"applicable law.\n" +"\n" +"\n" +"(c) Sven Sager, License: LGPLv3" +msgstr "" +"\n" +"RevPiModIO, RevPiPyLoad und RevPiPyControl\n" +"sind gemeinschaftsorientierte Projekte. Sie sind\n" +"alle frei und Open Source Software.\n" +"Alle kommen mit ABSOLUT KEINER\n" +"GARANTIE, soweit gesetzlich zulässig.\n" +"\n" +"\n" +"(c) Sven Sager, Lizenz: LGPLv3" + +#: revpiinfo.py:136 revpioption.py:225 revpiplclist.py:133 +msgid "Close" +msgstr "Schließen" + +#: revpilogfile.py:39 msgid "RevPi Python PLC Logs" msgstr "RevPi Python PLC Logdaten" -#: revpilogfile.py:50 +#: revpilogfile.py:52 msgid "RevPiPyLoad - Logfile" msgstr "RevPiPyLoad - Logdatei" -#: revpilogfile.py:54 revpilogfile.py:69 +#: revpilogfile.py:56 revpilogfile.py:71 msgid "Clear screen" msgstr "Leere Ansicht" -#: revpilogfile.py:65 +#: revpilogfile.py:67 msgid "Python PLC program - Logfile" msgstr "Python PLC Programm - Logdatei" -#: revpilogfile.py:145 +#: revpilogfile.py:147 msgid "Can not access log file on the RevPi" msgstr "RevPi kann auf Logdatei nicht zugreifen" -#: revpioption.py:61 revpioption.py:273 revpioption.py:298 revpiplclist.py:58 -#: revpiplclist.py:175 revpiprogram.py:370 revpiprogram.py:418 +#: revpioption.py:61 revpioption.py:273 revpioption.py:298 revpiplclist.py:62 +#: revpiplclist.py:176 revpiprogram.py:370 revpiprogram.py:445 msgid "Question" msgstr "Frage" -#: revpioption.py:62 revpiplclist.py:59 +#: revpioption.py:62 revpiplclist.py:63 msgid "" "Do you really want to quit? \n" "Unsaved changes will be lost" @@ -194,14 +242,10 @@ msgstr "" msgid "XML-RPC server port" msgstr "XML-RPC Serverport" -#: revpioption.py:220 revpiplclist.py:125 +#: revpioption.py:220 revpiplclist.py:130 msgid "Save" msgstr "Speichern" -#: revpioption.py:225 revpiplclist.py:128 -msgid "Close" -msgstr "Schließen" - #: revpioption.py:274 msgid "" "The settings are now saved on the Revolution Pi. \n" @@ -214,7 +258,7 @@ msgstr "" "Sollen die neuen Einstellungen sofort in Kraft treten?\n" "Dies bedeutet einen Neustart des Dienstes und des laufenden PLC-Programms!" -#: revpioption.py:282 revpiplclist.py:190 revpiprogram.py:65 +#: revpioption.py:282 revpiplclist.py:191 revpiprogram.py:65 msgid "Information" msgstr "Information" @@ -236,39 +280,39 @@ msgstr "" "Soll der XML-RPC Server wirklich beendet werden? Sie können dann NICHT mehr " "mit diesem Programm auf den Revolution Pi zugreifen." -#: revpiplclist.py:68 +#: revpiplclist.py:73 msgid "RevPi Python PLC connections" msgstr "RevPi Python PLC Verbindungen" -#: revpiplclist.py:88 +#: revpiplclist.py:93 msgid "Name" msgstr "Name" -#: revpiplclist.py:95 +#: revpiplclist.py:100 msgid "IP address" msgstr "IP Adresse" -#: revpiplclist.py:103 +#: revpiplclist.py:108 msgid "Port" msgstr "Port" -#: revpiplclist.py:112 +#: revpiplclist.py:117 msgid "New" msgstr "Neu" -#: revpiplclist.py:115 +#: revpiplclist.py:120 msgid "Apply" msgstr "Übernehmen" -#: revpiplclist.py:119 +#: revpiplclist.py:124 msgid "Remove" msgstr "Entfernen" -#: revpiplclist.py:176 +#: revpiplclist.py:177 msgid "Do you really want to delete the selected connection '{}'" msgstr "Wollen Sie die ausgewählte Verbindung '{}' wirklich löschen?" -#: revpiplclist.py:191 +#: revpiplclist.py:192 msgid "" "Successfully saved. \n" "Do you want to close this window?" @@ -276,7 +320,7 @@ msgstr "" "Verbindungen erfolgreich gespeichert. \n" "Möchten Sie dieses Fenster jetzt schließen?" -#: revpiplclist.py:199 +#: revpiplclist.py:200 msgid "Failed to save connections" msgstr "Verbindungen konnten nicht gespeichert werden" @@ -301,13 +345,13 @@ msgstr "PLC Python Programm" msgid "Files" msgstr "Dateien" -#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:465 -#: revpiprogram.py:571 +#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:492 +#: revpiprogram.py:600 msgid "Zip archive" msgstr "Zip Archiv" -#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:478 -#: revpiprogram.py:601 +#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:505 +#: revpiprogram.py:630 msgid "TGZ archive" msgstr "TGZ Archiv" @@ -379,8 +423,8 @@ msgstr "ausführen" msgid "Exit" msgstr "Beenden" -#: revpiprogram.py:296 revpiprogram.py:327 revpiprogram.py:461 -#: revpiprogram.py:474 +#: revpiprogram.py:296 revpiprogram.py:327 revpiprogram.py:488 +#: revpiprogram.py:501 msgid "Save as..." msgstr "Speichern unter..." @@ -389,22 +433,22 @@ msgid "piCtory config" msgstr "piCtory Konfiguration" #: revpiprogram.py:299 revpiprogram.py:330 revpiprogram.py:362 -#: revpiprogram.py:465 revpiprogram.py:478 revpiprogram.py:546 -#: revpiprogram.py:571 revpiprogram.py:601 +#: revpiprogram.py:492 revpiprogram.py:505 revpiprogram.py:575 +#: revpiprogram.py:600 revpiprogram.py:630 msgid "All files" msgstr "Alle Dateien" -#: revpiprogram.py:307 revpiprogram.py:338 revpiprogram.py:516 +#: revpiprogram.py:307 revpiprogram.py:338 revpiprogram.py:545 msgid "Could not load and save file!" msgstr "Datei konnte nicht geladen und gespeichert werden!" -#: revpiprogram.py:312 revpiprogram.py:343 revpiprogram.py:381 -#: revpiprogram.py:389 revpiprogram.py:427 revpiprogram.py:521 -#: revpiprogram.py:676 +#: revpiprogram.py:312 revpiprogram.py:343 revpiprogram.py:382 +#: revpiprogram.py:390 revpiprogram.py:454 revpiprogram.py:550 +#: revpiprogram.py:705 msgid "Success" msgstr "Erfolgreich" -#: revpiprogram.py:313 revpiprogram.py:344 revpiprogram.py:522 +#: revpiprogram.py:313 revpiprogram.py:344 revpiprogram.py:551 msgid "File successfully loaded and saved." msgstr "Dateien erfolgreich übertragen und gespeichert." @@ -424,25 +468,46 @@ msgstr "" "Soll nach dem Hochladen der piCtory Konfiguration ein Reset am piControl " "Treiber durchgeführt werden?" -#: revpiprogram.py:382 +#: revpiprogram.py:383 msgid "" "The transfer of the piCtory configuration and the reset of piControl have " -"been successfully executed" +"been successfully executed." msgstr "" "Die Übertragung der piCtory Konfiguration und der Reset von piControl wurden " -"erfolgreich ausgeführt" +"erfolgreich ausgeführt." -#: revpiprogram.py:390 -msgid "The piCtory configuration was successfully transferred" -msgstr "Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt" +#: revpiprogram.py:391 +msgid "The piCtory configuration was successfully transferred." +msgstr "" +"Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt." -#: revpiprogram.py:401 +#: revpiprogram.py:402 +msgid "Can not process the transferred file." +msgstr "Kann die übertragene Datei nicht verarbeiten." + +#: revpiprogram.py:408 +msgid "Can not find main elements in piCtory file." +msgstr "Kann Hauptelemente in datei nicht finden." + +#: revpiprogram.py:414 +msgid "" +"Contained devices could not be found on Revolution Pi. The configuration may " +"be from a newer piCtory version!" +msgstr "" +"Enthaltene Geräte konnten auf dem Revolution Pi nicht gefunden werden. " +"Möglicherweise stammt die Konfiguration von einer neueren piCtory Version." + +#: revpiprogram.py:422 +msgid "Could not load RAP catalog on Revolution Pi." +msgstr "Konnte Katalog auf nicht laden." + +#: revpiprogram.py:428 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:408 +#: revpiprogram.py:435 msgid "" "The piCtroy configuration has been saved successfully. \n" "An error occurred on piControl reset!" @@ -450,7 +515,7 @@ msgstr "" "Die piCtroy Konfiguration wurde erfolgreich gespeichert. \n" "Beim piControl Reset trat allerdings ein Fehler auf!" -#: revpiprogram.py:419 +#: revpiprogram.py:446 msgid "" "Are you sure to reset piControl? \n" "The process image and the piBridge are interrupted !!!" @@ -458,56 +523,56 @@ msgstr "" "Soll piControlReset wirklich durchgeführt werden? \n" "Das Prozessabbild und die Steuerung werden dann unterbrochen!!!" -#: revpiprogram.py:428 +#: revpiprogram.py:455 msgid "piControlReset executed successfully" msgstr "piControl Reset war erfolgreich" -#: revpiprogram.py:434 +#: revpiprogram.py:461 msgid "piControl reset could not be executed successfully" msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden" -#: revpiprogram.py:448 +#: revpiprogram.py:475 msgid "Directory to save" msgstr "Verzeichnis zum Ablegen" -#: revpiprogram.py:556 +#: revpiprogram.py:585 msgid "Folder to upload" msgstr "Verzeichnis zum Hochladen" -#: revpiprogram.py:567 +#: revpiprogram.py:596 msgid "Upload Zip archive..." msgstr "Zip Archiv hochladen..." -#: revpiprogram.py:588 +#: revpiprogram.py:617 msgid "The specified file is not a ZIP archive." msgstr "Die angegebene Datei ist kein ZIP Archiv" -#: revpiprogram.py:597 +#: revpiprogram.py:626 msgid "Upload TarGz archiv..." msgstr "TarGz Archiv hochladen..." -#: revpiprogram.py:619 +#: revpiprogram.py:648 msgid "The specified file is not a TAR archive." msgstr "Die angegebene Datei ist kein TAR Archiv." -#: revpiprogram.py:632 +#: revpiprogram.py:661 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:677 -msgid "The transfer was successful." -msgstr "Die Übertragung war erfolgreich." +#: revpiprogram.py:706 +msgid "The PLC program was transferred successfully." +msgstr "Das PLC Programm wurde erfolgreich übertragen." -#: revpiprogram.py:687 +#: revpiprogram.py:716 msgid "There is no piCtory configuration in this archive." msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden." -#: revpiprogram.py:707 +#: revpiprogram.py:736 msgid "The Revolution Pi could not process some parts of the transmission." msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten." -#: revpiprogram.py:715 +#: revpiprogram.py:744 msgid "Errors occurred during transmission" msgstr "Bei der Übertragung traten Fehler auf" @@ -599,6 +664,23 @@ msgstr "" msgid "Can not reach server!" msgstr "Server ist nicht erreichbar!" +#~ msgid "Quit" +#~ msgstr "Beenden" + +#~ msgid "The transfer was successful." +#~ msgstr "Die Übertragung war erfolgreich." + +#~ msgid "" +#~ "The transfer of the piCtory configuration and the reset of piControl have " +#~ "been successfully executed" +#~ msgstr "" +#~ "Die Übertragung der piCtory Konfiguration und der Reset von piControl " +#~ "wurden erfolgreich ausgeführt" + +#~ msgid "The piCtory configuration was successfully transferred" +#~ msgstr "" +#~ "Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt" + #~ msgid "Given value for Output '{}' is not valid! Reset to '{}'" #~ msgstr "" #~ "Angegebener Wert bei Output '{}' ist nicht gültig! Setze auf '{}' zurück" diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py index a9b4f27..9e4d429 100644 --- a/revpipycontrol/revpicheckclient.py +++ b/revpipycontrol/revpicheckclient.py @@ -12,7 +12,7 @@ import tkinter import tkinter.messagebox as tkmsg from mytools import gettrans from threading import Lock -from xmlrpc.client import ServerProxy, MultiCall +from xmlrpc.client import MultiCall # Übersetzung laden _ = gettrans() diff --git a/revpipycontrol/revpiinfo.py b/revpipycontrol/revpiinfo.py new file mode 100644 index 0000000..8b37be9 --- /dev/null +++ b/revpipycontrol/revpiinfo.py @@ -0,0 +1,150 @@ +# +# RevPiPyControl +# +# Webpage: https://revpimodio.org/revpipyplc/ +# (c) Sven Sager, License: LGPLv3 +# +# -*- coding: utf-8 -*- +import tkinter +import tkinter.font as tkf +import webbrowser +from mytools import gettrans + +# Übersetzung laden +_ = gettrans() + + +class RevPiInfo(tkinter.Frame): + + def __init__(self, master, xmlcli, version): + u"""Init RevPiLogfile-Class.""" + self.master = master + self.xmlcli = xmlcli + + # Systemvariablen + self.version = version + + # Fenster bauen + self._createwidgets() + + def _checkclose(self, event=None): + u"""Prüft ob Fenster beendet werden soll. + @param event: tkinter-Event""" + self.master.destroy() + + def _createwidgets(self, extended=False): + u"""Erstellt alle Widgets.""" + super().__init__(self.master) + self.master.wm_title(_("RevPi Python PLC info")) + self.master.bind("", self._checkclose) + self.master.resizable(False, False) + self.pack(fill="both", expand=True) + + # Fonts laden + fntlarge = tkf.Font(size=20, weight="bold") + fntmid = tkf.Font(size=15) + fntbold = tkf.Font(size=10, weight="bold") + + # Kopfdaten + lbl = tkinter.Label(self) + lbl["font"] = fntlarge + lbl["text"] = _("RevPi Python PLC - Control") + lbl.pack(pady=5) + lbl = tkinter.Label(self) + lbl["font"] = fntmid + lbl["text"] = _("Version: {}").format(self.version) + lbl.bind( + "", + lambda event: self._createwidgets(extended=not extended) + ) + lbl.pack(pady=5) + + # Mittelframe geteilt (links/rechts) --------------------------------- + frame_main = tkinter.Frame(self) + frame_main.pack(anchor="nw", fill="x", pady=5) + + # Rows konfigurieren + frame_main.rowconfigure(0, weight=0) + frame_main.rowconfigure(1, weight=1) + frame_main.rowconfigure(2, weight=1) + + int_row = 0 + cpadnw = {"padx": 4, "pady": 2, "sticky": "nw"} + cpadsw = {"padx": 4, "pady": 2, "sticky": "sw"} + + # Linke Seite Mittelframe ---------------- + lbl = tkinter.Label(frame_main) + lbl["font"] = fntbold + lbl["text"] = _("RevPiPyLoad version on RevPi:") + lbl.grid(column=0, row=int_row, **cpadnw) + + lbl = tkinter.Label(frame_main) + lbl["font"] = fntbold + lbl["text"] = _("not conn.") if self.xmlcli is None \ + else self.xmlcli.version() + lbl.grid(column=1, row=int_row, **cpadnw) + + int_row += 1 # 1 + lbl = tkinter.Label(frame_main) + lbl["justify"] = "left" + lbl["text"] = _( + "\nRevPiModIO, RevPiPyLoad and RevPiPyControl\n" + "are community driven projects. They are all\n" + "free and open source software.\n" + "All of them comes with ABSOLUTELY NO\n" + "WARRANTY, to the extent permitted by \n" + "applicable law.\n" + "\n" + "\n" + "(c) Sven Sager, License: LGPLv3" + ) + lbl.grid(column=0, row=int_row, columnspan=2, **cpadnw) + + int_row += 1 # 2 + lbl = tkinter.Label(frame_main) + lbl.bind("", self.visitwebsite) + lbl["fg"] = "blue" + lbl["text"] = "https://revpimodio.org/" + lbl.grid(column=0, row=int_row, columnspan=2, **cpadsw) + + # int_row += 1 # 3 + + # Rechte Seite Mittelframe --------------- + + # Funktionen der Gegenstelle + frame_func = tkinter.Frame(frame_main) + txt_xmlfunc = tkinter.Text(frame_func, width=30, height=15) + scr_xmlfunc = tkinter.Scrollbar(frame_func) + if extended: + txt_xmlfunc.insert(tkinter.END, "\n".join( + [] if self.xmlcli is None else self.xmlcli.system.listMethods() + )) + else: + txt_xmlfunc.insert(tkinter.END, "\n".join( + [] if self.xmlcli is None else self.xmlcli.get_filelist() + )) + txt_xmlfunc["yscrollcommand"] = scr_xmlfunc.set + txt_xmlfunc["state"] = "disabled" + scr_xmlfunc["command"] = txt_xmlfunc.yview + txt_xmlfunc.pack(side="left") + scr_xmlfunc.pack(fill="y", side="right") + frame_func.grid(column=3, row=0, rowspan=int_row + 1, **cpadnw) + + # Unten Beenden-Button ----------------------------------------------- + self.btnapplog = tkinter.Button(self) + self.btnapplog["command"] = self._checkclose + self.btnapplog["text"] = _("Close") + self.btnapplog.pack(fill="x", padx=100) + + def visitwebsite(self, event=None): + u"""Öffnet auf dem System einen Webbrowser zur Projektseite.""" + webbrowser.open("https://revpimodio.org") + + +# TODO: Remove testdrive +if __name__ == "__main__": + from xmlrpc.client import ServerProxy + cli = ServerProxy("http://192.168.50.35:55123") + root = tkinter.Tk() + app = RevPiInfo(root, cli, "0.4.0") + app.mainloop() diff --git a/revpipycontrol/revpilogfile.py b/revpipycontrol/revpilogfile.py index 646bea3..7c82297 100644 --- a/revpipycontrol/revpilogfile.py +++ b/revpipycontrol/revpilogfile.py @@ -17,7 +17,7 @@ class RevPiLogfile(tkinter.Frame): def __init__(self, master, xmlcli): u"""Init RevPiLogfile-Class.""" super().__init__(master) - self.master.bind("", self._closewin) + self.master.bind("", self._checkclose) self.pack(fill="both", expand=True) self.xmlcli = xmlcli @@ -29,7 +29,9 @@ class RevPiLogfile(tkinter.Frame): # Fenster bauen self._createwidgets() - def _closewin(self, event): + def _checkclose(self, event=None): + u"""Prüft ob Fenster beendet werden soll. + @param event: tkinter-Event""" self.master.destroy() def _createwidgets(self): diff --git a/revpipycontrol/revpiplclist.py b/revpipycontrol/revpiplclist.py index 309c826..fbc821d 100644 --- a/revpipycontrol/revpiplclist.py +++ b/revpipycontrol/revpiplclist.py @@ -25,8 +25,8 @@ else: savefile = os.path.join(homedir, ".revpipyplc", "connections.dat") -# Für andere Module zum Laden der Connections def get_connections(): + u"""Verbindungen aus Datei laden.""" if os.path.exists(savefile): fh = open(savefile, "rb") connections = pickle.load(fh) @@ -38,6 +38,8 @@ def get_connections(): class RevPiPlcList(tkinter.Frame): def __init__(self, master): + u"""Init RevPiPlcList-class. + @param master: tkinter master""" super().__init__(master) self.master.bind("", self._checkclose) self.pack() @@ -45,13 +47,15 @@ class RevPiPlcList(tkinter.Frame): self.changes = False # Daten laden - self._connections = {} + self._connections = get_connections() # Fenster bauen self._createwidgets() - self._loadappdata() + self.build_listconn() def _checkclose(self, event=None): + u"""Prüft ob Fenster beendet werden soll. + @param event: tkinter-Event""" ask = True if self.changes: ask = tkmsg.askyesno( @@ -65,6 +69,7 @@ class RevPiPlcList(tkinter.Frame): self.master.destroy() def _createwidgets(self): + u"""Erstellt alle Widgets.""" self.master.wm_title(_("RevPi Python PLC connections")) self.master.wm_resizable(width=False, height=False) self.master.protocol("WM_DELETE_WINDOW", self._checkclose) @@ -128,13 +133,8 @@ class RevPiPlcList(tkinter.Frame): self, text=_("Close"), command=self._checkclose) self.btn_close.grid(column=4, row=9, sticky="se") - def _loadappdata(self): - if os.path.exists(savefile): - fh = open(savefile, "rb") - self._connections = pickle.load(fh) - self.build_listconn() - def _saveappdata(self): + u"""Speichert Verbindungen im home Dir.""" try: makedirs(os.path.dirname(savefile), exist_ok=True) fh = open(savefile, "wb") @@ -145,6 +145,7 @@ class RevPiPlcList(tkinter.Frame): return True def build_listconn(self): + u"""Füllt Verbindungsliste.""" self.list_conn.delete(0, "end") lst_conns = sorted(self._connections.keys(), key=lambda x: x.lower()) self.list_conn.insert("end", *lst_conns) diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py index d9cd70c..a2b876a 100644 --- a/revpipycontrol/revpiprogram.py +++ b/revpipycontrol/revpiprogram.py @@ -374,6 +374,7 @@ class RevPiProgram(tkinter.Frame): ) ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask) + print(ec) if ec == 0: if ask: @@ -381,20 +382,46 @@ class RevPiProgram(tkinter.Frame): _("Success"), _("The transfer of the piCtory configuration " "and the reset of piControl have been " - "successfully executed"), + "successfully executed."), parent=self.master ) else: tkmsg.showinfo( _("Success"), _("The piCtory configuration was " - "successfully transferred"), + "successfully transferred."), parent=self.master ) # Einstellungen speichern self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name) self._savedefaults() + elif ec == -1: + tkmsg.showerror( + _("Error"), + _("Can not process the transferred file."), + parent=self.master + ) + elif ec == -2: + tkmsg.showerror( + _("Error"), + _("Can not find main elements in piCtory file."), + parent=self.master + ) + elif ec == -4: + tkmsg.showerror( + _("Error"), + _("Contained devices could not be found on Revolution " + "Pi. The configuration may be from a newer piCtory " + "version!"), + parent=self.master + ) + elif ec == -5: + tkmsg.showerror( + _("Error"), + _("Could not load RAP catalog on Revolution Pi."), + parent=self.master + ) elif ec < 0: tkmsg.showerror( _("Error"), @@ -451,7 +478,7 @@ class RevPiProgram(tkinter.Frame): ) if type(dirselect) == str and dirselect != "": - fh = open(mkstemp(), "wb") + fh = open(mkstemp()[1], "wb") elif tdown == 1: # Zip @@ -482,10 +509,12 @@ class RevPiProgram(tkinter.Frame): if fh is not None: if tdown == 1: plcfile = self.xmlcli.plcdownload( - "zip", self.var_picdown.get()) + "zip", self.var_picdown.get() + ) else: plcfile = self.xmlcli.plcdownload( - "tar", self.var_picdown.get()) + "tar", self.var_picdown.get() + ) try: fh.write(plcfile.data) @@ -674,7 +703,7 @@ class RevPiProgram(tkinter.Frame): if ec == 0: tkmsg.showinfo( _("Success"), - _("The transfer was successful."), + _("The PLC program was transferred successfully."), parent=self.master ) diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 8f234d0..d6d65d2 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -210,9 +210,9 @@ class RevPiPyControl(tkinter.Frame): self.mbar.entryconfig("PLC", state="normal") def infowindow(self): - u"""Öffnet das Fenster für die Verbindungen.""" + u"""Öffnet das Fenster für die Info.""" win = tkinter.Toplevel(self) - revpiinfo.RevPiInfo(win) + revpiinfo.RevPiInfo(win, self.cli, pycontrolversion) win.focus_set() win.grab_set() self.wait_window(win)