From e9279e4a5313425e8f81c41c63410092a6572af9 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Tue, 27 Jun 2017 16:12:09 +0200
Subject: [PATCH 01/13] mktemp auf mkstemp umgestellt PLC monitor aktiviert
revpicheckclient auf revpipyloader angepasst Module als einzelnes Fenster
anzeigen
---
.hgignore | 2 +-
doc/revpicheckclient.html | 136 +++++++++++++++++
doc/revpilogfile.html | 114 ++++++++++++++
doc/revpioption.html | 100 +++++++++++++
doc/revpiplclist.html | 151 +++++++++++++++++++
doc/revpiprogram.html | 187 +++++++++++++++++++++++
doc/revpipycontrol.html | 209 ++++++++++++++++++++++++++
revpipycontrol.api | 14 +-
revpipycontrol.e4p | 5 +-
revpipycontrol/revpicheckclient.py | 230 ++++++++++++++---------------
revpipycontrol/revpiprogram.py | 8 +-
revpipycontrol/revpipycontrol.py | 19 ++-
setup.py | 2 +-
13 files changed, 1041 insertions(+), 136 deletions(-)
create mode 100644 doc/revpicheckclient.html
create mode 100644 doc/revpilogfile.html
create mode 100644 doc/revpioption.html
create mode 100644 doc/revpiplclist.html
create mode 100644 doc/revpiprogram.html
create mode 100644 doc/revpipycontrol.html
diff --git a/.hgignore b/.hgignore
index 9e0632f..fe4cdbb 100644
--- a/.hgignore
+++ b/.hgignore
@@ -3,6 +3,6 @@ syntax: glob
deb_dist/*
dist/*
revpipycontrol.egg-info/*
-doc/*
deb/*
.eric6project/*
+*.directory
diff --git a/doc/revpicheckclient.html b/doc/revpicheckclient.html
new file mode 100644
index 0000000..79c32c2
--- /dev/null
+++ b/doc/revpicheckclient.html
@@ -0,0 +1,136 @@
+
+
+revpicheckclient
+
+
+
+
+revpicheckclient
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiCheckClient
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiCheckClient (Constructor)
+RevPiCheckClient(master, xmlcli, xmlmode=0)
+
+Instantiiert MyApp-Klasse.
+
+
+RevPiCheckClient.__hidewin
+__hidewin(win, event=None)
+
+
+RevPiCheckClient.__showwin
+__showwin(win)
+
+
+RevPiCheckClient._createiogroup
+_createiogroup(device, frame, iotype)
+
+Erstellt IO-Gruppen.
+
+
+RevPiCheckClient._createwidgets
+_createwidgets()
+
+Erstellt den Fensterinhalt.
+
+
+RevPiCheckClient._readvalues
+_readvalues()
+
+Alle Werte der Inputs und Outputs abrufen.
+
+
+RevPiCheckClient.chval
+chval(device, io)
+
+
+RevPiCheckClient.onfrmconf
+onfrmconf(canvas)
+
+
+RevPiCheckClient.readvalues
+readvalues()
+
+
+RevPiCheckClient.toggleauto
+toggleauto()
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpilogfile.html b/doc/revpilogfile.html
new file mode 100644
index 0000000..e97a54a
--- /dev/null
+++ b/doc/revpilogfile.html
@@ -0,0 +1,114 @@
+
+
+revpilogfile
+
+
+
+
+revpilogfile
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiLogfile
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiLogfile (Constructor)
+RevPiLogfile(master, xmlcli)
+
+
+RevPiLogfile._createwidgets
+_createwidgets()
+
+
+RevPiLogfile.btn_clearapp
+btn_clearapp()
+
+
+RevPiLogfile.btn_clearplc
+btn_clearplc()
+
+
+RevPiLogfile.get_applines
+get_applines()
+
+
+RevPiLogfile.get_applog
+get_applog()
+
+
+RevPiLogfile.get_plclines
+get_plclines()
+
+
+RevPiLogfile.get_plclog
+get_plclog()
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpioption.html b/doc/revpioption.html
new file mode 100644
index 0000000..417e9fd
--- /dev/null
+++ b/doc/revpioption.html
@@ -0,0 +1,100 @@
+
+
+revpioption
+
+
+
+
+revpioption
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiOption
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiOption (Constructor)
+RevPiOption(master, xmlcli, xmlmode)
+
+
+RevPiOption._createwidgets
+_createwidgets()
+
+
+RevPiOption._loadappdata
+_loadappdata()
+
+
+RevPiOption._setappdata
+_setappdata()
+
+
+RevPiOption.askxmlon
+askxmlon()
+
+
+RevPiOption.xmlmods
+xmlmods()
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpiplclist.html b/doc/revpiplclist.html
new file mode 100644
index 0000000..9d27221
--- /dev/null
+++ b/doc/revpiplclist.html
@@ -0,0 +1,151 @@
+
+
+revpiplclist
+
+
+
+
+revpiplclist
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiPlcList
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiPlcList (Constructor)
+RevPiPlcList(master)
+
+
+RevPiPlcList._createwidgets
+_createwidgets()
+
+
+RevPiPlcList._loadappdata
+_loadappdata()
+
+
+RevPiPlcList._saveappdata
+_saveappdata()
+
+
+RevPiPlcList.build_listconn
+build_listconn()
+
+
+RevPiPlcList.evt_btnadd
+evt_btnadd()
+
+
+RevPiPlcList.evt_btnclose
+evt_btnclose()
+
+
+RevPiPlcList.evt_btnnew
+evt_btnnew()
+
+
+RevPiPlcList.evt_btnremove
+evt_btnremove()
+
+
+RevPiPlcList.evt_btnsave
+evt_btnsave()
+
+
+RevPiPlcList.evt_keypress
+evt_keypress(evt=None)
+
+
+RevPiPlcList.evt_listconn
+evt_listconn(evt=None)
+
+
+
+
+get_connections
+get_connections()
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpiprogram.html b/doc/revpiprogram.html
new file mode 100644
index 0000000..a00d6cf
--- /dev/null
+++ b/doc/revpiprogram.html
@@ -0,0 +1,187 @@
+
+
+revpiprogram
+
+
+
+
+revpiprogram
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+
+RevPiProgram
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiProgram (Constructor)
+RevPiProgram(master, xmlcli, xmlmode, revpi)
+
+
+RevPiProgram._createwidgets
+_createwidgets()
+
+
+RevPiProgram._evt_optdown
+_evt_optdown(text="")
+
+
+RevPiProgram._evt_optup
+_evt_optup(text="")
+
+
+RevPiProgram._loaddefault
+_loaddefault(full=False)
+
+Uebernimmt fuer den Pi die letzen Pfade.
+
+
+RevPiProgram._savedefaults
+_savedefaults()
+
+Schreibt fuer den Pi die letzen Pfade.
+
+
+RevPiProgram.check_replacedir
+check_replacedir(rootdir)
+
+Gibt das rootdir von einem entpackten Verzeichnis zurueck.
+
+ Dabei wird geprueft, ob es sich um einen einzelnen Ordner handelt
+ und ob es eine piCtory Konfiguraiton im rootdir gibt.
+
+- rootdir:
+-
+Verzeichnis fuer Pruefung
+
+
+- Returns:
+-
+Abgeaendertes rootdir
+
+
+
+RevPiProgram.create_filelist
+create_filelist(rootdir)
+
+Erstellt eine Dateiliste von einem Verzeichnis.
+
+- rootdir:
+-
+Verzeichnis fuer das eine Liste erstellt werden soll
+
+
+- Returns:
+-
+Dateiliste
+
+
+
+RevPiProgram.getpictoryrsc
+getpictoryrsc()
+
+
+RevPiProgram.getprocimg
+getprocimg()
+
+
+RevPiProgram.picontrolreset
+picontrolreset()
+
+
+RevPiProgram.plcdownload
+plcdownload()
+
+
+RevPiProgram.plcupload
+plcupload()
+
+
+RevPiProgram.setpictoryrsc
+setpictoryrsc(filename=None)
+
+
+
+
\ No newline at end of file
diff --git a/doc/revpipycontrol.html b/doc/revpipycontrol.html
new file mode 100644
index 0000000..11750e5
--- /dev/null
+++ b/doc/revpipycontrol.html
@@ -0,0 +1,209 @@
+
+
+revpipycontrol
+
+
+
+
+revpipycontrol
+
+
+Global Attributes
+
+
+Classes
+
+
+Functions
+
+
+| addroot |
+Hängt root-dir der Anwendung vor Dateinamen. |
+
+
+
+
+RevPiPyControl
+
+
+Derived from
+tkinter.Frame
+
+Class Attributes
+
+
+Class Methods
+
+
+Methods
+
+
+Static Methods
+
+
+
+RevPiPyControl (Constructor)
+RevPiPyControl(master=None)
+
+
+RevPiPyControl._btnstate
+_btnstate()
+
+
+RevPiPyControl._closeall
+_closeall()
+
+
+RevPiPyControl._createwidgets
+_createwidgets()
+
+Erstellt den Fensterinhalt.
+
+
+RevPiPyControl._fillconnbar
+_fillconnbar()
+
+
+RevPiPyControl._fillmbar
+_fillmbar()
+
+
+RevPiPyControl._opt_conn
+_opt_conn(text)
+
+
+RevPiPyControl.plclist
+plclist()
+
+
+RevPiPyControl.plclogs
+plclogs()
+
+
+RevPiPyControl.plcmonitor
+plcmonitor()
+
+Startet das Monitorfenster.
+
+
+RevPiPyControl.plcoptions
+plcoptions()
+
+Startet das Optionsfenster.
+
+
+RevPiPyControl.plcprogram
+plcprogram()
+
+
+RevPiPyControl.plcrestart
+plcrestart()
+
+
+RevPiPyControl.plcstart
+plcstart()
+
+
+RevPiPyControl.plcstop
+plcstop()
+
+
+RevPiPyControl.servererror
+servererror()
+
+Setzt alles auf NULL.
+
+
+RevPiPyControl.tmr_plcrunning
+tmr_plcrunning()
+
+
+
+
+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
+
+
+
+
+
\ No newline at end of file
diff --git a/revpipycontrol.api b/revpipycontrol.api
index 41dff9d..ae08326 100644
--- a/revpipycontrol.api
+++ b/revpipycontrol.api
@@ -1,15 +1,15 @@
-revpicheckclient.RevPiCheckClient._autorw?5()
+revpicheckclient.RevPiCheckClient.__hidewin?6(win, event=None)
+revpicheckclient.RevPiCheckClient.__showwin?6(win)
revpicheckclient.RevPiCheckClient._createiogroup?5(device, frame, iotype)
revpicheckclient.RevPiCheckClient._createwidgets?5()
-revpicheckclient.RevPiCheckClient._readvaluesdev?5(device, iotype)
-revpicheckclient.RevPiCheckClient._writevaluesdev?5(device)
-revpicheckclient.RevPiCheckClient.myapp?7
+revpicheckclient.RevPiCheckClient._readvalues?5()
+revpicheckclient.RevPiCheckClient.chval?4(device, io)
+revpicheckclient.RevPiCheckClient.cli?7
revpicheckclient.RevPiCheckClient.onfrmconf?4(canvas)
revpicheckclient.RevPiCheckClient.readvalues?4()
-revpicheckclient.RevPiCheckClient.root?7
+revpicheckclient.RevPiCheckClient.tk?7
revpicheckclient.RevPiCheckClient.toggleauto?4()
-revpicheckclient.RevPiCheckClient.writevalues?4()
-revpicheckclient.RevPiCheckClient?1(master, xmlcli)
+revpicheckclient.RevPiCheckClient?1(master, xmlcli, xmlmode=0)
revpilogfile.RevPiLogfile._createwidgets?5()
revpilogfile.RevPiLogfile.btn_clearapp?4()
revpilogfile.RevPiLogfile.btn_clearplc?4()
diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p
index 68fd5fa..2908aac 100644
--- a/revpipycontrol.e4p
+++ b/revpipycontrol.e4p
@@ -1,7 +1,7 @@
-
+
en_US
@@ -9,7 +9,7 @@
Python3
Console
- 0.2.12
+ 0.4.0
Sven Sager
akira@narux.de
@@ -30,6 +30,7 @@
data
doc
revpipycontrol.api
+ stdeb.cfg
revpipycontrol/revpipycontrol.py
diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py
index 1076251..e6443ee 100644
--- a/revpipycontrol/revpicheckclient.py
+++ b/revpipycontrol/revpicheckclient.py
@@ -9,28 +9,29 @@
import pickle
import tkinter
-from argparse import ArgumentParser
-from concurrent.futures import ThreadPoolExecutor
-from time import sleep
-from xmlrpc.client import ServerProxy, Binary, MultiCall
+from threading import Lock
+from xmlrpc.client import ServerProxy
class RevPiCheckClient(tkinter.Frame):
- def __init__(self, master, xmlcli):
+ def __init__(self, master, xmlcli, xmlmode=0):
"""Instantiiert MyApp-Klasse."""
super().__init__(master)
self.pack(fill="both", expand=True)
+ # XML-Daten abrufen
+ self.xmlmode = xmlmode
self.cli = xmlcli
+ self.cli.psstart()
+ self.lst_devices = self.cli.ps_devices()
+ self.dict_inps = pickle.loads(self.cli.ps_inps().data)
+ self.dict_outs = pickle.loads(self.cli.ps_outs().data)
- self.lst_devices = self.cli.get_devicenames()
- self.lst_group = []
- self.dict_inpvar = {}
- self.dict_outvar = {}
+ self.lk = Lock()
self.autorw = tkinter.BooleanVar()
- self.fut_autorw = None
+ self.dowrite = tkinter.BooleanVar()
# Fenster aufbauen
self._createwidgets()
@@ -38,33 +39,6 @@ class RevPiCheckClient(tkinter.Frame):
# Aktuelle Werte einlesen
self.readvalues()
- def _autorw(self):
- dict_inp = {}
- dict_out = {}
-
- while self.autorw.get():
- for dev in self.lst_devices:
- try:
- dict_out[dev] = [
- value[8].get() for value in self.dict_outvar[dev]
- ]
- except:
- print("lasse {} aus".format(dev))
-
- dict_inp = self.cli.refreshvalues(
- Binary(pickle.dumps(dict_out, 3))
- )
- dict_inp = pickle.loads(dict_inp.data)
-
- for dev in dict_inp:
- for io in self.dict_inpvar[dev]:
- try:
- io[8].set(dict_inp[dev].pop(0))
- except:
- print("lasse {} aus".format(io[0]))
-
- sleep(0.1)
-
def onfrmconf(self, canvas):
canvas.configure(scrollregion=canvas.bbox("all"))
@@ -85,23 +59,34 @@ class RevPiCheckClient(tkinter.Frame):
)
rowcount = 0
- for io in self.cli.get_iolist(device, iotype):
- # io = [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress,tkinter_var]
+
+ if iotype == "inp":
+ lst_io = self.dict_inps[device]
+ else:
+ lst_io = self.dict_outs[device]
+
+ for io in lst_io:
+ # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
tkinter.Label(s_frame, text=io[0]).grid(
column=0, row=rowcount, sticky="w"
)
- if io[7] >= 0:
+ if io[4] >= 0:
var = tkinter.BooleanVar()
check = tkinter.Checkbutton(s_frame)
+ check["command"] = \
+ lambda device=device, io=io: self.chval(device, io)
check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = ""
check["variable"] = var
check.grid(column=1, row=rowcount)
else:
var = tkinter.IntVar()
- txt = tkinter.Spinbox(s_frame, to=256)
+ # FIXME: Mehrere Bytes möglich
+ txt = tkinter.Spinbox(s_frame, to=255 * io[1])
+ txt["command"] = \
+ lambda device=device, io=io: self.chval(device, io)
txt["state"] = "disabled" if iotype == "inp" else "normal"
txt["width"] = 4
txt["textvariable"] = var
@@ -109,116 +94,127 @@ class RevPiCheckClient(tkinter.Frame):
# Steuerelementvariable in IO übernehmen
io.append(var)
- if iotype == "inp":
- self.dict_inpvar[device].append(io)
- elif iotype == "out":
- self.dict_outvar[device].append(io)
rowcount += 1
+ def __hidewin(self, win, event=None):
+ win.withdraw()
+
+ def __showwin(self, win):
+ if win.winfo_viewable():
+ win.withdraw()
+ else:
+ win.deiconify()
+
def _createwidgets(self):
"""Erstellt den Fensterinhalt."""
# Hauptfenster
self.master.wm_title("RevPi Onlineview")
+ devgrp = tkinter.LabelFrame(self)
+ devgrp["text"] = "Devices of RevPi"
+ devgrp.pack(fill="y", side="left")
+
for dev in self.lst_devices:
- # Variablen vorbereiten
- self.dict_inpvar[dev] = []
- self.dict_outvar[dev] = []
+ win = tkinter.Toplevel(self)
+ win.wm_title(dev[1])
+ win.protocol(
+ "WM_DELETE_WINDOW",
+ lambda win=win: self.__hidewin(win)
+ )
+ win.withdraw()
# Devicegruppe erstellen
- group = tkinter.LabelFrame(self)
- group["text"] = dev
+ group = tkinter.LabelFrame(win)
+ group["text"] = dev[1]
group.pack(side="left", fill="both", expand=True)
- self.lst_group.append(group)
for iotype in ["inp", "out"]:
frame = tkinter.Frame(group)
frame.pack(side="left", fill="both", expand=True)
- self._createiogroup(dev, frame, iotype)
+ self._createiogroup(dev[0], frame, iotype)
-# self.btn_update = tkinter.Button(self)
-# self.btn_update["text"] = "UPDATE"
-# self.btn_update["command"] = self._autorw
-# self.btn_update.pack(anchor="s", side="bottom", fill="x")
+ # Button erstellen
+ btn = tkinter.Button(devgrp)
+ btn["command"] = lambda win=win: self.__showwin(win)
+ btn["text"] = dev[1]
+ btn.pack(fill="x", padx=10, pady=5)
- self.btn_write = tkinter.Button(self)
- self.btn_write["text"] = "SCHREIBEN"
- self.btn_write["command"] = self.writevalues
- self.btn_write.pack(side="bottom", fill="x")
+ # Steuerungsfunktionen
+ cntgrp = tkinter.LabelFrame(self)
+ cntgrp["text"] = "Control"
+ cntgrp.pack(fill="y", side="right")
- self.btn_read = tkinter.Button(self)
+ self.btn_read = tkinter.Button(cntgrp)
self.btn_read["text"] = "LESEN"
self.btn_read["command"] = self.readvalues
- self.btn_read.pack(side="bottom", fill="x")
+ self.btn_read.pack(fill="x")
- check = tkinter.Checkbutton(self)
+ check = tkinter.Checkbutton(cntgrp)
check["command"] = self.toggleauto
- check["text"] = "autoupdate"
+ check["text"] = "autorefresh processimage"
check["variable"] = self.autorw
- check.pack(side="bottom")
+ check.pack(anchor="w")
- def _readvaluesdev(self, device, iotype):
- """Ruft alle aktuellen Werte fuer das Device ab."""
- # Multicall vorbereiten
- mc_values = MultiCall(self.cli)
+ check = tkinter.Checkbutton(cntgrp)
+ check["state"] = "disabled" if self.xmlmode < 3 else "normal"
+ check["text"] = "write values to processimage"
+ check["variable"] = self.dowrite
+ check.pack(anchor="w")
- if iotype == "inp":
- lst_ios = self.dict_inpvar[device]
- elif iotype == "out":
- lst_ios = self.dict_outvar[device]
+ def chval(self, device, io):
+ if self.dowrite.get():
+ with self.lk:
+ self.cli.ps_setvalue(device, io[0], io[5].get())
- for io in lst_ios:
- mc_values.get_iovalue(device, io[0])
+ # Alles neu einlesen wenn nicht AutoRW aktiv ist
+ if not self.autorw.get():
+ self.readvalues()
- i = 0
- for value in mc_values():
- value = pickle.loads(value.data)
- if type(value) == bytes:
- value = int.from_bytes(value, byteorder="little")
-
- lst_ios[i][8].set(value)
- i += 1
-
- def _writevaluesdev(self, device):
- """Sendet Werte der Outputs fuer ein Device."""
- # Multicall vorbereiten
- mc_values = MultiCall(self.cli)
- lst_ios = lst_ios = self.dict_outvar[device]
-
- for io in lst_ios:
- mc_values.set_iovalue(device, io[0], pickle.dumps(io[8].get(), 3))
-
- # Multicall ausführen
- mc_values()
-
- def readvalues(self):
+ def _readvalues(self):
"""Alle Werte der Inputs und Outputs abrufen."""
- # Werte aus Prozessabbild einlesen
- self.cli.readprocimg()
+
+ # Werte abrufen
+ with self.lk:
+ ba_values = bytearray(self.cli.ps_values().data)
for dev in self.lst_devices:
- self._readvaluesdev(dev, "inp")
- self._readvaluesdev(dev, "out")
+ # io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
+
+ # IO Typ verarbeiten
+ for iotype in [self.dict_inps, self.dict_outs]:
+ # ios verarbeiten
+ for io in iotype[dev[0]]:
+
+ # Bytes umwandeln
+ int_byte = int.from_bytes(
+ ba_values[io[2]:io[2] + io[1]], byteorder="little"
+ )
+ if io[4] >= 0:
+ # Bit-IO
+ io[5].set(bool(int_byte & 1 << io[4]))
+ else:
+ # Byte-IO
+ io[5].set(int_byte)
+
+ if self.autorw.get():
+ self.master.after(200, self._readvalues)
+
+ def readvalues(self):
+ if not self.autorw.get():
+ self._readvalues()
def toggleauto(self):
self.btn_read["state"] = "disabled" if self.autorw.get() else "normal"
- self.btn_write["state"] = "disabled" if self.autorw.get() else "normal"
- if self.autorw.get() \
- and (self.fut_autorw is None or self.fut_autorw.done()):
- e = ThreadPoolExecutor(max_workers=1)
- self.fut_autorw = e.submit(self._autorw)
+ if self.autorw.get():
+ self._readvalues()
- def writevalues(self):
- """Alle Outputs senden."""
- pass
- #for dev in self.lst_devices:
- #self._writevaluesdev(dev)
-
- # Werte in Prozessabbild schreiben
- #self.cli.writeprocimg()
+# Testdrive
if __name__ == "__main__":
- root = tkinter.Tk()
- myapp = RevPiCheckClient(root)
- myapp.mainloop()
+ cli = ServerProxy("http://192.168.50.35:55123")
+ cli.psstart()
+
+ tk = tkinter.Tk()
+ RevPiCheckClient(tk, cli, 3)
+ tk.mainloop()
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 01abff2..06dff81 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -17,7 +17,7 @@ from os import environ
from os import makedirs
from shutil import rmtree
from sys import platform
-from tempfile import mktemp, mkdtemp
+from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary
@@ -363,7 +363,7 @@ class RevPiProgram(tkinter.Frame):
message="Die Übertragung der piCtory Konfiguration "
"wurde erfolgreich ausgeführt")
- #Einstellungen speichern
+ # Einstellungen speichern
self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults()
elif ec < 0:
@@ -382,7 +382,7 @@ class RevPiProgram(tkinter.Frame):
def picontrolreset(self):
ask = tkmsg.askyesno(
- parent=self.master, title="Frage...",
+ parent=self.master, title="Frage...",
message="Soll piControlReset wirklich durchgeführt werden? \n"
"Das Prozessabbild und die Steuerung werden dann unterbrochen!!!"
)
@@ -415,7 +415,7 @@ class RevPiProgram(tkinter.Frame):
)
if type(dirselect) == str and dirselect != "":
- fh = open(mktemp(), "wb")
+ fh = open(mkstemp(), "wb")
elif tdown == 1:
# Zip
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index 4f518d6..c107e62 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -1,12 +1,13 @@
#!/usr/bin/python3
#
# RevPiPyControl
-# Version: 0.2.12
+# Version: 0.4.0
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
+import revpicheckclient
import revpilogfile
import revpioption
import revpiplclist
@@ -50,6 +51,7 @@ class RevPiPyControl(tkinter.Frame):
self.xmlmode = 0
# Globale Fenster
+ self.tkcheckclient = None
self.tklogs = None
self.tkoptions = None
self.tkprogram = None
@@ -124,7 +126,7 @@ class RevPiPyControl(tkinter.Frame):
# PLC Menü
self.mplc = tkinter.Menu(self.mbar, tearoff=False)
self.mplc.add_command(label="PLC log...", command=self.plclogs)
- #self.mplc.add_command(label="PLC monitor...", command=self.plcmonitor)
+ self.mplc.add_command(label="PLC monitor...", command=self.plcmonitor)
self.mplc.add_command(label="PLC options...", command=self.plcoptions)
self.mplc.add_command(label="PLC program...", command=self.plcprogram)
self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled")
@@ -167,6 +169,8 @@ class RevPiPyControl(tkinter.Frame):
self.mbar.entryconfig("PLC", state="normal")
def _closeall(self):
+ if self.tkcheckclient is not None:
+ self.tkcheckclient.destroy()
if self.tklogs is not None:
self.tklogs.master.destroy()
if self.tkoptions is not None:
@@ -191,10 +195,17 @@ class RevPiPyControl(tkinter.Frame):
self.tklogs.focus_set()
def plcmonitor(self):
- # TODO: Monitorfenster
- pass
+ """Startet das Monitorfenster."""
+ if self.tkcheckclient is None or len(self.tkcheckclient.children) == 0:
+ win = tkinter.Toplevel(self)
+ self.tkcheckclient = revpicheckclient.RevPiCheckClient(
+ win, self.cli, self.xmlmode
+ )
+ else:
+ self.tkcheckclient.focus_set()
def plcoptions(self):
+ """Startet das Optionsfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",
diff --git a/setup.py b/setup.py
index 0af49cd..2d518aa 100644
--- a/setup.py
+++ b/setup.py
@@ -23,7 +23,7 @@ globsetup = {
"author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3",
- "version": "0.2.12",
+ "version": "0.4.0",
"name": "revpipycontrol",
From 673c338c6b3b61556596eff4eb37b13a8bb0ba1b Mon Sep 17 00:00:00 2001
From: NaruX
Date: Wed, 28 Jun 2017 11:55:30 +0200
Subject: [PATCH 02/13] "Monitorfunktion" als Debug zum Hautpfenster
hinzugef?gt Disconnect-Men?eintrag eingebaut (Funktion hinzugef?gt)
Funktionen f?r "nur lesen" und "nur schreiben" eingebaut Werte schreiben per
MultiCall UI-Texte angepasst DocStrings und CodeStyle
---
revpipycontrol/revpicheckclient.py | 124 ++++++++++++++++++++---------
revpipycontrol/revpiprogram.py | 13 ++-
revpipycontrol/revpipycontrol.py | 118 +++++++++++++++++++--------
3 files changed, 179 insertions(+), 76 deletions(-)
diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py
index e6443ee..284ec88 100644
--- a/revpipycontrol/revpicheckclient.py
+++ b/revpipycontrol/revpicheckclient.py
@@ -10,7 +10,7 @@
import pickle
import tkinter
from threading import Lock
-from xmlrpc.client import ServerProxy
+from xmlrpc.client import ServerProxy, MultiCall
class RevPiCheckClient(tkinter.Frame):
@@ -18,17 +18,20 @@ class RevPiCheckClient(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode=0):
"""Instantiiert MyApp-Klasse."""
super().__init__(master)
- self.pack(fill="both", expand=True)
# XML-Daten abrufen
self.xmlmode = xmlmode
self.cli = xmlcli
+
+ # FIXME: Fehlerabfang
self.cli.psstart()
+
self.lst_devices = self.cli.ps_devices()
self.dict_inps = pickle.loads(self.cli.ps_inps().data)
self.dict_outs = pickle.loads(self.cli.ps_outs().data)
self.lk = Lock()
+ self.lst_wins = []
self.autorw = tkinter.BooleanVar()
self.dowrite = tkinter.BooleanVar()
@@ -37,10 +40,25 @@ class RevPiCheckClient(tkinter.Frame):
self._createwidgets()
# Aktuelle Werte einlesen
- self.readvalues()
+ self.refreshvalues()
- def onfrmconf(self, canvas):
- canvas.configure(scrollregion=canvas.bbox("all"))
+ def __chval(self, device, io):
+ if self.dowrite.get():
+ with self.lk:
+ self.cli.ps_setvalue(device, io[0], io[5].get())
+
+ # Alles neu einlesen wenn nicht AutoRW aktiv ist
+ if not self.autorw.get():
+ self.refreshvalues()
+
+ def __hidewin(self, win, event=None):
+ win.withdraw()
+
+ def __showwin(self, win):
+ if win.winfo_viewable():
+ win.withdraw()
+ else:
+ win.deiconify()
def _createiogroup(self, device, frame, iotype):
"""Erstellt IO-Gruppen."""
@@ -55,7 +73,7 @@ class RevPiCheckClient(tkinter.Frame):
canvas.create_window((4, 4), window=s_frame, anchor="nw")
s_frame.bind(
- "", lambda event, canvas=canvas: self.onfrmconf(canvas)
+ "", lambda event, canvas=canvas: self._onfrmconf(canvas)
)
rowcount = 0
@@ -76,7 +94,7 @@ class RevPiCheckClient(tkinter.Frame):
var = tkinter.BooleanVar()
check = tkinter.Checkbutton(s_frame)
check["command"] = \
- lambda device=device, io=io: self.chval(device, io)
+ lambda device=device, io=io: self.__chval(device, io)
check["state"] = "disabled" if iotype == "inp" else "normal"
check["text"] = ""
check["variable"] = var
@@ -86,7 +104,7 @@ class RevPiCheckClient(tkinter.Frame):
# FIXME: Mehrere Bytes möglich
txt = tkinter.Spinbox(s_frame, to=255 * io[1])
txt["command"] = \
- lambda device=device, io=io: self.chval(device, io)
+ lambda device=device, io=io: self.__chval(device, io)
txt["state"] = "disabled" if iotype == "inp" else "normal"
txt["width"] = 4
txt["textvariable"] = var
@@ -97,19 +115,8 @@ class RevPiCheckClient(tkinter.Frame):
rowcount += 1
- def __hidewin(self, win, event=None):
- win.withdraw()
-
- def __showwin(self, win):
- if win.winfo_viewable():
- win.withdraw()
- else:
- win.deiconify()
-
def _createwidgets(self):
"""Erstellt den Fensterinhalt."""
- # Hauptfenster
- self.master.wm_title("RevPi Onlineview")
devgrp = tkinter.LabelFrame(self)
devgrp["text"] = "Devices of RevPi"
@@ -123,6 +130,7 @@ class RevPiCheckClient(tkinter.Frame):
lambda win=win: self.__hidewin(win)
)
win.withdraw()
+ self.lst_wins.append(win)
# Devicegruppe erstellen
group = tkinter.LabelFrame(win)
@@ -145,44 +153,56 @@ class RevPiCheckClient(tkinter.Frame):
cntgrp["text"] = "Control"
cntgrp.pack(fill="y", side="right")
+ self.btn_refresh = tkinter.Button(cntgrp)
+ self.btn_refresh["text"] = "Alle IOs lesen"
+ self.btn_refresh["command"] = self.refreshvalues
+ self.btn_refresh.pack(fill="x")
+
self.btn_read = tkinter.Button(cntgrp)
- self.btn_read["text"] = "LESEN"
+ self.btn_read["text"] = "Inputs einlesen"
self.btn_read["command"] = self.readvalues
self.btn_read.pack(fill="x")
+ self.btn_write = tkinter.Button(cntgrp)
+ self.btn_write["text"] = "Outputs schreiben"
+ self.btn_write["command"] = self.writevalues
+ self.btn_write.pack(fill="x")
+
check = tkinter.Checkbutton(cntgrp)
check["command"] = self.toggleauto
- check["text"] = "autorefresh processimage"
+ check["text"] = "Autorefresh values"
check["variable"] = self.autorw
check.pack(anchor="w")
check = tkinter.Checkbutton(cntgrp)
check["state"] = "disabled" if self.xmlmode < 3 else "normal"
- check["text"] = "write values to processimage"
+ check["text"] = "Write values to RevPi"
check["variable"] = self.dowrite
check.pack(anchor="w")
- def chval(self, device, io):
- if self.dowrite.get():
- with self.lk:
- self.cli.ps_setvalue(device, io[0], io[5].get())
+ def _onfrmconf(self, canvas):
+ canvas.configure(scrollregion=canvas.bbox("all"))
- # Alles neu einlesen wenn nicht AutoRW aktiv ist
- if not self.autorw.get():
- self.readvalues()
-
- def _readvalues(self):
+ def _workvalues(self, io_dicts=None, writeout=False):
"""Alle Werte der Inputs und Outputs abrufen."""
+ # Abfragelisten vorbereiten
+ if io_dicts is None:
+ io_dicts = [self.dict_inps, self.dict_outs]
+
# Werte abrufen
with self.lk:
ba_values = bytearray(self.cli.ps_values().data)
+ # Multicall zum Schreiben vorbereiten
+ if writeout:
+ xmlmc = MultiCall(self.cli)
+
for dev in self.lst_devices:
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
# IO Typ verarbeiten
- for iotype in [self.dict_inps, self.dict_outs]:
+ for iotype in io_dicts:
# ios verarbeiten
for io in iotype[dev[0]]:
@@ -192,22 +212,50 @@ class RevPiCheckClient(tkinter.Frame):
)
if io[4] >= 0:
# Bit-IO
- io[5].set(bool(int_byte & 1 << io[4]))
+ new_val = bool(int_byte & 1 << io[4])
+ if writeout and new_val != io[5].get():
+ xmlmc.ps_setvalue(dev[0], io[0], io[5].get())
+ else:
+ io[5].set(new_val)
else:
# Byte-IO
- io[5].set(int_byte)
+ if writeout and int_byte != io[5].get():
+ xmlmc.ps_setvalue(dev[0], io[0], io[5].get())
+ else:
+ io[5].set(int_byte)
+
+ # Werte per Multicall schreiben
+ if writeout:
+ with self.lk:
+ xmlmc()
if self.autorw.get():
- self.master.after(200, self._readvalues)
+ self.master.after(200, self._workvalues)
+
+ def hideallwindows(self):
+ for win in self.lst_wins:
+ win.withdraw()
def readvalues(self):
if not self.autorw.get():
- self._readvalues()
+ self._workvalues([self.dict_inps])
+
+ def refreshvalues(self):
+ if not self.autorw.get():
+ self._workvalues()
def toggleauto(self):
- self.btn_read["state"] = "disabled" if self.autorw.get() else "normal"
+ stateval = "disabled" if self.autorw.get() else "normal"
+ self.btn_refresh["state"] = stateval
+ self.btn_read["state"] = stateval
+ self.btn_write["state"] = stateval
+
if self.autorw.get():
- self._readvalues()
+ self._workvalues()
+
+ def writevalues(self):
+ if not self.autorw.get():
+ self._workvalues([self.dict_outs], True)
# Testdrive
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 06dff81..55f41df 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -32,6 +32,7 @@ savefile = os.path.join(homedir, ".revpipyplc", "programpath.dat")
class RevPiProgram(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode, revpi):
+ u"""Init RevPiProgram-Class."""
if xmlmode < 2:
return None
@@ -223,7 +224,7 @@ class RevPiProgram(tkinter.Frame):
return {}
def _savedefaults(self):
- """Schreibt fuer den Pi die letzen Pfade."""
+ u"""Schreibt fuer den Pi die letzen Pfade."""
try:
makedirs(os.path.dirname(savefile), exist_ok=True)
dict_all = self._loaddefault(full=True)
@@ -236,7 +237,7 @@ class RevPiProgram(tkinter.Frame):
return True
def create_filelist(self, rootdir):
- """Erstellt eine Dateiliste von einem Verzeichnis.
+ u"""Erstellt eine Dateiliste von einem Verzeichnis.
@param rootdir: Verzeichnis fuer das eine Liste erstellt werden soll
@returns: Dateiliste"""
filelist = []
@@ -249,7 +250,7 @@ class RevPiProgram(tkinter.Frame):
"""Gibt das rootdir von einem entpackten Verzeichnis zurueck.
Dabei wird geprueft, ob es sich um einen einzelnen Ordner handelt
- und ob es eine piCtory Konfiguraiton im rootdir gibt.
+ und ob es eine piCtory Konfiguration im rootdir gibt.
@param rootdir: Verzeichnis fuer Pruefung
@returns: Abgeaendertes rootdir
@@ -270,6 +271,7 @@ class RevPiProgram(tkinter.Frame):
return (rootdir, None)
def getpictoryrsc(self):
+ u"""Läd die piCtory Konfiguration herunter."""
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
@@ -300,6 +302,7 @@ class RevPiProgram(tkinter.Frame):
fh.close()
def getprocimg(self):
+ u"""Läd das aktuelle Prozessabbild herunter."""
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
@@ -330,6 +333,7 @@ class RevPiProgram(tkinter.Frame):
fh.close()
def setpictoryrsc(self, filename=None):
+ u"""Überträgt die angegebene piCtory-Konfiguration."""
if filename is None:
fh = tkfd.askopenfile(
mode="rb", parent=self.master,
@@ -381,6 +385,7 @@ class RevPiProgram(tkinter.Frame):
fh.close()
def picontrolreset(self):
+ u"""Fürt ein Reset der piBridge durch."""
ask = tkmsg.askyesno(
parent=self.master, title="Frage...",
message="Soll piControlReset wirklich durchgeführt werden? \n"
@@ -401,6 +406,7 @@ class RevPiProgram(tkinter.Frame):
)
def plcdownload(self):
+ u"""Läd das aktuelle Projekt herunter."""
tdown = self.lst_typedown.index(self.var_typedown.get())
fh = None
dirselect = ""
@@ -491,6 +497,7 @@ class RevPiProgram(tkinter.Frame):
fh.close()
def plcupload(self):
+ u"""Lädt das angegebene Projekt auf den RevPi."""
tup = self.lst_typeup.index(self.var_typeup.get())
dirselect = ""
dirtmp = None
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index c107e62..de8cfb5 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -41,6 +41,8 @@ def addroot(filename):
class RevPiPyControl(tkinter.Frame):
def __init__(self, master=None):
+ u"""Init RevPiPyControl-Class.
+ @param master: tkinter master"""
super().__init__(master)
self.pack(fill="both", expand=True)
@@ -48,8 +50,12 @@ class RevPiPyControl(tkinter.Frame):
self.dict_conn = revpiplclist.get_connections()
self.errcount = 0
self.revpiname = None
+ self.xmlfuncs = []
self.xmlmode = 0
+ # Debugger vorbereiten
+ self.debugframe = None
+
# Globale Fenster
self.tkcheckclient = None
self.tklogs = None
@@ -63,14 +69,30 @@ class RevPiPyControl(tkinter.Frame):
self.tmr_plcrunning()
def _btnstate(self):
+ u"""Setzt den state der Buttons."""
stateval = "disabled" if self.cli is None else "normal"
self.btn_plclogs["state"] = stateval
self.btn_plcstart["state"] = stateval
self.btn_plcstop["state"] = stateval
self.btn_plcrestart["state"] = stateval
+ self.btn_debug["state"] = stateval
+
+ def _closeall(self):
+ u"""Schließt alle Fenster."""
+ if self.tkcheckclient is not None:
+ self.tkcheckclient.destroy()
+ if self.tklogs is not None:
+ self.tklogs.master.destroy()
+ if self.tkoptions is not None:
+ self.tkoptions.destroy()
+ if self.tkprogram is not None:
+ self.tkprogram.destroy()
+ if self.debugframe is not None:
+ self.debugframe.destroy()
+ self.debugframe = None
def _createwidgets(self):
- """Erstellt den Fensterinhalt."""
+ u"""Erstellt den Fensterinhalt."""
# Hauptfenster
self.master.wm_title("RevPi Python PLC Loader")
self.master.wm_iconphoto(
@@ -122,26 +144,39 @@ class RevPiPyControl(tkinter.Frame):
self.txt_status["textvariable"] = self.var_status
self.txt_status.pack(fill="x")
- def _fillmbar(self):
- # PLC Menü
- self.mplc = tkinter.Menu(self.mbar, tearoff=False)
- self.mplc.add_command(label="PLC log...", command=self.plclogs)
- self.mplc.add_command(label="PLC monitor...", command=self.plcmonitor)
- self.mplc.add_command(label="PLC options...", command=self.plcoptions)
- self.mplc.add_command(label="PLC program...", command=self.plcprogram)
- self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled")
-
- # Connection Menü
- self.mconn = tkinter.Menu(self.mbar, tearoff=False)
- self.mbar.add_cascade(label="Connect", menu=self.mconn)
+ self.btn_debug = tkinter.Button(self)
+ self.btn_debug["text"] = "PLC Debugmodus"
+ self.btn_debug["command"] = self.plcdebug
+ self.btn_debug.pack(fill="x")
def _fillconnbar(self):
+ u"""Generiert Menüeinträge für Verbindungen."""
self.mconn.delete(0, "end")
for con in sorted(self.dict_conn.keys(), key=lambda x: x.lower()):
self.mconn.add_command(
label=con, command=partial(self._opt_conn, con)
)
+ def _fillmbar(self):
+ u"""Generiert Menüeinträge."""
+ # PLC Menü
+ self.mplc = tkinter.Menu(self.mbar, tearoff=False)
+ self.mplc.add_command(
+ label="PLC log...", command=self.plclogs)
+ self.mplc.add_command(
+ label="PLC options...", command=self.plcoptions)
+ self.mplc.add_command(
+ label="PLC program...", command=self.plcprogram)
+ self.mplc.add_separator()
+
+ self.mplc.add_command(
+ label="Disconnect", command=self.serverdisconnect)
+ self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled")
+
+ # Connection Menü
+ self.mconn = tkinter.Menu(self.mbar, tearoff=False)
+ self.mbar.add_cascade(label="Connect", menu=self.mconn)
+
def _opt_conn(self, text):
socket.setdefaulttimeout(2)
sp = ServerProxy(
@@ -151,6 +186,7 @@ class RevPiPyControl(tkinter.Frame):
)
# Server prüfen
try:
+ self.xmlfuncs = sp.system.listMethods()
self.xmlmode = sp.xmlmodus()
except:
self.servererror()
@@ -168,17 +204,30 @@ class RevPiPyControl(tkinter.Frame):
))
self.mbar.entryconfig("PLC", state="normal")
- def _closeall(self):
- if self.tkcheckclient is not None:
- self.tkcheckclient.destroy()
- if self.tklogs is not None:
- self.tklogs.master.destroy()
- if self.tkoptions is not None:
- self.tkoptions.destroy()
- if self.tkprogram is not None:
- self.tkprogram.destroy()
+ def plcdebug(self):
+ u"""Baut den Debugframe und packt ihn."""
+ self.btn_debug["state"] = "disabled"
+
+ # Debugfenster laden
+ if self.debugframe is None:
+ self.debugframe = revpicheckclient.RevPiCheckClient(
+ self, self.cli, self.xmlmode
+ )
+
+ # Show/Hide wechseln
+ if self.debugframe.winfo_viewable():
+ self.debugframe.hideallwindows()
+ self.debugframe.autorw.set(False)
+ self.debugframe.toggleauto()
+ self.debugframe.dowrite.set(False)
+ self.debugframe.pack_forget()
+ else:
+ self.debugframe.pack(fill="y")
+
+ self.btn_debug["state"] = "normal"
def plclist(self):
+ u"""Öffnet das Fenster für die Verbindungen."""
win = tkinter.Toplevel(self)
revpiplclist.RevPiPlcList(win)
win.focus_set()
@@ -188,24 +237,15 @@ class RevPiPyControl(tkinter.Frame):
self._fillconnbar()
def plclogs(self):
+ u"""Öffnet das Fenster für Logdateien."""
if self.tklogs is None or len(self.tklogs.children) == 0:
win = tkinter.Toplevel(self)
self.tklogs = revpilogfile.RevPiLogfile(win, self.cli)
else:
self.tklogs.focus_set()
- def plcmonitor(self):
- """Startet das Monitorfenster."""
- if self.tkcheckclient is None or len(self.tkcheckclient.children) == 0:
- win = tkinter.Toplevel(self)
- self.tkcheckclient = revpicheckclient.RevPiCheckClient(
- win, self.cli, self.xmlmode
- )
- else:
- self.tkcheckclient.focus_set()
-
def plcoptions(self):
- """Startet das Optionsfenster."""
+ u"""Startet das Optionsfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",
@@ -222,6 +262,7 @@ class RevPiPyControl(tkinter.Frame):
self.xmlmode = self.tkoptions.xmlmode
def plcprogram(self):
+ u"""Startet das Programmfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",
@@ -237,23 +278,30 @@ class RevPiPyControl(tkinter.Frame):
self.wait_window(win)
def plcstart(self):
+ u"""Startet das PLC Programm."""
self.cli.plcstart()
def plcstop(self):
+ u"""Beendet das PLC Programm."""
self.cli.plcstop()
def plcrestart(self):
+ u"""Startet das PLC Programm neu."""
self.cli.plcstop()
self.cli.plcstart()
- def servererror(self):
- """Setzt alles auf NULL."""
+ def serverdisconnect(self):
+ u"""Trennt eine bestehende Verbindung."""
socket.setdefaulttimeout(2)
self.cli = None
self._btnstate()
self.mbar.entryconfig("PLC", state="disabled")
self.var_conn.set("")
self._closeall()
+
+ def servererror(self):
+ u"""Setzt alles zurück für neue Verbindungen."""
+ self.serverdisconnect()
tkmsg.showerror("Fehler", "Server ist nicht erreichbar!")
def tmr_plcrunning(self):
From 8c8da29915b7be0f0c5e76386b185ec8c40407a1 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Thu, 29 Jun 2017 09:00:19 +0200
Subject: [PATCH 03/13] IO-Fenster nur in Y resizable Scrollrad an Canvas
gekoppelt (Linux) Exitcodes angepasst ?bersetzungstools eingebaut
?bersetzungen begonnen
---
revpipycontrol.e4p | 3 +-
revpipycontrol/mytools.py | 46 +++++
revpipycontrol/revpicheckclient.py | 40 +++--
revpipycontrol/revpiprogram.py | 272 +++++++++++++++++------------
revpipycontrol/revpipycontrol.py | 114 ++++++------
5 files changed, 297 insertions(+), 178 deletions(-)
create mode 100644 revpipycontrol/mytools.py
diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p
index 2908aac..b5d5115 100644
--- a/revpipycontrol.e4p
+++ b/revpipycontrol.e4p
@@ -1,7 +1,7 @@
-
+
en_US
@@ -21,6 +21,7 @@
revpipycontrol/revpilogfile.py
revpipycontrol/revpioption.py
revpipycontrol/revpiprogram.py
+ revpipycontrol/mytools.py
diff --git a/revpipycontrol/mytools.py b/revpipycontrol/mytools.py
new file mode 100644
index 0000000..858d53a
--- /dev/null
+++ b/revpipycontrol/mytools.py
@@ -0,0 +1,46 @@
+#
+# RevPiPyControl
+#
+# Webpage: https://revpimodio.org/revpipyplc/
+# (c) Sven Sager, License: LGPLv3
+#
+# -*- coding: utf-8 -*-
+import gettext
+import locale
+import sys
+from os.path import dirname
+from os.path import join as pathjoin
+
+
+def addroot(filename):
+ u"""Hängt root-dir der Anwendung vor Dateinamen.
+
+ Je nach Ausführungsart der Anwendung muss das root-dir über
+ andere Arten abgerufen werden.
+
+ @param filename: Datei oder Ordnername
+ @returns: root dir
+
+ """
+ if getattr(sys, "frozen", False):
+ return pathjoin(dirname(sys.executable), filename)
+ else:
+ return pathjoin(dirname(__file__), filename)
+
+
+def gettrans(proglang=None):
+
+ # Sprache auswählen
+ if proglang is None:
+ # Autodetect Language or switch to static
+ # proglang = "de"
+ proglang = locale.getdefaultlocale()[0].split('_')[0]
+
+ # Übersetzungen laden
+ trans = gettext.translation(
+ "revpipycontrol",
+ addroot("locale"),
+ languages=[proglang],
+ fallback=True
+ )
+ return trans.gettext
diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py
index 284ec88..c15c6ad 100644
--- a/revpipycontrol/revpicheckclient.py
+++ b/revpipycontrol/revpicheckclient.py
@@ -22,10 +22,7 @@ class RevPiCheckClient(tkinter.Frame):
# XML-Daten abrufen
self.xmlmode = xmlmode
self.cli = xmlcli
-
- # FIXME: Fehlerabfang
self.cli.psstart()
-
self.lst_devices = self.cli.ps_devices()
self.dict_inps = pickle.loads(self.cli.ps_inps().data)
self.dict_outs = pickle.loads(self.cli.ps_outs().data)
@@ -62,12 +59,35 @@ class RevPiCheckClient(tkinter.Frame):
def _createiogroup(self, device, frame, iotype):
"""Erstellt IO-Gruppen."""
- # IOs generieren
- canvas = tkinter.Canvas(frame, borderwidth=0, width=180, heigh=800)
+
+ # IO-Typen festlegen
+ if iotype == "inp":
+ lst_io = self.dict_inps[device]
+ else:
+ lst_io = self.dict_outs[device]
+
+ # Fensterinhalt aufbauen
+ calc_heigh = len(lst_io) * 21
+ canvas = tkinter.Canvas(
+ frame,
+ borderwidth=0,
+ width=180,
+ heigh=calc_heigh if calc_heigh <= 600 else 600
+ )
s_frame = tkinter.Frame(canvas)
vsb = tkinter.Scrollbar(frame, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
+ # Scrollrad Linux
+ canvas.bind(
+ "",
+ lambda x: canvas.yview_scroll(-1, "units")
+ )
+ canvas.bind(
+ "",
+ lambda x: canvas.yview_scroll(1, "units")
+ )
+
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
@@ -76,13 +96,8 @@ class RevPiCheckClient(tkinter.Frame):
"", lambda event, canvas=canvas: self._onfrmconf(canvas)
)
+ # IOs generieren
rowcount = 0
-
- if iotype == "inp":
- lst_io = self.dict_inps[device]
- else:
- lst_io = self.dict_outs[device]
-
for io in lst_io:
# io = [name,bytelen,byteaddr,bmk,bitaddress,(tkinter_var)]
@@ -101,8 +116,10 @@ class RevPiCheckClient(tkinter.Frame):
check.grid(column=1, row=rowcount)
else:
var = tkinter.IntVar()
+
# FIXME: Mehrere Bytes möglich
txt = tkinter.Spinbox(s_frame, to=255 * io[1])
+
txt["command"] = \
lambda device=device, io=io: self.__chval(device, io)
txt["state"] = "disabled" if iotype == "inp" else "normal"
@@ -129,6 +146,7 @@ class RevPiCheckClient(tkinter.Frame):
"WM_DELETE_WINDOW",
lambda win=win: self.__hidewin(win)
)
+ win.resizable(False, True)
win.withdraw()
self.lst_wins.append(win)
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 55f41df..96d733e 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -13,6 +13,7 @@ import tkinter
import tkinter.filedialog as tkfd
import tkinter.messagebox as tkmsg
import zipfile
+from mytools import gettrans
from os import environ
from os import makedirs
from shutil import rmtree
@@ -20,6 +21,8 @@ from sys import platform
from tempfile import mkstemp, mkdtemp
from xmlrpc.client import Binary
+# Übersetzung laden
+_ = gettrans()
# Systemwerte
if platform == "linux":
@@ -37,7 +40,8 @@ class RevPiProgram(tkinter.Frame):
return None
super().__init__(master)
-# master.protocol("WM_DELETE_WINDOW", self._checkclose)
+ # FIXME: Warnung kann nerven
+ # self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
self.pack(expand=True, fill="both")
self.uploaded = False
@@ -55,15 +59,20 @@ class RevPiProgram(tkinter.Frame):
self._evt_optdown()
self._evt_optup()
-# def _checkclose(self):
-# if self.uploaded:
-# tkmsg.showinfo("Ein PLC Programm wurde hochgeladen. "
-# "Bitte die PLC options prüfen ob dort das neue Programm"
-# "eingestellt werden muss.")
-# self.master.destroy()
+ def _checkclose(self):
+ if True or self.uploaded:
+ tkmsg.showinfo(
+ parent=self.master, title=_("Information"),
+ message=_(
+ "A PLC program has been uploaded. Please check the "
+ "PLC options to see if the correct program is specified "
+ "as the start program."
+ )
+ )
+ self.master.destroy()
def _createwidgets(self):
- self.master.wm_title("RevPi Python PLC Programm")
+ self.master.wm_title(_("RevPi python PLC programm"))
self.master.wm_resizable(width=False, height=False)
self.rowconfigure(0, weight=1)
@@ -77,7 +86,7 @@ class RevPiProgram(tkinter.Frame):
# Gruppe Programm
prog = tkinter.LabelFrame(self)
prog.columnconfigure(0, weight=1)
- prog["text"] = "PLC Python programm"
+ prog["text"] = _("PLC python programm")
prog.grid(columnspan=2, pady=2, sticky="we")
# Variablen vorbereiten
@@ -87,16 +96,26 @@ class RevPiProgram(tkinter.Frame):
self.var_typedown = tkinter.StringVar(prog)
self.var_typeup = tkinter.StringVar(prog)
- self.lst_typedown = ["Dateien", "Zip Archiv", "TGZ Archiv"]
- self.lst_typeup = ["Dateien", "Ordner", "Zip Archiv", "TGZ Archiv"]
+ self.lst_typedown = [_("Files"), _("Zip archive"), _("TGZ archive")]
+ self.lst_typeup = [
+ _("Files"), _("Folder"), _("Zip archive"), _("TGZ archive")
+ ]
self.var_picdown.set(self.opt.get("picdown", False))
self.var_picup.set(self.opt.get("picup", False))
- self.var_typedown.set(self.opt.get("typedown", self.lst_typedown[0]))
- self.var_typeup.set(self.opt.get("typeup", self.lst_typeup[0]))
+
+ # Gespeicherte Werte übernehmen
+ saved_val = self.opt.get("typedown", self.lst_typedown[0])
+ self.var_typedown.set(
+ saved_val if saved_val in self.lst_typedown else _("Files")
+ )
+ saved_val = self.opt.get("typeup", self.lst_typeup[0])
+ self.var_typeup.set(
+ saved_val if saved_val in self.lst_typeup else _("Files")
+ )
r = 0
lbl = tkinter.Label(prog)
- lbl["text"] = "PLC Programm herunterladen als:"
+ lbl["text"] = _("Download PLC program as:")
lbl.grid(column=0, row=r, **cpadw)
opt = tkinter.OptionMenu(
prog, self.var_typedown, *self.lst_typedown,
@@ -106,17 +125,17 @@ class RevPiProgram(tkinter.Frame):
r = 1
self.ckb_picdown = tkinter.Checkbutton(prog)
- self.ckb_picdown["text"] = "inkl. piCtory Konfiguration"
+ self.ckb_picdown["text"] = _("include piCtory configuration")
self.ckb_picdown["variable"] = self.var_picdown
self.ckb_picdown.grid(column=0, row=r, **cpadw)
btn = tkinter.Button(prog)
btn["command"] = self.plcdownload
- btn["text"] = "Download"
+ btn["text"] = _("Download")
btn.grid(column=1, row=r, **cpad)
r = 2
lbl = tkinter.Label(prog)
- lbl["text"] = "PLC Programm hochladen als:"
+ lbl["text"] = _("Upload PLC program as:")
lbl.grid(column=0, row=r, **cpadw)
opt = tkinter.OptionMenu(
prog, self.var_typeup, *self.lst_typeup,
@@ -128,74 +147,74 @@ class RevPiProgram(tkinter.Frame):
r = 3
ckb = tkinter.Checkbutton(prog)
ckb["state"] = self.xmlstate
- ckb["text"] = "vorher alles im Uploadverzeichnis löschen"
+ ckb["text"] = _("clean upload folder before upload")
ckb["variable"] = self.var_cleanup
ckb.grid(column=0, row=r, columnspan=2, **cpadw)
r = 4
self.ckb_picup = tkinter.Checkbutton(prog)
self.ckb_picup["state"] = self.xmlstate
- self.ckb_picup["text"] = "enthält piCtory Konfiguration"
+ self.ckb_picup["text"] = _("includes piCtory configuration")
self.ckb_picup["variable"] = self.var_picup
self.ckb_picup.grid(column=0, row=r, **cpadw)
btn = tkinter.Button(prog)
btn["command"] = self.plcupload
btn["state"] = self.xmlstate
- btn["text"] = "Upload"
+ btn["text"] = _("Upload")
btn.grid(column=1, row=r, **cpad)
# Gruppe piCtory
picto = tkinter.LabelFrame(self)
picto.columnconfigure(0, weight=1)
- picto["text"] = "piCtory Konfiguration"
+ picto["text"] = _("piCtory configuration")
picto.grid(columnspan=2, pady=2, sticky="we")
lbl = tkinter.Label(picto)
- lbl["text"] = "piCtory Konfiguration herunterladen"
+ lbl["text"] = _("Download piCtory configuration")
lbl.grid(column=0, row=0, **cpadw)
btn = tkinter.Button(picto)
btn["command"] = self.getpictoryrsc
- btn["text"] = "Download"
+ btn["text"] = _("Download")
btn.grid(column=1, row=0, **cpad)
lbl = tkinter.Label(picto)
- lbl["text"] = "piCtory Konfiguration hochladen"
+ lbl["text"] = _("Upload piCtory configuration")
lbl.grid(column=0, row=1, **cpadw)
btn = tkinter.Button(picto)
btn["command"] = self.setpictoryrsc
btn["state"] = self.xmlstate
- btn["text"] = "Upload"
+ btn["text"] = _("Upload")
btn.grid(column=1, row=1, **cpad)
# Gruppe ProcImg
proc = tkinter.LabelFrame(self)
proc.columnconfigure(0, weight=1)
- proc["text"] = "piControl0 Prozessabbild"
+ proc["text"] = _("piControl0 prozess image")
proc.grid(columnspan=2, pady=2, sticky="we")
lbl = tkinter.Label(proc)
- lbl["text"] = "Prozessabbild-Dump herunterladen"
+ lbl["text"] = _("Download process image dump")
lbl.grid(column=0, row=0, **cpadw)
btn = tkinter.Button(proc)
btn["command"] = self.getprocimg
- btn["text"] = "Download"
+ btn["text"] = _("Download")
btn.grid(column=1, row=0, **cpad)
# Gruppe piControlReset
picon = tkinter.LabelFrame(self)
picon.columnconfigure(0, weight=1)
- picon["text"] = "piControl Reset"
+ picon["text"] = _("Reset piControl")
picon.grid(columnspan=2, pady=2, sticky="we")
lbl = tkinter.Label(picon)
- lbl["text"] = "piControlReset ausführen"
+ lbl["text"] = _("Execute piControlReset")
lbl.grid(column=0, row=0, **cpadw)
btn = tkinter.Button(picon)
btn["command"] = self.picontrolreset
- btn["text"] = "ausführen"
+ btn["text"] = _("execute")
btn.grid(column=1, row=0, **cpad)
# Beendenbutton
btn = tkinter.Button(self)
btn["command"] = self.master.destroy
- btn["text"] = "Beenden"
+ btn["text"] = _("Exit")
btn.grid()
def _evt_optdown(self, text=""):
@@ -275,25 +294,23 @@ class RevPiProgram(tkinter.Frame):
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
- title="Speichern als...",
+ title=_("Save as..."),
initialdir=self.opt.get("getpictoryrsc_dir", ""),
initialfile=self.revpi + ".rsc",
- filetypes=(("piCtory Config", "*.rsc"), ("All Files", "*.*"))
+ filetypes=((_("piCtory Config"), "*.rsc"), (_("All files"), "*.*"))
)
if fh is not None:
try:
fh.write(self.xmlcli.get_pictoryrsc().data)
except:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Datei konnte nicht geladen und gespeichert "
- "werden!"
+ parent=self.master, title=_("Error"),
+ message=_("Could not load and save file!")
)
else:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Datei erfolgreich vom Revolution Pi geladen "
- "und gespeichert.",
+ parent=self.master, title=_("Success"),
+ message=_("File successfully loaded and saved.")
)
# Einstellungen speichern
self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name)
@@ -306,25 +323,23 @@ class RevPiProgram(tkinter.Frame):
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
- title="Speichern als...",
+ title=_("Save as..."),
initialdir=self.opt.get("getprocimg_dir", ""),
initialfile=self.revpi + ".img",
- filetypes=(("Imagefiles", "*.img"), ("All Files", "*.*"))
+ filetypes=((_("Imagefiles"), "*.img"), (_("All files"), "*.*"))
)
if fh is not None:
try:
fh.write(self.xmlcli.get_procimg().data)
except:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Datei konnte nicht geladen und gespeichert"
- "werden!"
+ parent=self.master, title=_("Error"),
+ message=_("Could not load and save file!")
)
else:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Datei erfolgreich vom Revolution Pi geladen "
- "und gespeichert.",
+ parent=self.master, title=_("Success"),
+ message=_("File successfully loaded and saved.")
)
# Einstellungen speichern
self.opt["getprocimg_dir"] = os.path.dirname(fh.name)
@@ -337,19 +352,23 @@ class RevPiProgram(tkinter.Frame):
if filename is None:
fh = tkfd.askopenfile(
mode="rb", parent=self.master,
- title="piCtory Datei öffnen...",
+ title=_("Open piCtory file..."),
initialdir=self.opt.get("setpictoryrsc_dir", ""),
initialfile=self.revpi + ".rsc",
- filetypes=(("piCtory Config", "*.rsc"), ("All Files", "*.*"))
+ filetypes=(
+ (_("piCtory config"), "*.rsc"), (_("All files"), "*.*")
+ )
)
else:
fh = open(filename, "rb")
if fh is not None:
ask = tkmsg.askyesno(
- parent=self.master, title="Frage",
- message="Soll nach dem Hochladen der piCtory Konfiguration "
- "ein Reset am piControl Treiber durchgeführt werden?"
+ parent=self.master, title=_("Question"),
+ message=_(
+ "Should the piControl driver be reset after "
+ "uploading the piCtory configuration?"
+ )
)
ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask)
@@ -357,52 +376,66 @@ class RevPiProgram(tkinter.Frame):
if ec == 0:
if ask:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Die Übertragung der piCtory Konfiguration "
- "und der Reset von piControl wurden erfolgreich "
- "ausgeführt")
+ parent=self.master, title=_("Success"),
+ message=_(
+ "The transfer of the piCtory configuration "
+ "and the reset of piControl have been "
+ "successfully executed"
+ )
+ )
else:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Die Übertragung der piCtory Konfiguration "
- "wurde erfolgreich ausgeführt")
+ parent=self.master, title=_("Success"),
+ message=_(
+ "The piCtory configuration was "
+ "successfully transferred"
+ )
+ )
# Einstellungen speichern
self.opt["setpictoryrsc_dir"] = os.path.dirname(fh.name)
self._savedefaults()
elif ec < 0:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Die piCtory Konfiguration konnte auf dem "
- "Revolution Pi nicht geschrieben werden.")
+ parent=self.master, title=_("Error"),
+ message=_(
+ "The piCtory configuration could not be "
+ "written on the Revolution Pi."
+ )
+ )
elif ec > 0:
tkmsg.showwarning(
- parent=self.master, title="Warnung",
- message="Die piCtroy Konfiguration wurde erfolgreich "
- "gespeichert. \nBeim piControl Reset trat allerdings ein "
- "Fehler auf!")
+ parent=self.master, title=_("Warning"),
+ message=_(
+ "The piCtroy configuration has been saved "
+ "successfully. \nAn error occurred on piControl reset!"
+ )
+ )
fh.close()
def picontrolreset(self):
u"""Fürt ein Reset der piBridge durch."""
ask = tkmsg.askyesno(
- parent=self.master, title="Frage...",
- message="Soll piControlReset wirklich durchgeführt werden? \n"
- "Das Prozessabbild und die Steuerung werden dann unterbrochen!!!"
+ parent=self.master, title=_("Question"),
+ message=_(
+ "Are you sure to reset piControl? \nThe process image "
+ "and the piBridge are interrupted !!!"
+ )
)
if ask:
ec = self.xmlcli.resetpicontrol()
if ec == 0:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="piControlReset erfolgreich durchgeführt"
+ parent=self.master, title=_("Success"),
+ message=_("piControlReset executed successfully")
)
else:
tkmsg.showerror(
- parten=self.master, title="Fehler",
- message="piControlReset konnte nicht erfolgreich "
- "durchgeführt werden"
+ parten=self.master, title=_("Error"),
+ message=_(
+ "piControl reset could not be executed successfully"
+ )
)
def plcdownload(self):
@@ -415,7 +448,7 @@ class RevPiProgram(tkinter.Frame):
# Ordner
dirselect = tkfd.askdirectory(
parent=self.master,
- title="Verzeichnis zum Ablegen",
+ title=_("Directory to save"),
mustexist=False,
initialdir=self.opt.get("plcdownload_dir", self.revpi)
)
@@ -428,10 +461,12 @@ class RevPiProgram(tkinter.Frame):
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
- title="Speichern als...",
+ title=_("Save as..."),
initialdir=self.opt.get("plcdownload_file", ""),
initialfile=self.revpi + ".zip",
- filetypes=(("Zip Archiv", "*.zip"), ("All Files", "*.*"))
+ filetypes=(
+ (_("Zip archive"), "*.zip"), (_("All files"), "*.*")
+ )
)
elif tdown == 2:
@@ -439,10 +474,12 @@ class RevPiProgram(tkinter.Frame):
fh = tkfd.asksaveasfile(
mode="wb", parent=self.master,
confirmoverwrite=True,
- title="Speichern als...",
+ title=_("Save as..."),
initialdir=self.opt.get("plcdownload_file", ""),
initialfile=self.revpi + ".tar.gz",
- filetypes=(("Tar Archiv", "*.tar.gz"), ("All Files", "*.*"))
+ filetypes=(
+ (_("TGZ archive"), "*.tar.gz"), (_("All files"), "*.*")
+ )
)
if fh is not None:
@@ -480,15 +517,13 @@ class RevPiProgram(tkinter.Frame):
except:
raise
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Datei konnte nicht geladen und gespeichert "
- "werden!"
+ parent=self.master, title=_("Error"),
+ message=_("Could not load and save file!")
)
else:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Datei erfolgreich vom Revolution Pi geladen "
- "und gespeichert.",
+ parent=self.master, title=_("Success"),
+ message=_("File successfully loaded and saved.")
)
# Einstellungen speichern
@@ -509,9 +544,9 @@ class RevPiProgram(tkinter.Frame):
# Datei
fileselect = tkfd.askopenfilenames(
parent=self.master,
- title="Python Programm übertragen...",
+ title="Upload Python program...",
initialdir=self.opt.get("plcupload_dir", ""),
- filetypes=(("Python", "*.py"), ("All Files", "*.*"))
+ filetypes=(("Python", "*.py"), (_("All files"), "*.*"))
)
if type(fileselect) == tuple and len(fileselect) > 0:
for file in fileselect:
@@ -521,7 +556,7 @@ class RevPiProgram(tkinter.Frame):
# Ordner
dirselect = tkfd.askdirectory(
parent=self.master,
- title="Verzeichnis zum Hochladen",
+ title=_("Folder to upload"),
mustexist=True,
initialdir=self.opt.get("plcupload_dir", self.revpi)
)
@@ -532,10 +567,12 @@ class RevPiProgram(tkinter.Frame):
# Zip
fileselect = tkfd.askopenfilename(
parent=self.master,
- title="Zip-Archive übertragen...",
+ title=_("Upload Zip archive..."),
initialdir=self.opt.get("plcupload_file", ""),
initialfile=self.revpi + ".zip",
- filetypes=(("Zip Archiv", "*.zip"), ("All Files", "*.*"))
+ filetypes=(
+ (_("Zip archive"), "*.zip"), (_("All files"), "*.*")
+ )
)
if type(fileselect) == str and fileselect != "":
# Zipdatei prüfen
@@ -550,18 +587,21 @@ class RevPiProgram(tkinter.Frame):
else:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Die angegebene Datei ist kein ZIP-Archiv.")
+ parent=self.master, title=_("Error"),
+ message=_("The specified file is not a ZIP archive.")
+ )
return False
elif tup == 3:
# TarGz
fileselect = tkfd.askopenfilename(
parent=self.master,
- title="TarGz-Archiv übertragen...",
+ title=_("Upload TarGz archiv..."),
initialdir=self.opt.get("plcupload_file", ""),
initialfile=self.revpi + ".tar.gz",
- filetypes=(("Tar Archiv", "*.tar.gz"), ("All Files", "*.*"))
+ filetypes=(
+ (_("TGZ archive"), "*.tar.gz"), (_("All files"), "*.*")
+ )
)
if type(fileselect) == str and fileselect != "":
@@ -577,8 +617,9 @@ class RevPiProgram(tkinter.Frame):
else:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Die angegebene Datei ist kein TAR-Archiv.")
+ parent=self.master, title=_("Error"),
+ message=_("The specified file is not a TAR archive.")
+ )
return False
# Wenn keine Dateien gewählt
@@ -588,9 +629,12 @@ class RevPiProgram(tkinter.Frame):
# Vor Übertragung aufräumen wenn ausgewählt
if self.var_cleanup.get() and not self.xmlcli.plcuploadclean():
tkmsg.showerror(
- parent=self.masger, title="Fehler",
- message="Beim Löschen der Dateien auf dem Revolution Pi ist "
- "ein Fehler aufgetreten.")
+ parent=self.masger, title=_("Error"),
+ message=_(
+ "There was an error deleting the files on the "
+ "Revolution Pi."
+ )
+ )
return False
# Flag setzen, weil ab hier Veränderungen existieren
@@ -625,17 +669,21 @@ class RevPiProgram(tkinter.Frame):
if ec == 0:
tkmsg.showinfo(
- parent=self.master, title="Erfolgreich",
- message="Die Übertragung war erfolgreich.")
+ parent=self.master, title=_("Success"),
+ message=_("The transfer was successful.")
+ )
if self.var_picup.get():
if rscfile is not None:
self.setpictoryrsc(rscfile)
else:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Es wurde im Archiv keine piCtory "
- "Konfiguration gefunden")
+ parent=self.master, title=_("Error"),
+ message=_(
+ "There is no piCtory configuration in this "
+ "archive."
+ )
+ )
# Einstellungen speichern
if tup == 0:
@@ -651,14 +699,18 @@ class RevPiProgram(tkinter.Frame):
elif ec == -1:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Der Revoluton Pi konnte Teile der Übertragung nicht "
- "verarbeiten.")
+ parent=self.master, title=_("Error"),
+ message=_(
+ "The Revolution Pi could not process some parts of the "
+ "transmission."
+ )
+ )
elif ec == -2:
tkmsg.showerror(
- parent=self.master, title="Fehler",
- message="Bei der Übertragung traten Fehler auf")
+ parent=self.master, title=_("Error"),
+ message=_("Errors occurred during transmission")
+ )
# Temp-Dir aufräumen
if dirtmp is not None:
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index de8cfb5..dd131cf 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -13,29 +13,15 @@ import revpioption
import revpiplclist
import revpiprogram
import socket
-import sys
import tkinter
import tkinter.messagebox as tkmsg
from functools import partial
-from os.path import dirname
-from os.path import join as pathjoin
+from mytools import addroot, gettrans
from xmlrpc.client import ServerProxy
-def addroot(filename):
- u"""Hängt root-dir der Anwendung vor Dateinamen.
-
- Je nach Ausführungsart der Anwendung muss das root-dir über
- andere Arten abgerufen werden.
-
- @param filename: Datei oder Ordnername
- @returns: root dir
-
- """
- if getattr(sys, "frozen", False):
- return pathjoin(dirname(sys.executable), filename)
- else:
- return pathjoin(dirname(__file__), filename)
+# Übersetzung laden
+_ = gettrans()
class RevPiPyControl(tkinter.Frame):
@@ -105,10 +91,10 @@ class RevPiPyControl(tkinter.Frame):
self.master.config(menu=self.mbar)
menu1 = tkinter.Menu(self.mbar, tearoff=False)
- menu1.add_command(label="Connections...", command=self.plclist)
+ menu1.add_command(label=_("Connections..."), command=self.plclist)
menu1.add_separator()
- menu1.add_command(label="Exit", command=self.master.destroy)
- self.mbar.add_cascade(label="Main", menu=menu1)
+ menu1.add_command(label=_("Exit"), command=self.master.destroy)
+ self.mbar.add_cascade(label=_("Main"), menu=menu1)
self._fillmbar()
self._fillconnbar()
@@ -119,22 +105,22 @@ class RevPiPyControl(tkinter.Frame):
self.txt_connect.pack(fill="x")
self.btn_plcstart = tkinter.Button(self)
- self.btn_plcstart["text"] = "PLC Start"
+ 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["text"] = "PLC Stop"
+ 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["text"] = "PLC Restart"
+ 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["text"] = "PLC Logs"
+ self.btn_plclogs["text"] = _("PLC logs")
self.btn_plclogs["command"] = self.plclogs
self.btn_plclogs.pack(fill="x")
@@ -145,7 +131,7 @@ class RevPiPyControl(tkinter.Frame):
self.txt_status.pack(fill="x")
self.btn_debug = tkinter.Button(self)
- self.btn_debug["text"] = "PLC Debugmodus"
+ self.btn_debug["text"] = _("PLC watch mode")
self.btn_debug["command"] = self.plcdebug
self.btn_debug.pack(fill="x")
@@ -162,20 +148,20 @@ class RevPiPyControl(tkinter.Frame):
# PLC Menü
self.mplc = tkinter.Menu(self.mbar, tearoff=False)
self.mplc.add_command(
- label="PLC log...", command=self.plclogs)
+ label=_("PLC log..."), command=self.plclogs)
self.mplc.add_command(
- label="PLC options...", command=self.plcoptions)
+ label=_("PLC options..."), command=self.plcoptions)
self.mplc.add_command(
- label="PLC program...", command=self.plcprogram)
+ label=_("PLC program..."), command=self.plcprogram)
self.mplc.add_separator()
self.mplc.add_command(
- label="Disconnect", command=self.serverdisconnect)
+ label=_("Disconnect"), command=self.serverdisconnect)
self.mbar.add_cascade(label="PLC", menu=self.mplc, state="disabled")
# Connection Menü
self.mconn = tkinter.Menu(self.mbar, tearoff=False)
- self.mbar.add_cascade(label="Connect", menu=self.mconn)
+ self.mbar.add_cascade(label=_("Connect"), menu=self.mconn)
def _opt_conn(self, text):
socket.setdefaulttimeout(2)
@@ -208,23 +194,33 @@ class RevPiPyControl(tkinter.Frame):
u"""Baut den Debugframe und packt ihn."""
self.btn_debug["state"] = "disabled"
- # Debugfenster laden
- if self.debugframe is None:
- self.debugframe = revpicheckclient.RevPiCheckClient(
- self, self.cli, self.xmlmode
+ if "psstart" not in self.xmlfuncs:
+ tkmsg.showwarning(
+ parent=self.master, title=_("Warning"),
+ message=_(
+ "The watch mode ist not supported in version {} "
+ "of RevPiPyLoad on your RevPi! You need at least version "
+ "0.4.0."
+ ).format(self.cli.version())
)
-
- # Show/Hide wechseln
- if self.debugframe.winfo_viewable():
- self.debugframe.hideallwindows()
- self.debugframe.autorw.set(False)
- self.debugframe.toggleauto()
- self.debugframe.dowrite.set(False)
- self.debugframe.pack_forget()
else:
- self.debugframe.pack(fill="y")
+ # Debugfenster laden
+ if self.debugframe is None:
+ self.debugframe = revpicheckclient.RevPiCheckClient(
+ self, self.cli, self.xmlmode
+ )
- self.btn_debug["state"] = "normal"
+ # Show/Hide wechseln
+ if self.debugframe.winfo_viewable():
+ self.debugframe.hideallwindows()
+ self.debugframe.autorw.set(False)
+ self.debugframe.toggleauto()
+ self.debugframe.dowrite.set(False)
+ self.debugframe.pack_forget()
+ else:
+ self.debugframe.pack(fill="y")
+
+ self.btn_debug["state"] = "normal"
def plclist(self):
u"""Öffnet das Fenster für die Verbindungen."""
@@ -249,8 +245,10 @@ class RevPiPyControl(tkinter.Frame):
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",
- message="Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch "
- "genug eingestellt, um diesen Dialog zu verwenden!"
+ message=_(
+ "XML-RPC access mode in the RevPiPyLoad "
+ "configuration is to small to access this dialog"
+ )
)
else:
win = tkinter.Toplevel(self)
@@ -266,8 +264,10 @@ class RevPiPyControl(tkinter.Frame):
if self.xmlmode < 2:
tkmsg.showwarning(
parent=self.master, title="Warnung",
- message="Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch "
- "genug eingestellt, um diesen Dialog zu verwenden!"
+ message=_(
+ "XML-RPC access mode in the RevPiPyLoad "
+ "configuration is to small to access this dialog"
+ )
)
else:
win = tkinter.Toplevel(self)
@@ -302,20 +302,20 @@ class RevPiPyControl(tkinter.Frame):
def servererror(self):
u"""Setzt alles zurück für neue Verbindungen."""
self.serverdisconnect()
- tkmsg.showerror("Fehler", "Server ist nicht erreichbar!")
+ tkmsg.showerror(_("Fehler"), _("Server ist nicht erreichbar!"))
def tmr_plcrunning(self):
self._btnstate()
if self.cli is None:
self.txt_status["readonlybackground"] = "lightblue"
- self.var_status.set("NOT CONNECTED")
+ self.var_status.set(_("NOT CONNECTED"))
else:
try:
plcec = self.cli.plcexitcode()
except:
self.errcount += 1
if self.errcount >= 5:
- self.var_status.set("SERVER ERROR")
+ self.var_status.set(_("SERVER ERROR"))
self.servererror()
else:
self.errcount = 0
@@ -323,15 +323,17 @@ class RevPiPyControl(tkinter.Frame):
"green" if plcec == -1 else "red"
if plcec == -1:
- plcec = "RUNNING"
+ plcec = _("RUNNING")
elif plcec == -2:
- plcec = "FILE NOT FOUND"
+ plcec = _("FILE NOT FOUND")
+ elif plcec == -3:
+ plcec = _("NOT RUNNING (NO STATUS)")
elif plcec == -9:
- plcec = "PROGRAM KILLED"
+ plcec = _("PROGRAM KILLED")
elif plcec == -15:
- plcec = "PROGRAMS TERMED"
+ plcec = _("PROGRAM TERMED")
elif plcec == 0:
- plcec = "NOT RUNNING"
+ plcec = _("NOT RUNNING")
self.var_status.set(plcec)
self.master.after(1000, self.tmr_plcrunning)
From 624b6f697210297147956e3fa23c37b60725cba9 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Thu, 29 Jun 2017 12:48:22 +0200
Subject: [PATCH 04/13] RevPiPlcList vor Schlie?en sch?tzen Quelltext f?r
?bersetzung angepasst ?bersetzung mit poedit durchgef?hrt
---
.../locale/de/LC_MESSAGES/revpipycontrol.po | 551 ++++++++++++++++++
revpipycontrol/mytools.py | 2 +-
revpipycontrol/revpicheckclient.py | 18 +-
revpipycontrol/revpilogfile.py | 14 +-
revpipycontrol/revpioption.py | 68 ++-
revpipycontrol/revpiplclist.py | 43 +-
revpipycontrol/revpiprogram.py | 13 +-
revpipycontrol/revpipycontrol.py | 36 +-
8 files changed, 663 insertions(+), 82 deletions(-)
create mode 100644 revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
new file mode 100644
index 0000000..6b325a0
--- /dev/null
+++ b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
@@ -0,0 +1,551 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: RevPiPyControl 0.4.0\n"
+"POT-Creation-Date: 2017-06-29 12:39+0200\n"
+"PO-Revision-Date: 2017-06-29 12:39+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-Poedit-Basepath: ../../..\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-SearchPath-0: .\n"
+
+#: revpicheckclient.py:143
+msgid "Devices of RevPi"
+msgstr "Devices vom RevPi"
+
+#: revpicheckclient.py:175
+msgid "Control"
+msgstr "Kontrolle"
+
+#: revpicheckclient.py:179
+msgid "Read all IOs"
+msgstr "IOs aktualisieren"
+
+#: revpicheckclient.py:184
+msgid "Read just Inputs"
+msgstr "Inputs lesen"
+
+#: revpicheckclient.py:189
+msgid "Write Outputs"
+msgstr "Outputs schreiben"
+
+#: revpicheckclient.py:195
+msgid "Autorefresh values"
+msgstr "Aktualisiere automatisch"
+
+#: revpicheckclient.py:201
+msgid "Write values to RevPi"
+msgstr "Schreibe Werte auf RevPi"
+
+#: revpilogfile.py:27
+msgid "RevPi Python PLC Logs"
+msgstr "RevPi Python PLC Logdaten"
+
+#: revpilogfile.py:40
+msgid "RevPiPyLoad - Logfile"
+msgstr "RevPiPyLoad - Logdatei"
+
+#: revpilogfile.py:44 revpilogfile.py:59
+msgid "Clear screen"
+msgstr "Leere Ansicht"
+
+#: revpilogfile.py:55
+msgid "Python PLC program - Logfile"
+msgstr "Python PLC Programm - Logdatei"
+
+#: revpioption.py:33
+msgid "RevPi Python PLC Options"
+msgstr "RevPi Python PLC Einstellungen"
+
+#: revpioption.py:41
+msgid "Start / Stop behavior"
+msgstr "Start / Stop Verhalten"
+
+#: revpioption.py:50
+msgid "Start program automatically"
+msgstr "Starte Programm automatisch"
+
+#: revpioption.py:56
+msgid "Restart program after exit"
+msgstr "Starte Programm nach Beenden neu"
+
+#: revpioption.py:63
+msgid ""
+"Set process image to NULL if program\n"
+"terminates successfully"
+msgstr ""
+"\"Prozessabbild auf NULL setzen, wenn Programm\n"
+"\"erfolgreich beendet wird\""
+
+#: revpioption.py:70
+msgid ""
+"Set process image to NULL if program\n"
+"terminates with errors"
+msgstr ""
+"Prozessabbild auf NULL setzen, wenn Programm\n"
+"fehlerhaft beendet wird"
+
+#: revpioption.py:77
+msgid "PLC program"
+msgstr "PLC Programm"
+
+#: revpioption.py:88
+msgid "Python version"
+msgstr "Python Version"
+
+#: revpioption.py:105
+msgid "Python PLC program name"
+msgstr "Python PLC Programmname"
+
+#: revpioption.py:117
+msgid "Program arguments"
+msgstr "Programmargumente"
+
+#: revpioption.py:126
+msgid "Use RevPi as PLC-Slave"
+msgstr "RevPi als PLC-Slave verwenden"
+
+#: revpioption.py:133
+msgid "XML-RPC server"
+msgstr "XML-RPC Server"
+
+#: revpioption.py:145
+msgid "Activate XML-RPC server on RevPi"
+msgstr "Aktiviere XML-RPC Server auf RevPi"
+
+#: revpioption.py:153
+msgid ""
+"Allow download of piCtory configuration and\n"
+"PLC programm"
+msgstr ""
+"Download von piCtroy Konfiguration und\n"
+"PLC Programm zulassen"
+
+#: revpioption.py:160
+msgid ""
+"Allow upload of piCtory configuration and\n"
+"PLC programm"
+msgstr ""
+"Hochladen von piCtroy Konfiguration und\n"
+"PLC Programm zulassen"
+
+#: revpioption.py:165
+msgid "XML-RPC server port"
+msgstr "XML-RPC Serverport"
+
+#: revpioption.py:179 revpiplclist.py:112
+msgid "Save"
+msgstr "Speichern"
+
+#: revpioption.py:184 revpiplclist.py:115
+msgid "Close"
+msgstr "Schließen"
+
+#: revpioption.py:230 revpioption.py:254 revpiplclist.py:151
+#: revpiplclist.py:176 revpiprogram.py:367 revpiprogram.py:420
+msgid "Question"
+msgstr "Frage"
+
+#: revpioption.py:231
+msgid ""
+"The settings are now saved on the Revolution Pi. \n"
+"\n"
+"Should the new settings take effect immediately? \n"
+"This means a restart of the service and the PLC program!"
+msgstr ""
+"Die Einstellungen werden jetzt auf dem Revolution Pi gespeichert.\n"
+"\n"
+"Sollen die neuen Einstellungen sofort in Kraft treten?\n"
+"Dies bedeutet einen Neustart des Dienstes und des laufenden PLC-Programms!"
+
+#: revpioption.py:239 revpiplclist.py:191 revpiprogram.py:65
+msgid "Information"
+msgstr "Information"
+
+#: revpioption.py:240
+msgid "Settings saved"
+msgstr "Einstellungen gespeichert"
+
+#: revpioption.py:245 revpiplclist.py:199 revpiprogram.py:307
+#: revpiprogram.py:336 revpiprogram.py:400 revpiprogram.py:435
+#: revpiprogram.py:520 revpiprogram.py:590 revpiprogram.py:620
+#: revpiprogram.py:632 revpiprogram.py:681 revpiprogram.py:702
+#: revpiprogram.py:711 revpipycontrol.py:308
+msgid "Error"
+msgstr "Fehler"
+
+#: revpioption.py:246
+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!"
+
+#: revpioption.py:255
+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."
+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:54
+msgid "RevPi Python PLC connections"
+msgstr "RevPi Python PLC Verbindungen"
+
+#: revpiplclist.py:75
+msgid "Name"
+msgstr "Name"
+
+#: revpiplclist.py:82
+msgid "IP address"
+msgstr "IP Adresse"
+
+#: revpiplclist.py:90
+msgid "Port"
+msgstr "Port"
+
+#: revpiplclist.py:99
+msgid "New"
+msgstr "Neu"
+
+#: revpiplclist.py:102
+msgid "Apply"
+msgstr "Übernehmen"
+
+#: revpiplclist.py:106
+msgid "Remove"
+msgstr "Entfernen"
+
+#: revpiplclist.py:152
+msgid ""
+"Do you really want to quit? \n"
+"Unsaved changes will be lost"
+msgstr ""
+"Wollen Sie wirklich beenden? \n"
+"Nicht gespeicherte Änderungen gehen verloren"
+
+#: 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:192
+msgid ""
+"Successfully saved. \n"
+"Do you want to close this window?"
+msgstr ""
+"Verbindungen erfolgreich gespeichert. \n"
+"Möchten Sie dieses Fenster jetzt schließen?"
+
+#: revpiplclist.py:200
+msgid "Failed to save connections"
+msgstr "Verbindungen konnten nicht gespeichert werden"
+
+#: revpiprogram.py:67
+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:75
+msgid "RevPi Python PLC program"
+msgstr "RevPi Python PLC Programm"
+
+#: revpiprogram.py:89
+msgid "PLC python program"
+msgstr "PLC Python Programm"
+
+#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:109
+#: revpiprogram.py:113
+msgid "Files"
+msgstr "Dateien"
+
+#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:468
+#: revpiprogram.py:574
+msgid "Zip archive"
+msgstr "Zip Archiv"
+
+#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:481
+#: revpiprogram.py:603
+msgid "TGZ archive"
+msgstr "TGZ Archiv"
+
+#: revpiprogram.py:101
+msgid "Folder"
+msgstr "Verzeichnis"
+
+#: revpiprogram.py:118
+msgid "Download PLC program as:"
+msgstr "PLC Programm herunterladen als:"
+
+#: revpiprogram.py:128
+msgid "include piCtory configuration"
+msgstr "inkl. piCtory Konfiguration"
+
+#: revpiprogram.py:133 revpiprogram.py:177 revpiprogram.py:198
+msgid "Download"
+msgstr "Herunterladen"
+
+#: revpiprogram.py:138
+msgid "Upload PLC program as:"
+msgstr "PLC Programm hochladen als:"
+
+#: revpiprogram.py:150
+msgid "clean upload folder before upload"
+msgstr "vorher Inhalt im Uploadverzeichnis löschen"
+
+#: revpiprogram.py:157
+msgid "includes piCtory configuration"
+msgstr "enthält piCtory Konfiguration"
+
+#: revpiprogram.py:163 revpiprogram.py:185
+msgid "Upload"
+msgstr "Hochladen"
+
+#: revpiprogram.py:169
+msgid "piCtory configuration"
+msgstr "piCtory Konfiguration"
+
+#: revpiprogram.py:173
+msgid "Download piCtory configuration"
+msgstr "piCtory Konfiguration herunterladen"
+
+#: revpiprogram.py:180
+msgid "Upload piCtory configuration"
+msgstr "piCtory Konfiguration hochladen"
+
+#: revpiprogram.py:191
+msgid "piControl0 prozess image"
+msgstr "piControl0 Prozessabbild"
+
+#: revpiprogram.py:194
+msgid "Download process image dump"
+msgstr "Prozessabbild Dump herunterladen"
+
+#: revpiprogram.py:204
+msgid "Reset piControl"
+msgstr "piControl zurücksetzen"
+
+#: revpiprogram.py:207
+msgid "Execute piControlReset"
+msgstr "piControlReset ausführen"
+
+#: revpiprogram.py:211
+msgid "execute"
+msgstr "ausführen"
+
+#: revpiprogram.py:217 revpipycontrol.py:96
+msgid "Exit"
+msgstr "Beenden"
+
+#: revpiprogram.py:297 revpiprogram.py:326 revpiprogram.py:464
+#: revpiprogram.py:477
+msgid "Save as..."
+msgstr "Speichern unter..."
+
+#: revpiprogram.py:300 revpiprogram.py:359
+msgid "piCtory config"
+msgstr "piCtory Konfiguration"
+
+#: revpiprogram.py:300 revpiprogram.py:329 revpiprogram.py:359
+#: revpiprogram.py:468 revpiprogram.py:481 revpiprogram.py:549
+#: revpiprogram.py:574 revpiprogram.py:603
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: revpiprogram.py:308 revpiprogram.py:337 revpiprogram.py:521
+msgid "Could not load and save file!"
+msgstr "Datei konnte nicht geladen und gespeichert werden!"
+
+#: revpiprogram.py:312 revpiprogram.py:341 revpiprogram.py:379
+#: revpiprogram.py:388 revpiprogram.py:430 revpiprogram.py:525
+#: revpiprogram.py:672
+msgid "Success"
+msgstr "Erfolgreich"
+
+#: revpiprogram.py:313 revpiprogram.py:342 revpiprogram.py:526
+msgid "File successfully loaded and saved."
+msgstr "Dateien erfolgreich übertragen und gespeichert."
+
+#: revpiprogram.py:329
+msgid "Imagefiles"
+msgstr "Image Dateien"
+
+#: revpiprogram.py:355
+msgid "Open piCtory file..."
+msgstr "piCtory Datei öffnen"
+
+#: revpiprogram.py:369
+msgid ""
+"Should the piControl driver be reset after uploading the piCtory "
+"configuration?"
+msgstr ""
+"Soll nach dem Hochladen der piCtory Konfiguration ein Reset am piControl "
+"Treiber durchgeführt werden?"
+
+#: revpiprogram.py:381
+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"
+
+#: revpiprogram.py:390
+msgid "The piCtory configuration was successfully transferred"
+msgstr "Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt"
+
+#: revpiprogram.py:402
+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 revpipycontrol.py:199 revpipycontrol.py:247
+#: revpipycontrol.py:267
+msgid "Warning"
+msgstr "Warnung"
+
+#: revpiprogram.py:410
+msgid ""
+"The piCtroy configuration has been saved successfully. \n"
+"An error occurred on piControl reset!"
+msgstr ""
+"Die piCtroy Konfiguration wurde erfolgreich gespeichert. \n"
+"Beim piControl Reset trat allerdings ein Fehler auf!"
+
+#: revpiprogram.py:422
+msgid ""
+"Are you sure to reset piControl? \n"
+"The process image and the piBridge are interrupted !!!"
+msgstr ""
+"Soll piControlReset wirklich durchgeführt werden? \n"
+"Das Prozessabbild und die Steuerung werden dann unterbrochen!!!"
+
+#: revpiprogram.py:431
+msgid "piControlReset executed successfully"
+msgstr "piControl Reset war erfolgreich"
+
+#: revpiprogram.py:437
+msgid "piControl reset could not be executed successfully"
+msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden"
+
+#: revpiprogram.py:451
+msgid "Directory to save"
+msgstr "Verzeichnis zum Ablegen"
+
+#: revpiprogram.py:559
+msgid "Folder to upload"
+msgstr "Verzeichnis zum Hochladen"
+
+#: revpiprogram.py:570
+msgid "Upload Zip archive..."
+msgstr "Zip Archiv hochladen..."
+
+#: revpiprogram.py:591
+msgid "The specified file is not a ZIP archive."
+msgstr "Die angegebene Datei ist kein ZIP Archiv"
+
+#: revpiprogram.py:599
+msgid "Upload TarGz archiv..."
+msgstr "TarGz Archiv hochladen..."
+
+#: revpiprogram.py:621
+msgid "The specified file is not a TAR archive."
+msgstr "Die angegebene Datei ist kein TAR Archiv."
+
+#: revpiprogram.py:634
+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:673
+msgid "The transfer was successful."
+msgstr "Die Übertragung war erfolgreich."
+
+#: revpiprogram.py:683
+msgid "There is no piCtory configuration in this archive."
+msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden."
+
+#: revpiprogram.py:704
+msgid "The Revolution Pi could not process some parts of the transmission."
+msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten."
+
+#: revpiprogram.py:712
+msgid "Errors occurred during transmission"
+msgstr "Bei der Übertragung traten Fehler auf"
+
+#: revpipycontrol.py:94
+msgid "Connections..."
+msgstr "Verbindungen..."
+
+#: revpipycontrol.py:97
+msgid "Main"
+msgstr "Datei"
+
+#: revpipycontrol.py:108
+msgid "PLC start"
+msgstr "PLC Start"
+
+#: revpipycontrol.py:113
+msgid "PLC stop"
+msgstr "PLC Stopp"
+
+#: revpipycontrol.py:118
+msgid "PLC restart"
+msgstr "PLC Neustart"
+
+#: revpipycontrol.py:123
+msgid "PLC logs"
+msgstr "PLC Logs"
+
+#: revpipycontrol.py:134
+msgid "PLC watch mode"
+msgstr "PLC watch Modus"
+
+#: revpipycontrol.py:151
+msgid "PLC log..."
+msgstr "PLC Log..."
+
+#: revpipycontrol.py:153
+msgid "PLC options..."
+msgstr "PLC Optionen..."
+
+#: revpipycontrol.py:155
+msgid "PLC program..."
+msgstr "PLC Programm..."
+
+#: revpipycontrol.py:159
+msgid "Disconnect"
+msgstr "Trennen"
+
+#: revpipycontrol.py:164
+msgid "Connect"
+msgstr "Verbinden"
+
+#: revpipycontrol.py:201
+msgid ""
+"The watch mode ist not supported in version {} of RevPiPyLoad on your RevPi! "
+"You need at least version 0.4.0."
+msgstr ""
+"Die Debug-Funktion wird von der RevPiPyLoad Version {} auf dem RevPi nicht "
+"unterstützt! Sie benötigen mindestens Version 0.4.0."
+
+#: revpipycontrol.py:249 revpipycontrol.py:269
+msgid ""
+"XML-RPC access mode in the RevPiPyLoad configuration is to small to access "
+"this dialog"
+msgstr ""
+"Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um "
+"diesen Dialog zu verwenden!"
+
+#: revpipycontrol.py:309
+msgid "Can not reach server!"
+msgstr "Server ist nicht erreichbar!"
diff --git a/revpipycontrol/mytools.py b/revpipycontrol/mytools.py
index 858d53a..941b8c2 100644
--- a/revpipycontrol/mytools.py
+++ b/revpipycontrol/mytools.py
@@ -33,7 +33,7 @@ def gettrans(proglang=None):
# Sprache auswählen
if proglang is None:
# Autodetect Language or switch to static
- # proglang = "de"
+ # proglang = "en"
proglang = locale.getdefaultlocale()[0].split('_')[0]
# Übersetzungen laden
diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py
index c15c6ad..ca6941a 100644
--- a/revpipycontrol/revpicheckclient.py
+++ b/revpipycontrol/revpicheckclient.py
@@ -10,8 +10,12 @@
import pickle
import tkinter
from threading import Lock
+from mytools import gettrans
from xmlrpc.client import ServerProxy, MultiCall
+# Übersetzung laden
+_ = gettrans()
+
class RevPiCheckClient(tkinter.Frame):
@@ -136,7 +140,7 @@ class RevPiCheckClient(tkinter.Frame):
"""Erstellt den Fensterinhalt."""
devgrp = tkinter.LabelFrame(self)
- devgrp["text"] = "Devices of RevPi"
+ devgrp["text"] = _("Devices of RevPi")
devgrp.pack(fill="y", side="left")
for dev in self.lst_devices:
@@ -168,33 +172,33 @@ class RevPiCheckClient(tkinter.Frame):
# Steuerungsfunktionen
cntgrp = tkinter.LabelFrame(self)
- cntgrp["text"] = "Control"
+ cntgrp["text"] = _("Control")
cntgrp.pack(fill="y", side="right")
self.btn_refresh = tkinter.Button(cntgrp)
- self.btn_refresh["text"] = "Alle IOs lesen"
+ self.btn_refresh["text"] = _("Read all IOs")
self.btn_refresh["command"] = self.refreshvalues
self.btn_refresh.pack(fill="x")
self.btn_read = tkinter.Button(cntgrp)
- self.btn_read["text"] = "Inputs einlesen"
+ self.btn_read["text"] = _("Read just Inputs")
self.btn_read["command"] = self.readvalues
self.btn_read.pack(fill="x")
self.btn_write = tkinter.Button(cntgrp)
- self.btn_write["text"] = "Outputs schreiben"
+ self.btn_write["text"] = _("Write Outputs")
self.btn_write["command"] = self.writevalues
self.btn_write.pack(fill="x")
check = tkinter.Checkbutton(cntgrp)
check["command"] = self.toggleauto
- check["text"] = "Autorefresh values"
+ check["text"] = _("Autorefresh values")
check["variable"] = self.autorw
check.pack(anchor="w")
check = tkinter.Checkbutton(cntgrp)
check["state"] = "disabled" if self.xmlmode < 3 else "normal"
- check["text"] = "Write values to RevPi"
+ check["text"] = _("Write values to RevPi")
check["variable"] = self.dowrite
check.pack(anchor="w")
diff --git a/revpipycontrol/revpilogfile.py b/revpipycontrol/revpilogfile.py
index 0de9088..060ed49 100644
--- a/revpipycontrol/revpilogfile.py
+++ b/revpipycontrol/revpilogfile.py
@@ -7,6 +7,10 @@
# -*- coding: utf-8 -*-
import pickle
import tkinter
+from mytools import gettrans
+
+# Übersetzung laden
+_ = gettrans()
class RevPiLogfile(tkinter.Frame):
@@ -20,7 +24,7 @@ class RevPiLogfile(tkinter.Frame):
self._createwidgets()
def _createwidgets(self):
- self.master.wm_title("RevPi Python PLC Logs")
+ self.master.wm_title(_("RevPi Python PLC Logs"))
self.rowconfigure(0, weight=0)
self.rowconfigure(1, weight=1)
@@ -33,11 +37,11 @@ class RevPiLogfile(tkinter.Frame):
# PLC Log
self.lblapplog = tkinter.Label(self)
- self.lblapplog["text"] = "RevPyPyLoad - Logfile"
+ self.lblapplog["text"] = _("RevPiPyLoad - Logfile")
self.lblapplog.grid(column=0, row=0, sticky="w")
self.btnapplog = tkinter.Button(self)
self.btnapplog["command"] = self.btn_clearplc
- self.btnapplog["text"] = "Clear screen"
+ self.btnapplog["text"] = _("Clear screen")
self.btnapplog.grid(column=1, row=0, sticky="e")
self.plclog = tkinter.Text(self)
self.plcscr = tkinter.Scrollbar(self)
@@ -48,11 +52,11 @@ class RevPiLogfile(tkinter.Frame):
# APP Log
self.lblapplog = tkinter.Label(self)
- self.lblapplog["text"] = "Python PLC program - Logfile"
+ self.lblapplog["text"] = _("Python PLC program - Logfile")
self.lblapplog.grid(column=3, row=0, sticky="w")
self.btnapplog = tkinter.Button(self)
self.btnapplog["command"] = self.btn_clearapp
- self.btnapplog["text"] = "Clear screen"
+ self.btnapplog["text"] = _("Clear screen")
self.btnapplog.grid(column=4, row=0, sticky="e")
self.applog = tkinter.Text(self)
self.appscr = tkinter.Scrollbar(self)
diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py
index 68dce00..23a59f2 100644
--- a/revpipycontrol/revpioption.py
+++ b/revpipycontrol/revpioption.py
@@ -7,7 +7,10 @@
# -*- coding: utf-8 -*-
import tkinter
import tkinter.messagebox as tkmsg
+from mytools import gettrans
+# Übersetzung laden
+_ = gettrans()
class RevPiOption(tkinter.Frame):
@@ -27,7 +30,7 @@ class RevPiOption(tkinter.Frame):
self._loadappdata()
def _createwidgets(self):
- self.master.wm_title("RevPi Python PLC Options")
+ self.master.wm_title(_("RevPi Python PLC Options"))
self.master.wm_resizable(width=False, height=False)
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
@@ -35,7 +38,7 @@ class RevPiOption(tkinter.Frame):
# Gruppe Start/Stop
stst = tkinter.LabelFrame(self)
- stst["text"] = "Start / Stopp Verhalten"
+ stst["text"] = _("Start / Stop behavior")
stst.grid(columnspan=2, pady=2, sticky="we")
self.var_start = tkinter.BooleanVar(stst)
@@ -44,34 +47,34 @@ class RevPiOption(tkinter.Frame):
self.var_zerr = tkinter.BooleanVar(stst)
ckb_start = tkinter.Checkbutton(stst)
- ckb_start["text"] = "Programm automatisch starten"
+ ckb_start["text"] = _("Start program automatically")
ckb_start["state"] = self.xmlstate
ckb_start["variable"] = self.var_start
ckb_start.grid(**cpadw)
ckb_reload = tkinter.Checkbutton(stst)
- ckb_reload["text"] = "Programm nach Beenden neu starten"
+ ckb_reload["text"] = _("Restart program after exit")
ckb_reload["state"] = self.xmlstate
ckb_reload["variable"] = self.var_reload
ckb_reload.grid(**cpadw)
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
ckb_zexit["state"] = self.xmlstate
- ckb_zexit["text"] = "Prozessabbild auf NULL setzen, wenn " \
- "Programm\nerfolgreich beendet wird"
+ ckb_zexit["text"] = _("Set process image to NULL if program\n"
+ "terminates successfully")
ckb_zexit["variable"] = self.var_zexit
ckb_zexit.grid(**cpadw)
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
ckb_zerr["state"] = self.xmlstate
- ckb_zerr["text"] = "Prozessabbild auf NULL setzen, wenn " \
- "Programm\ndurch Absturz beendet wird"
+ ckb_zerr["text"] = _("Set process image to NULL if program\n"
+ "terminates with errors")
ckb_zerr["variable"] = self.var_zerr
ckb_zerr.grid(**cpadw)
# Gruppe Programm
prog = tkinter.LabelFrame(self)
- prog["text"] = "PLC Programm"
+ prog["text"] = _("PLC program")
prog.grid(columnspan=2, pady=2, sticky="we")
self.var_pythonver = tkinter.IntVar(prog)
@@ -82,7 +85,7 @@ class RevPiOption(tkinter.Frame):
self.var_pythonver.set(3)
lbl = tkinter.Label(prog)
- lbl["text"] = "Python Version"
+ lbl["text"] = _("Python version")
lbl.grid(columnspan=2, row=0, **cpadw)
rbn = tkinter.Radiobutton(prog)
rbn["state"] = self.xmlstate
@@ -99,7 +102,7 @@ class RevPiOption(tkinter.Frame):
rbn.grid(column=1, row=1, **cpadw)
lbl = tkinter.Label(prog)
- lbl["text"] = "Python PLC Programname"
+ lbl["text"] = _("Python PLC program name")
lbl.grid(columnspan=2, **cpadw)
lst = self.xmlcli.get_filelist()
@@ -111,7 +114,7 @@ class RevPiOption(tkinter.Frame):
opt_startpy.grid(columnspan=2, **cpadwe)
lbl = tkinter.Label(prog)
- lbl["text"] = "Programm Argumente"
+ lbl["text"] = _("Program arguments")
lbl.grid(columnspan=2, **cpadw)
txt = tkinter.Entry(prog)
@@ -120,14 +123,14 @@ class RevPiOption(tkinter.Frame):
ckb_slave = tkinter.Checkbutton(prog, justify="left")
ckb_slave["state"] = self.xmlstate
- ckb_slave["text"] = "RevPi als PLC-Slave verwenden"
+ ckb_slave["text"] = _("Use RevPi as PLC-Slave")
ckb_slave["state"] = "disabled"
ckb_slave["variable"] = self.var_slave
ckb_slave.grid(columnspan=2, **cpadw)
# Gruppe XMLRPC
xmlrpc = tkinter.LabelFrame(self)
- xmlrpc["text"] = "XML-RPC Server"
+ xmlrpc["text"] = _("XML-RPC server")
xmlrpc.grid(columnspan=2, pady=2, sticky="we")
self.var_xmlon = tkinter.BooleanVar(xmlrpc)
@@ -139,7 +142,7 @@ class RevPiOption(tkinter.Frame):
ckb_xmlon = tkinter.Checkbutton(xmlrpc)
ckb_xmlon["command"] = self.askxmlon
ckb_xmlon["state"] = self.xmlstate
- ckb_xmlon["text"] = "XML-RPC Server aktiv auf RevPi"
+ ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi")
ckb_xmlon["variable"] = self.var_xmlon
ckb_xmlon.grid(**cpadw)
@@ -147,19 +150,19 @@ class RevPiOption(tkinter.Frame):
self.ckb_xmlmod2["command"] = self.xmlmods
self.ckb_xmlmod2["state"] = self.xmlstate
self.ckb_xmlmod2["text"] = \
- "Download von piCtory Konfiguration und\nPLC Programm zulassen"
+ _("Allow download of piCtory configuration and\nPLC programm")
self.ckb_xmlmod2["variable"] = self.var_xmlmod2
self.ckb_xmlmod2.grid(**cpadw)
self.ckb_xmlmod3 = tkinter.Checkbutton(xmlrpc, justify="left")
self.ckb_xmlmod3["state"] = self.xmlstate
self.ckb_xmlmod3["text"] = \
- "Upload von piCtory Konfiguration und\nPLC Programm zualssen"
+ _("Allow upload of piCtory configuration and\nPLC programm")
self.ckb_xmlmod3["variable"] = self.var_xmlmod3
self.ckb_xmlmod3.grid(**cpadw)
lbl = tkinter.Label(xmlrpc)
- lbl["text"] = "XML-RPC Serverport"
+ lbl["text"] = _("XML-RPC server port")
lbl.grid(**cpadw)
spb_xmlport = tkinter.Spinbox(xmlrpc)
@@ -173,12 +176,12 @@ class RevPiOption(tkinter.Frame):
btn_save = tkinter.Button(self)
btn_save["command"] = self._setappdata
btn_save["state"] = self.xmlstate
- btn_save["text"] = "Speichern"
+ btn_save["text"] = _("Save")
btn_save.grid(column=0, row=3)
btn_close = tkinter.Button(self)
btn_close["command"] = self.master.destroy
- btn_close["text"] = "Schließen"
+ btn_close["text"] = _("Close")
btn_close.grid(column=1, row=3)
def _loadappdata(self):
@@ -224,30 +227,35 @@ class RevPiOption(tkinter.Frame):
self.xmlmode = dc["xmlrpc"]
ask = tkmsg.askyesnocancel(
- "Frage", "Die Einstellungen werden jetzt auf dem Revolution Pi "
- "gespeichert. \n\nSollen die neuen Einstellungen sofort in Kraft "
- "treten? \nDies bedeutet einen Neustart des Dienstes und des ggf. "
- "laufenden PLC-Programms!", parent=self.master
+ _("Question"),
+ _("The settings are now saved on the Revolution Pi. \n\n"
+ "Should the new settings take effect immediately? \nThis "
+ "means a restart of the service and the PLC program!"),
+ parent=self.master
)
if ask is not None:
if self.xmlcli.set_config(dc, ask):
tkmsg.showinfo(
- "Information", "Einstellungen gespeichert.",
+ _("Information"),
+ _("Settings saved"),
parent=self.master
)
else:
tkmsg.showerror(
- "Fehler", "Die Einstellungen konnten nicht gesichert"
- "werden. Dies kann passieren, wenn Werte falsch sind!",
+ _("Error"),
+ _("The settings could not be saved. This can happen if "
+ "values are wrong!"),
parent=self.master
)
def askxmlon(self):
if not self.var_xmlon.get():
ask = tkmsg.askyesno(
- "Frage", "Soll der XML-RPC Server wirklich beendet werden? "
- "Sie können dann NICHT mehr mit diesem Programm auf den "
- "Revolution Pi zugreifen.", parent=self.master
+ _("Question"),
+ _("Are you sure you want to deactivate the XML-RPC server? "
+ "You will NOT be able to access the Revolution Pi with "
+ "this program."),
+ parent=self.master
)
if not ask:
self.var_xmlon.set(True)
diff --git a/revpipycontrol/revpiplclist.py b/revpipycontrol/revpiplclist.py
index db7a039..801b845 100644
--- a/revpipycontrol/revpiplclist.py
+++ b/revpipycontrol/revpiplclist.py
@@ -9,10 +9,14 @@ import os.path
import pickle
import tkinter
import tkinter.messagebox as tkmsg
+from mytools import gettrans
from os import environ
from os import makedirs
from sys import platform
+# Übersetzungen laden
+_ = gettrans()
+
# Systemwerte
if platform == "linux":
homedir = environ["HOME"]
@@ -47,8 +51,9 @@ class RevPiPlcList(tkinter.Frame):
self._loadappdata()
def _createwidgets(self):
- self.master.wm_title("RevPi Python PLC Connections")
+ self.master.wm_title(_("RevPi Python PLC connections"))
self.master.wm_resizable(width=False, height=False)
+ self.master.protocol("WM_DELETE_WINDOW", self.evt_btnclose)
# Listbox mit vorhandenen Verbindungen
self.scr_conn = tkinter.Scrollbar(self)
@@ -66,14 +71,14 @@ class RevPiPlcList(tkinter.Frame):
self.var_port.set("55123")
# Eingabefelder für Adresse und Namen
- tkinter.Label(self, text="Name").grid(
+ tkinter.Label(self, text=_("Name")).grid(
column=2, row=0, sticky="wn", padx=5, pady=5)
self.txt_name = tkinter.Entry(self, textvariable=self.var_name)
self.txt_name.bind("", self.evt_keypress)
self.txt_name.grid(
column=3, row=0, columnspan=3, sticky="n", padx=5, pady=5)
- tkinter.Label(self, text="IP-Adresse").grid(
+ tkinter.Label(self, text=_("IP address")).grid(
column=2, row=1, sticky="wn", padx=5, pady=5
)
self.txt_address = tkinter.Entry(self, textvariable=self.var_address)
@@ -81,7 +86,7 @@ class RevPiPlcList(tkinter.Frame):
self.txt_address.grid(
column=3, row=1, columnspan=3, sticky="n", padx=5, pady=5)
- tkinter.Label(self, text="Port").grid(
+ tkinter.Label(self, text=_("Port")).grid(
column=2, row=2, sticky="wn", padx=5, pady=5)
self.txt_port = tkinter.Entry(self, textvariable=self.var_port)
self.txt_port.bind("", self.evt_keypress)
@@ -90,23 +95,23 @@ class RevPiPlcList(tkinter.Frame):
# Listenbutton
self.btn_new = tkinter.Button(
- self, text="Neu", command=self.evt_btnnew)
+ self, text=_("New"), command=self.evt_btnnew)
self.btn_new.grid(column=2, row=3, sticky="s")
self.btn_add = tkinter.Button(
- self, text="Übernehmen", command=self.evt_btnadd,
+ self, text=_("Apply"), command=self.evt_btnadd,
state="disabled")
self.btn_add.grid(column=3, row=3, sticky="s")
self.btn_remove = tkinter.Button(
- self, text="Entfernen", command=self.evt_btnremove,
+ self, text=_("Remove"), command=self.evt_btnremove,
state="disabled")
self.btn_remove.grid(column=4, row=3, sticky="s")
# Fensterbuttons
self.btn_save = tkinter.Button(
- self, text="Speichern", command=self.evt_btnsave)
+ self, text=_("Save"), command=self.evt_btnsave)
self.btn_save.grid(column=3, row=9, sticky="se")
self.btn_close = tkinter.Button(
- self, text="Schließen", command=self.evt_btnclose)
+ self, text=_("Close"), command=self.evt_btnclose)
self.btn_close.grid(column=4, row=9, sticky="se")
def _loadappdata(self):
@@ -142,9 +147,10 @@ class RevPiPlcList(tkinter.Frame):
def evt_btnclose(self):
if self.changes:
ask = tkmsg.askyesno(
- parent=self.master, title="Frage...",
- message="Wollen Sie wirklich beenden?\n"
- "Nicht gespeicherte Änderungen gehen verloren",
+ _("Question"),
+ _("Do you really want to quit? \nUnsaved changes will "
+ "be lost"),
+ parent=self.master
)
else:
ask = True
@@ -166,9 +172,9 @@ class RevPiPlcList(tkinter.Frame):
if len(item_index) == 1:
item = self.list_conn.get(item_index[0])
ask = tkmsg.askyesno(
- "Frage",
- "Wollen Sie die Ausgewählte Verbindung '{}' wirklich "
- "löschen?".format(item),
+ _("Question"),
+ _("Do you really want to delete the selected connection '{}'"
+ "").format(item),
parent=self.master
)
if ask:
@@ -181,15 +187,16 @@ class RevPiPlcList(tkinter.Frame):
def evt_btnsave(self):
if self._saveappdata():
ask = tkmsg.askyesno(
- "Information", "Verbindungen erfolgreich gespeichert.\n"
- "Möchten Sie dieses Fenster jetzt schließen?",
+ _("Information"),
+ _("Successfully saved. \nDo you want to close this window?"),
parent=self.master
)
if ask:
self.master.destroy()
else:
tkmsg.showerror(
- "Fehler", "Verbindungen konnten nicht gespeichert werden",
+ _("Error"),
+ _("Failed to save connections"),
parent=self.master
)
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 96d733e..1e6df5e 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -62,17 +62,18 @@ class RevPiProgram(tkinter.Frame):
def _checkclose(self):
if True or self.uploaded:
tkmsg.showinfo(
- parent=self.master, title=_("Information"),
- message=_(
+ _("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
)
self.master.destroy()
def _createwidgets(self):
- self.master.wm_title(_("RevPi python PLC programm"))
+ self.master.wm_title(_("RevPi Python PLC program"))
self.master.wm_resizable(width=False, height=False)
self.rowconfigure(0, weight=1)
@@ -86,7 +87,7 @@ class RevPiProgram(tkinter.Frame):
# Gruppe Programm
prog = tkinter.LabelFrame(self)
prog.columnconfigure(0, weight=1)
- prog["text"] = _("PLC python programm")
+ prog["text"] = _("PLC python program")
prog.grid(columnspan=2, pady=2, sticky="we")
# Variablen vorbereiten
@@ -297,7 +298,7 @@ class RevPiProgram(tkinter.Frame):
title=_("Save as..."),
initialdir=self.opt.get("getpictoryrsc_dir", ""),
initialfile=self.revpi + ".rsc",
- filetypes=((_("piCtory Config"), "*.rsc"), (_("All files"), "*.*"))
+ filetypes=((_("piCtory config"), "*.rsc"), (_("All files"), "*.*"))
)
if fh is not None:
try:
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index dd131cf..241b634 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -244,11 +244,12 @@ class RevPiPyControl(tkinter.Frame):
u"""Startet das Optionsfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
- parent=self.master, title="Warnung",
- message=_(
+ _("Warning"),
+ _(
"XML-RPC access mode in the RevPiPyLoad "
"configuration is to small to access this dialog"
- )
+ ),
+ parent=self.master
)
else:
win = tkinter.Toplevel(self)
@@ -263,11 +264,12 @@ class RevPiPyControl(tkinter.Frame):
u"""Startet das Programmfenster."""
if self.xmlmode < 2:
tkmsg.showwarning(
- parent=self.master, title="Warnung",
- message=_(
+ _("Warning"),
+ _(
"XML-RPC access mode in the RevPiPyLoad "
"configuration is to small to access this dialog"
- )
+ ),
+ parent=self.master
)
else:
win = tkinter.Toplevel(self)
@@ -302,20 +304,24 @@ class RevPiPyControl(tkinter.Frame):
def servererror(self):
u"""Setzt alles zurück für neue Verbindungen."""
self.serverdisconnect()
- tkmsg.showerror(_("Fehler"), _("Server ist nicht erreichbar!"))
+ tkmsg.showerror(
+ _("Error"),
+ _("Can not reach server!"),
+ parent=self.master
+ )
def tmr_plcrunning(self):
self._btnstate()
if self.cli is None:
self.txt_status["readonlybackground"] = "lightblue"
- self.var_status.set(_("NOT CONNECTED"))
+ self.var_status.set("NOT CONNECTED")
else:
try:
plcec = self.cli.plcexitcode()
except:
self.errcount += 1
if self.errcount >= 5:
- self.var_status.set(_("SERVER ERROR"))
+ self.var_status.set("SERVER ERROR")
self.servererror()
else:
self.errcount = 0
@@ -323,17 +329,17 @@ class RevPiPyControl(tkinter.Frame):
"green" if plcec == -1 else "red"
if plcec == -1:
- plcec = _("RUNNING")
+ plcec = "RUNNING"
elif plcec == -2:
- plcec = _("FILE NOT FOUND")
+ plcec = "FILE NOT FOUND"
elif plcec == -3:
- plcec = _("NOT RUNNING (NO STATUS)")
+ plcec = "NOT RUNNING (NO STATUS)"
elif plcec == -9:
- plcec = _("PROGRAM KILLED")
+ plcec = "PROGRAM KILLED"
elif plcec == -15:
- plcec = _("PROGRAM TERMED")
+ plcec = "PROGRAM TERMED"
elif plcec == 0:
- plcec = _("NOT RUNNING")
+ plcec = "NOT RUNNING"
self.var_status.set(plcec)
self.master.after(1000, self.tmr_plcrunning)
From 1f668b153c539aed9321143281c9c986beb3c699 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Thu, 29 Jun 2017 13:03:39 +0200
Subject: [PATCH 05/13] Codestyle von tkinter.messagebox angepasst
---
.../locale/de/LC_MESSAGES/revpipycontrol.po | 154 +++++++++---------
revpipycontrol/revpioption.py | 7 +-
revpipycontrol/revpiprogram.py | 149 +++++++++--------
revpipycontrol/revpipycontrol.py | 9 +-
4 files changed, 160 insertions(+), 159 deletions(-)
diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
index 6b325a0..73a88ce 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-29 12:39+0200\n"
-"PO-Revision-Date: 2017-06-29 12:39+0200\n"
+"POT-Creation-Date: 2017-06-29 12:59+0200\n"
+"PO-Revision-Date: 2017-06-29 13:03+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@@ -139,16 +139,16 @@ msgstr ""
msgid "XML-RPC server port"
msgstr "XML-RPC Serverport"
-#: revpioption.py:179 revpiplclist.py:112
+#: revpioption.py:179 revpiplclist.py:111
msgid "Save"
msgstr "Speichern"
-#: revpioption.py:184 revpiplclist.py:115
+#: revpioption.py:184 revpiplclist.py:114
msgid "Close"
msgstr "Schließen"
-#: revpioption.py:230 revpioption.py:254 revpiplclist.py:151
-#: revpiplclist.py:176 revpiprogram.py:367 revpiprogram.py:420
+#: revpioption.py:230 revpioption.py:254 revpiplclist.py:150
+#: revpiplclist.py:175 revpiprogram.py:370 revpiprogram.py:418
msgid "Question"
msgstr "Frage"
@@ -164,7 +164,7 @@ msgstr ""
"Sollen die neuen Einstellungen sofort in Kraft treten?\n"
"Dies bedeutet einen Neustart des Dienstes und des laufenden PLC-Programms!"
-#: revpioption.py:239 revpiplclist.py:191 revpiprogram.py:65
+#: revpioption.py:239 revpiplclist.py:190 revpiprogram.py:65
msgid "Information"
msgstr "Information"
@@ -172,11 +172,11 @@ msgstr "Information"
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
-#: revpioption.py:245 revpiplclist.py:199 revpiprogram.py:307
-#: revpiprogram.py:336 revpiprogram.py:400 revpiprogram.py:435
-#: revpiprogram.py:520 revpiprogram.py:590 revpiprogram.py:620
-#: revpiprogram.py:632 revpiprogram.py:681 revpiprogram.py:702
-#: revpiprogram.py:711 revpipycontrol.py:308
+#: revpioption.py:245 revpiplclist.py:198 revpiprogram.py:306
+#: revpiprogram.py:337 revpiprogram.py:400 revpiprogram.py:433
+#: revpiprogram.py:517 revpiprogram.py:589 revpiprogram.py:620
+#: revpiprogram.py:633 revpiprogram.py:682 revpiprogram.py:702
+#: revpiprogram.py:710 revpipycontrol.py:307
msgid "Error"
msgstr "Fehler"
@@ -198,31 +198,31 @@ msgstr ""
msgid "RevPi Python PLC connections"
msgstr "RevPi Python PLC Verbindungen"
-#: revpiplclist.py:75
+#: revpiplclist.py:74
msgid "Name"
msgstr "Name"
-#: revpiplclist.py:82
+#: revpiplclist.py:81
msgid "IP address"
msgstr "IP Adresse"
-#: revpiplclist.py:90
+#: revpiplclist.py:89
msgid "Port"
msgstr "Port"
-#: revpiplclist.py:99
+#: revpiplclist.py:98
msgid "New"
msgstr "Neu"
-#: revpiplclist.py:102
+#: revpiplclist.py:101
msgid "Apply"
msgstr "Übernehmen"
-#: revpiplclist.py:106
+#: revpiplclist.py:105
msgid "Remove"
msgstr "Entfernen"
-#: revpiplclist.py:152
+#: revpiplclist.py:151
msgid ""
"Do you really want to quit? \n"
"Unsaved changes will be lost"
@@ -230,11 +230,11 @@ msgstr ""
"Wollen Sie wirklich beenden? \n"
"Nicht gespeicherte Änderungen gehen verloren"
-#: revpiplclist.py:177
+#: revpiplclist.py:176
msgid "Do you really want to delete the selected connection '{}'"
msgstr "Wollen Sie die ausgewählte Verbindung '{}' wirklich löschen?"
-#: revpiplclist.py:192
+#: revpiplclist.py:191
msgid ""
"Successfully saved. \n"
"Do you want to close this window?"
@@ -242,11 +242,11 @@ msgstr ""
"Verbindungen erfolgreich gespeichert. \n"
"Möchten Sie dieses Fenster jetzt schließen?"
-#: revpiplclist.py:200
+#: revpiplclist.py:199
msgid "Failed to save connections"
msgstr "Verbindungen konnten nicht gespeichert werden"
-#: revpiprogram.py:67
+#: revpiprogram.py:66
msgid ""
"A PLC program has been uploaded. Please check the PLC options to see if the "
"correct program is specified as the start program."
@@ -254,135 +254,135 @@ msgstr ""
"Ein PLC Programm wurde hochgeladen. Bitte prüfen Sie die PLC Optionen, ob "
"dort das richtige Programm als Startprogramm angegeben ist."
-#: revpiprogram.py:75
+#: revpiprogram.py:74
msgid "RevPi Python PLC program"
msgstr "RevPi Python PLC Programm"
-#: revpiprogram.py:89
+#: revpiprogram.py:88
msgid "PLC python program"
msgstr "PLC Python Programm"
-#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:109
-#: revpiprogram.py:113
+#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:108
+#: revpiprogram.py:112
msgid "Files"
msgstr "Dateien"
-#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:468
-#: revpiprogram.py:574
+#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:465
+#: revpiprogram.py:573
msgid "Zip archive"
msgstr "Zip Archiv"
-#: revpiprogram.py:99 revpiprogram.py:101 revpiprogram.py:481
+#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:478
#: revpiprogram.py:603
msgid "TGZ archive"
msgstr "TGZ Archiv"
-#: revpiprogram.py:101
+#: revpiprogram.py:100
msgid "Folder"
msgstr "Verzeichnis"
-#: revpiprogram.py:118
+#: revpiprogram.py:117
msgid "Download PLC program as:"
msgstr "PLC Programm herunterladen als:"
-#: revpiprogram.py:128
+#: revpiprogram.py:127
msgid "include piCtory configuration"
msgstr "inkl. piCtory Konfiguration"
-#: revpiprogram.py:133 revpiprogram.py:177 revpiprogram.py:198
+#: revpiprogram.py:132 revpiprogram.py:176 revpiprogram.py:197
msgid "Download"
msgstr "Herunterladen"
-#: revpiprogram.py:138
+#: revpiprogram.py:137
msgid "Upload PLC program as:"
msgstr "PLC Programm hochladen als:"
-#: revpiprogram.py:150
+#: revpiprogram.py:149
msgid "clean upload folder before upload"
msgstr "vorher Inhalt im Uploadverzeichnis löschen"
-#: revpiprogram.py:157
+#: revpiprogram.py:156
msgid "includes piCtory configuration"
msgstr "enthält piCtory Konfiguration"
-#: revpiprogram.py:163 revpiprogram.py:185
+#: revpiprogram.py:162 revpiprogram.py:184
msgid "Upload"
msgstr "Hochladen"
-#: revpiprogram.py:169
+#: revpiprogram.py:168
msgid "piCtory configuration"
msgstr "piCtory Konfiguration"
-#: revpiprogram.py:173
+#: revpiprogram.py:172
msgid "Download piCtory configuration"
msgstr "piCtory Konfiguration herunterladen"
-#: revpiprogram.py:180
+#: revpiprogram.py:179
msgid "Upload piCtory configuration"
msgstr "piCtory Konfiguration hochladen"
-#: revpiprogram.py:191
+#: revpiprogram.py:190
msgid "piControl0 prozess image"
msgstr "piControl0 Prozessabbild"
-#: revpiprogram.py:194
+#: revpiprogram.py:193
msgid "Download process image dump"
msgstr "Prozessabbild Dump herunterladen"
-#: revpiprogram.py:204
+#: revpiprogram.py:203
msgid "Reset piControl"
msgstr "piControl zurücksetzen"
-#: revpiprogram.py:207
+#: revpiprogram.py:206
msgid "Execute piControlReset"
msgstr "piControlReset ausführen"
-#: revpiprogram.py:211
+#: revpiprogram.py:210
msgid "execute"
msgstr "ausführen"
-#: revpiprogram.py:217 revpipycontrol.py:96
+#: revpiprogram.py:216 revpipycontrol.py:96
msgid "Exit"
msgstr "Beenden"
-#: revpiprogram.py:297 revpiprogram.py:326 revpiprogram.py:464
-#: revpiprogram.py:477
+#: revpiprogram.py:296 revpiprogram.py:327 revpiprogram.py:461
+#: revpiprogram.py:474
msgid "Save as..."
msgstr "Speichern unter..."
-#: revpiprogram.py:300 revpiprogram.py:359
+#: revpiprogram.py:299 revpiprogram.py:362
msgid "piCtory config"
msgstr "piCtory Konfiguration"
-#: revpiprogram.py:300 revpiprogram.py:329 revpiprogram.py:359
-#: revpiprogram.py:468 revpiprogram.py:481 revpiprogram.py:549
-#: revpiprogram.py:574 revpiprogram.py:603
+#: revpiprogram.py:299 revpiprogram.py:330 revpiprogram.py:362
+#: revpiprogram.py:465 revpiprogram.py:478 revpiprogram.py:548
+#: revpiprogram.py:573 revpiprogram.py:603
msgid "All files"
msgstr "Alle Dateien"
-#: revpiprogram.py:308 revpiprogram.py:337 revpiprogram.py:521
+#: revpiprogram.py:307 revpiprogram.py:338 revpiprogram.py:518
msgid "Could not load and save file!"
msgstr "Datei konnte nicht geladen und gespeichert werden!"
-#: revpiprogram.py:312 revpiprogram.py:341 revpiprogram.py:379
-#: revpiprogram.py:388 revpiprogram.py:430 revpiprogram.py:525
+#: revpiprogram.py:312 revpiprogram.py:343 revpiprogram.py:381
+#: revpiprogram.py:389 revpiprogram.py:427 revpiprogram.py:523
#: revpiprogram.py:672
msgid "Success"
msgstr "Erfolgreich"
-#: revpiprogram.py:313 revpiprogram.py:342 revpiprogram.py:526
+#: revpiprogram.py:313 revpiprogram.py:344 revpiprogram.py:524
msgid "File successfully loaded and saved."
msgstr "Dateien erfolgreich übertragen und gespeichert."
-#: revpiprogram.py:329
+#: revpiprogram.py:330
msgid "Imagefiles"
msgstr "Image Dateien"
-#: revpiprogram.py:355
+#: revpiprogram.py:358
msgid "Open piCtory file..."
msgstr "piCtory Datei öffnen"
-#: revpiprogram.py:369
+#: revpiprogram.py:371
msgid ""
"Should the piControl driver be reset after uploading the piCtory "
"configuration?"
@@ -390,7 +390,7 @@ msgstr ""
"Soll nach dem Hochladen der piCtory Konfiguration ein Reset am piControl "
"Treiber durchgeführt werden?"
-#: revpiprogram.py:381
+#: revpiprogram.py:382
msgid ""
"The transfer of the piCtory configuration and the reset of piControl have "
"been successfully executed"
@@ -402,18 +402,18 @@ msgstr ""
msgid "The piCtory configuration was successfully transferred"
msgstr "Die Übertragung der piCtory Konfiguration wurde erfolgreich ausgeführt"
-#: revpiprogram.py:402
+#: revpiprogram.py:401
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 revpipycontrol.py:199 revpipycontrol.py:247
-#: revpipycontrol.py:267
+#: revpiprogram.py:407 revpipycontrol.py:199 revpipycontrol.py:246
+#: revpipycontrol.py:266
msgid "Warning"
msgstr "Warnung"
-#: revpiprogram.py:410
+#: revpiprogram.py:408
msgid ""
"The piCtroy configuration has been saved successfully. \n"
"An error occurred on piControl reset!"
@@ -421,7 +421,7 @@ msgstr ""
"Die piCtroy Konfiguration wurde erfolgreich gespeichert. \n"
"Beim piControl Reset trat allerdings ein Fehler auf!"
-#: revpiprogram.py:422
+#: revpiprogram.py:419
msgid ""
"Are you sure to reset piControl? \n"
"The process image and the piBridge are interrupted !!!"
@@ -429,27 +429,27 @@ msgstr ""
"Soll piControlReset wirklich durchgeführt werden? \n"
"Das Prozessabbild und die Steuerung werden dann unterbrochen!!!"
-#: revpiprogram.py:431
+#: revpiprogram.py:428
msgid "piControlReset executed successfully"
msgstr "piControl Reset war erfolgreich"
-#: revpiprogram.py:437
+#: revpiprogram.py:434
msgid "piControl reset could not be executed successfully"
msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden"
-#: revpiprogram.py:451
+#: revpiprogram.py:448
msgid "Directory to save"
msgstr "Verzeichnis zum Ablegen"
-#: revpiprogram.py:559
+#: revpiprogram.py:558
msgid "Folder to upload"
msgstr "Verzeichnis zum Hochladen"
-#: revpiprogram.py:570
+#: revpiprogram.py:569
msgid "Upload Zip archive..."
msgstr "Zip Archiv hochladen..."
-#: revpiprogram.py:591
+#: revpiprogram.py:590
msgid "The specified file is not a ZIP archive."
msgstr "Die angegebene Datei ist kein ZIP Archiv"
@@ -474,11 +474,11 @@ msgstr "Die Übertragung war erfolgreich."
msgid "There is no piCtory configuration in this archive."
msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden."
-#: revpiprogram.py:704
+#: revpiprogram.py:703
msgid "The Revolution Pi could not process some parts of the transmission."
msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten."
-#: revpiprogram.py:712
+#: revpiprogram.py:711
msgid "Errors occurred during transmission"
msgstr "Bei der Übertragung traten Fehler auf"
@@ -530,7 +530,7 @@ msgstr "Trennen"
msgid "Connect"
msgstr "Verbinden"
-#: revpipycontrol.py:201
+#: revpipycontrol.py:200
msgid ""
"The watch mode ist not supported in version {} of RevPiPyLoad on your RevPi! "
"You need at least version 0.4.0."
@@ -538,7 +538,7 @@ msgstr ""
"Die Debug-Funktion wird von der RevPiPyLoad Version {} auf dem RevPi nicht "
"unterstützt! Sie benötigen mindestens Version 0.4.0."
-#: revpipycontrol.py:249 revpipycontrol.py:269
+#: revpipycontrol.py:248 revpipycontrol.py:268
msgid ""
"XML-RPC access mode in the RevPiPyLoad configuration is to small to access "
"this dialog"
@@ -546,6 +546,6 @@ msgstr ""
"Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um "
"diesen Dialog zu verwenden!"
-#: revpipycontrol.py:309
+#: revpipycontrol.py:308
msgid "Can not reach server!"
msgstr "Server ist nicht erreichbar!"
diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py
index 23a59f2..2d3c955 100644
--- a/revpipycontrol/revpioption.py
+++ b/revpipycontrol/revpioption.py
@@ -12,6 +12,7 @@ from mytools import gettrans
# Übersetzung laden
_ = gettrans()
+
class RevPiOption(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode):
@@ -60,14 +61,16 @@ class RevPiOption(tkinter.Frame):
ckb_zexit = tkinter.Checkbutton(stst, justify="left")
ckb_zexit["state"] = self.xmlstate
- ckb_zexit["text"] = _("Set process image to NULL if program\n"
+ ckb_zexit["text"] = _(
+ "Set process image to NULL if program\n"
"terminates successfully")
ckb_zexit["variable"] = self.var_zexit
ckb_zexit.grid(**cpadw)
ckb_zerr = tkinter.Checkbutton(stst, justify="left")
ckb_zerr["state"] = self.xmlstate
- ckb_zerr["text"] = _("Set process image to NULL if program\n"
+ ckb_zerr["text"] = _(
+ "Set process image to NULL if program\n"
"terminates with errors")
ckb_zerr["variable"] = self.var_zerr
ckb_zerr.grid(**cpadw)
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 1e6df5e..3047f59 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -63,11 +63,9 @@ class RevPiProgram(tkinter.Frame):
if True or self.uploaded:
tkmsg.showinfo(
_("Information"),
- _(
- "A PLC program has been uploaded. Please check the "
+ _("A PLC program has been uploaded. Please check the "
"PLC options to see if the correct program is specified "
- "as the start program."
- ),
+ "as the start program."),
parent=self.master
)
self.master.destroy()
@@ -305,13 +303,15 @@ class RevPiProgram(tkinter.Frame):
fh.write(self.xmlcli.get_pictoryrsc().data)
except:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("Could not load and save file!")
+ _("Error"),
+ _("Could not load and save file!"),
+ parent=self.master,
)
else:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_("File successfully loaded and saved.")
+ _("Success"),
+ _("File successfully loaded and saved."),
+ parent=self.master
)
# Einstellungen speichern
self.opt["getpictoryrsc_dir"] = os.path.dirname(fh.name)
@@ -334,13 +334,15 @@ class RevPiProgram(tkinter.Frame):
fh.write(self.xmlcli.get_procimg().data)
except:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("Could not load and save file!")
+ _("Error"),
+ _("Could not load and save file!"),
+ parent=self.master
)
else:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_("File successfully loaded and saved.")
+ _("Success"),
+ _("File successfully loaded and saved."),
+ parent=self.master
)
# Einstellungen speichern
self.opt["getprocimg_dir"] = os.path.dirname(fh.name)
@@ -365,11 +367,10 @@ class RevPiProgram(tkinter.Frame):
if fh is not None:
ask = tkmsg.askyesno(
- parent=self.master, title=_("Question"),
- message=_(
- "Should the piControl driver be reset after "
- "uploading the piCtory configuration?"
- )
+ _("Question"),
+ _("Should the piControl driver be reset after "
+ "uploading the piCtory configuration?"),
+ parent=self.master
)
ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask)
@@ -377,20 +378,18 @@ class RevPiProgram(tkinter.Frame):
if ec == 0:
if ask:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_(
- "The transfer of the piCtory configuration "
+ _("Success"),
+ _("The transfer of the piCtory configuration "
"and the reset of piControl have been "
- "successfully executed"
- )
+ "successfully executed"),
+ parent=self.master
)
else:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_(
- "The piCtory configuration was "
- "successfully transferred"
- )
+ _("Success"),
+ _("The piCtory configuration was "
+ "successfully transferred"),
+ parent=self.master
)
# Einstellungen speichern
@@ -398,19 +397,17 @@ class RevPiProgram(tkinter.Frame):
self._savedefaults()
elif ec < 0:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_(
- "The piCtory configuration could not be "
- "written on the Revolution Pi."
- )
+ _("Error"),
+ _("The piCtory configuration could not be "
+ "written on the Revolution Pi."),
+ parent=self.master
)
elif ec > 0:
tkmsg.showwarning(
- parent=self.master, title=_("Warning"),
- message=_(
- "The piCtroy configuration has been saved "
- "successfully. \nAn error occurred on piControl reset!"
- )
+ _("Warning"),
+ _("The piCtroy configuration has been saved successfully."
+ " \nAn error occurred on piControl reset!"),
+ parent=self.master
)
fh.close()
@@ -418,25 +415,24 @@ class RevPiProgram(tkinter.Frame):
def picontrolreset(self):
u"""Fürt ein Reset der piBridge durch."""
ask = tkmsg.askyesno(
- parent=self.master, title=_("Question"),
- message=_(
- "Are you sure to reset piControl? \nThe process image "
- "and the piBridge are interrupted !!!"
- )
+ _("Question"),
+ _("Are you sure to reset piControl? \nThe process image "
+ "and the piBridge are interrupted !!!"),
+ parent=self.master
)
if ask:
ec = self.xmlcli.resetpicontrol()
if ec == 0:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_("piControlReset executed successfully")
+ _("Success"),
+ _("piControlReset executed successfully"),
+ parent=self.master
)
else:
tkmsg.showerror(
- parten=self.master, title=_("Error"),
- message=_(
- "piControl reset could not be executed successfully"
- )
+ _("Error"),
+ _("piControl reset could not be executed successfully"),
+ parten=self.master
)
def plcdownload(self):
@@ -518,13 +514,15 @@ class RevPiProgram(tkinter.Frame):
except:
raise
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("Could not load and save file!")
+ _("Error"),
+ _("Could not load and save file!"),
+ parent=self.master
)
else:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_("File successfully loaded and saved.")
+ _("Success"),
+ _("File successfully loaded and saved."),
+ parent=self.master
)
# Einstellungen speichern
@@ -588,8 +586,9 @@ class RevPiProgram(tkinter.Frame):
else:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("The specified file is not a ZIP archive.")
+ _("Error"),
+ _("The specified file is not a ZIP archive."),
+ parent=self.master
)
return False
@@ -618,8 +617,9 @@ class RevPiProgram(tkinter.Frame):
else:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("The specified file is not a TAR archive.")
+ _("Error"),
+ _("The specified file is not a TAR archive."),
+ parent=self.master
)
return False
@@ -630,11 +630,10 @@ class RevPiProgram(tkinter.Frame):
# Vor Übertragung aufräumen wenn ausgewählt
if self.var_cleanup.get() and not self.xmlcli.plcuploadclean():
tkmsg.showerror(
- parent=self.masger, title=_("Error"),
- message=_(
- "There was an error deleting the files on the "
- "Revolution Pi."
- )
+ _("Error"),
+ _("There was an error deleting the files on the "
+ "Revolution Pi."),
+ parent=self.master
)
return False
@@ -670,8 +669,9 @@ class RevPiProgram(tkinter.Frame):
if ec == 0:
tkmsg.showinfo(
- parent=self.master, title=_("Success"),
- message=_("The transfer was successful.")
+ _("Success"),
+ _("The transfer was successful."),
+ parent=self.master
)
if self.var_picup.get():
@@ -679,11 +679,10 @@ class RevPiProgram(tkinter.Frame):
self.setpictoryrsc(rscfile)
else:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_(
- "There is no piCtory configuration in this "
- "archive."
- )
+ _("Error"),
+ _("There is no piCtory configuration in this "
+ "archive."),
+ parent=self.master
)
# Einstellungen speichern
@@ -700,17 +699,17 @@ class RevPiProgram(tkinter.Frame):
elif ec == -1:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_(
- "The Revolution Pi could not process some parts of the "
- "transmission."
- )
+ _("Error"),
+ _("The Revolution Pi could not process some parts of the "
+ "transmission."),
+ parent=self.master
)
elif ec == -2:
tkmsg.showerror(
- parent=self.master, title=_("Error"),
- message=_("Errors occurred during transmission")
+ _("Error"),
+ _("Errors occurred during transmission"),
+ parent=self.master
)
# Temp-Dir aufräumen
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index 241b634..2051e76 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -196,12 +196,11 @@ class RevPiPyControl(tkinter.Frame):
if "psstart" not in self.xmlfuncs:
tkmsg.showwarning(
- parent=self.master, title=_("Warning"),
- message=_(
- "The watch mode ist not supported in version {} "
+ _("Warning"),
+ _("The watch mode ist not supported in version {} "
"of RevPiPyLoad on your RevPi! You need at least version "
- "0.4.0."
- ).format(self.cli.version())
+ "0.4.0.").format(self.cli.version()),
+ parent=self.master
)
else:
# Debugfenster laden
From a60431e45633a2104dc25130453e04a4d61310e6 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Thu, 29 Jun 2017 20:11:55 +0200
Subject: [PATCH 06/13] RevPiLogfile auf neue Byte?bertragung angepasst
Reaktion auf Fehlerbytes vom RevPi f?r Logfile In Dialogfenster ESC zum
schlie?en eingebaut _checkclose Funktionen zur Pr?fung auf ?nderung und
Schlie?en hinzugef?gt
---
revpipycontrol.e4p | 4 +-
.../locale/de/LC_MESSAGES/revpipycontrol.po | 202 ++++++++++--------
revpipycontrol/revpilogfile.py | 117 +++++++---
revpipycontrol/revpioption.py | 70 ++++--
revpipycontrol/revpiplclist.py | 32 +--
revpipycontrol/revpiprogram.py | 22 +-
revpipycontrol/revpipycontrol.py | 41 +++-
setup.py | 2 +-
8 files changed, 314 insertions(+), 176 deletions(-)
diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p
index b5d5115..4e778ae 100644
--- a/revpipycontrol.e4p
+++ b/revpipycontrol.e4p
@@ -1,7 +1,7 @@
-
+
en_US
@@ -9,7 +9,7 @@
Python3
Console
- 0.4.0
+ 0.4.1
Sven Sager
akira@narux.de
diff --git a/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po b/revpipycontrol/locale/de/LC_MESSAGES/revpipycontrol.po
index 73a88ce..0fd8feb 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-29 12:59+0200\n"
-"PO-Revision-Date: 2017-06-29 13:03+0200\n"
+"POT-Creation-Date: 2017-06-29 20:10+0200\n"
+"PO-Revision-Date: 2017-06-29 20:10+0200\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: de\n"
@@ -43,39 +43,56 @@ msgstr "Aktualisiere automatisch"
msgid "Write values to RevPi"
msgstr "Schreibe Werte auf RevPi"
-#: revpilogfile.py:27
+#: revpilogfile.py:37
msgid "RevPi Python PLC Logs"
msgstr "RevPi Python PLC Logdaten"
-#: revpilogfile.py:40
+#: revpilogfile.py:50
msgid "RevPiPyLoad - Logfile"
msgstr "RevPiPyLoad - Logdatei"
-#: revpilogfile.py:44 revpilogfile.py:59
+#: revpilogfile.py:54 revpilogfile.py:69
msgid "Clear screen"
msgstr "Leere Ansicht"
-#: revpilogfile.py:55
+#: revpilogfile.py:65
msgid "Python PLC program - Logfile"
msgstr "Python PLC Programm - Logdatei"
-#: revpioption.py:33
+#: revpilogfile.py:145
+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
+msgid "Question"
+msgstr "Frage"
+
+#: revpioption.py:62 revpiplclist.py:59
+msgid ""
+"Do you really want to quit? \n"
+"Unsaved changes will be lost"
+msgstr ""
+"Wollen Sie wirklich beenden? \n"
+"Nicht gespeicherte Änderungen gehen verloren"
+
+#: revpioption.py:72
msgid "RevPi Python PLC Options"
msgstr "RevPi Python PLC Einstellungen"
-#: revpioption.py:41
+#: revpioption.py:80
msgid "Start / Stop behavior"
msgstr "Start / Stop Verhalten"
-#: revpioption.py:50
+#: revpioption.py:89
msgid "Start program automatically"
msgstr "Starte Programm automatisch"
-#: revpioption.py:56
+#: revpioption.py:95
msgid "Restart program after exit"
msgstr "Starte Programm nach Beenden neu"
-#: revpioption.py:63
+#: revpioption.py:103
msgid ""
"Set process image to NULL if program\n"
"terminates successfully"
@@ -83,7 +100,7 @@ msgstr ""
"\"Prozessabbild auf NULL setzen, wenn Programm\n"
"\"erfolgreich beendet wird\""
-#: revpioption.py:70
+#: revpioption.py:111
msgid ""
"Set process image to NULL if program\n"
"terminates with errors"
@@ -91,35 +108,35 @@ msgstr ""
"Prozessabbild auf NULL setzen, wenn Programm\n"
"fehlerhaft beendet wird"
-#: revpioption.py:77
+#: revpioption.py:118
msgid "PLC program"
msgstr "PLC Programm"
-#: revpioption.py:88
+#: revpioption.py:129
msgid "Python version"
msgstr "Python Version"
-#: revpioption.py:105
+#: revpioption.py:146
msgid "Python PLC program name"
msgstr "Python PLC Programmname"
-#: revpioption.py:117
+#: revpioption.py:158
msgid "Program arguments"
msgstr "Programmargumente"
-#: revpioption.py:126
+#: revpioption.py:167
msgid "Use RevPi as PLC-Slave"
msgstr "RevPi als PLC-Slave verwenden"
-#: revpioption.py:133
+#: revpioption.py:174
msgid "XML-RPC server"
msgstr "XML-RPC Server"
-#: revpioption.py:145
+#: revpioption.py:186
msgid "Activate XML-RPC server on RevPi"
msgstr "Aktiviere XML-RPC Server auf RevPi"
-#: revpioption.py:153
+#: revpioption.py:194
msgid ""
"Allow download of piCtory configuration and\n"
"PLC programm"
@@ -127,7 +144,7 @@ msgstr ""
"Download von piCtroy Konfiguration und\n"
"PLC Programm zulassen"
-#: revpioption.py:160
+#: revpioption.py:201
msgid ""
"Allow upload of piCtory configuration and\n"
"PLC programm"
@@ -135,24 +152,19 @@ msgstr ""
"Hochladen von piCtroy Konfiguration und\n"
"PLC Programm zulassen"
-#: revpioption.py:165
+#: revpioption.py:206
msgid "XML-RPC server port"
msgstr "XML-RPC Serverport"
-#: revpioption.py:179 revpiplclist.py:111
+#: revpioption.py:220 revpiplclist.py:125
msgid "Save"
msgstr "Speichern"
-#: revpioption.py:184 revpiplclist.py:114
+#: revpioption.py:225 revpiplclist.py:128
msgid "Close"
msgstr "Schließen"
-#: revpioption.py:230 revpioption.py:254 revpiplclist.py:150
-#: revpiplclist.py:175 revpiprogram.py:370 revpiprogram.py:418
-msgid "Question"
-msgstr "Frage"
-
-#: revpioption.py:231
+#: revpioption.py:274
msgid ""
"The settings are now saved on the Revolution Pi. \n"
"\n"
@@ -164,29 +176,29 @@ msgstr ""
"Sollen die neuen Einstellungen sofort in Kraft treten?\n"
"Dies bedeutet einen Neustart des Dienstes und des laufenden PLC-Programms!"
-#: revpioption.py:239 revpiplclist.py:190 revpiprogram.py:65
+#: revpioption.py:282 revpiplclist.py:190 revpiprogram.py:65
msgid "Information"
msgstr "Information"
-#: revpioption.py:240
+#: revpioption.py:283
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
-#: revpioption.py:245 revpiplclist.py:198 revpiprogram.py:306
+#: revpioption.py:288 revpiplclist.py:198 revpiprogram.py:306
#: revpiprogram.py:337 revpiprogram.py:400 revpiprogram.py:433
-#: revpiprogram.py:517 revpiprogram.py:589 revpiprogram.py:620
-#: revpiprogram.py:633 revpiprogram.py:682 revpiprogram.py:702
-#: revpiprogram.py:710 revpipycontrol.py:307
+#: revpiprogram.py:515 revpiprogram.py:587 revpiprogram.py:618
+#: revpiprogram.py:631 revpiprogram.py:686 revpiprogram.py:706
+#: revpiprogram.py:714 revpipycontrol.py:325
msgid "Error"
msgstr "Fehler"
-#: revpioption.py:246
+#: revpioption.py:289
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!"
-#: revpioption.py:255
+#: revpioption.py:299
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."
@@ -194,42 +206,34 @@ 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:54
+#: revpiplclist.py:68
msgid "RevPi Python PLC connections"
msgstr "RevPi Python PLC Verbindungen"
-#: revpiplclist.py:74
+#: revpiplclist.py:88
msgid "Name"
msgstr "Name"
-#: revpiplclist.py:81
+#: revpiplclist.py:95
msgid "IP address"
msgstr "IP Adresse"
-#: revpiplclist.py:89
+#: revpiplclist.py:103
msgid "Port"
msgstr "Port"
-#: revpiplclist.py:98
+#: revpiplclist.py:112
msgid "New"
msgstr "Neu"
-#: revpiplclist.py:101
+#: revpiplclist.py:115
msgid "Apply"
msgstr "Übernehmen"
-#: revpiplclist.py:105
+#: revpiplclist.py:119
msgid "Remove"
msgstr "Entfernen"
-#: revpiplclist.py:151
-msgid ""
-"Do you really want to quit? \n"
-"Unsaved changes will be lost"
-msgstr ""
-"Wollen Sie wirklich beenden? \n"
-"Nicht gespeicherte Änderungen gehen verloren"
-
#: revpiplclist.py:176
msgid "Do you really want to delete the selected connection '{}'"
msgstr "Wollen Sie die ausgewählte Verbindung '{}' wirklich löschen?"
@@ -268,12 +272,12 @@ msgid "Files"
msgstr "Dateien"
#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:465
-#: revpiprogram.py:573
+#: revpiprogram.py:571
msgid "Zip archive"
msgstr "Zip Archiv"
#: revpiprogram.py:98 revpiprogram.py:100 revpiprogram.py:478
-#: revpiprogram.py:603
+#: revpiprogram.py:601
msgid "TGZ archive"
msgstr "TGZ Archiv"
@@ -341,7 +345,7 @@ msgstr "piControlReset ausführen"
msgid "execute"
msgstr "ausführen"
-#: revpiprogram.py:216 revpipycontrol.py:96
+#: revpiprogram.py:216 revpipycontrol.py:95
msgid "Exit"
msgstr "Beenden"
@@ -355,22 +359,22 @@ msgid "piCtory config"
msgstr "piCtory Konfiguration"
#: revpiprogram.py:299 revpiprogram.py:330 revpiprogram.py:362
-#: revpiprogram.py:465 revpiprogram.py:478 revpiprogram.py:548
-#: revpiprogram.py:573 revpiprogram.py:603
+#: revpiprogram.py:465 revpiprogram.py:478 revpiprogram.py:546
+#: revpiprogram.py:571 revpiprogram.py:601
msgid "All files"
msgstr "Alle Dateien"
-#: revpiprogram.py:307 revpiprogram.py:338 revpiprogram.py:518
+#: revpiprogram.py:307 revpiprogram.py:338 revpiprogram.py:516
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:523
-#: revpiprogram.py:672
+#: revpiprogram.py:389 revpiprogram.py:427 revpiprogram.py:521
+#: revpiprogram.py:676
msgid "Success"
msgstr "Erfolgreich"
-#: revpiprogram.py:313 revpiprogram.py:344 revpiprogram.py:524
+#: revpiprogram.py:313 revpiprogram.py:344 revpiprogram.py:522
msgid "File successfully loaded and saved."
msgstr "Dateien erfolgreich übertragen und gespeichert."
@@ -408,8 +412,8 @@ msgstr ""
"Die piCtory Konfiguration konnte auf dem Revolution Pi nicht geschrieben "
"werden."
-#: revpiprogram.py:407 revpipycontrol.py:199 revpipycontrol.py:246
-#: revpipycontrol.py:266
+#: revpiprogram.py:407 revpipycontrol.py:211 revpipycontrol.py:250
+#: revpipycontrol.py:268 revpipycontrol.py:286
msgid "Warning"
msgstr "Warnung"
@@ -441,104 +445,124 @@ msgstr "piControl Reset konnte nicht erfolgreich durchgeführt werden"
msgid "Directory to save"
msgstr "Verzeichnis zum Ablegen"
-#: revpiprogram.py:558
+#: revpiprogram.py:556
msgid "Folder to upload"
msgstr "Verzeichnis zum Hochladen"
-#: revpiprogram.py:569
+#: revpiprogram.py:567
msgid "Upload Zip archive..."
msgstr "Zip Archiv hochladen..."
-#: revpiprogram.py:590
+#: revpiprogram.py:588
msgid "The specified file is not a ZIP archive."
msgstr "Die angegebene Datei ist kein ZIP Archiv"
-#: revpiprogram.py:599
+#: revpiprogram.py:597
msgid "Upload TarGz archiv..."
msgstr "TarGz Archiv hochladen..."
-#: revpiprogram.py:621
+#: revpiprogram.py:619
msgid "The specified file is not a TAR archive."
msgstr "Die angegebene Datei ist kein TAR Archiv."
-#: revpiprogram.py:634
+#: revpiprogram.py:632
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:673
+#: revpiprogram.py:677
msgid "The transfer was successful."
msgstr "Die Übertragung war erfolgreich."
-#: revpiprogram.py:683
+#: revpiprogram.py:687
msgid "There is no piCtory configuration in this archive."
msgstr "Es wurde keine piCtory Konfiguration im Archiv gefunden."
-#: revpiprogram.py:703
+#: revpiprogram.py:707
msgid "The Revolution Pi could not process some parts of the transmission."
msgstr "Der Revoluton Pi konnte Teile der Übertragung nicht verarbeiten."
-#: revpiprogram.py:711
+#: revpiprogram.py:715
msgid "Errors occurred during transmission"
msgstr "Bei der Übertragung traten Fehler auf"
-#: revpipycontrol.py:94
+#: revpipycontrol.py:93
msgid "Connections..."
msgstr "Verbindungen..."
-#: revpipycontrol.py:97
+#: revpipycontrol.py:96
msgid "Main"
msgstr "Datei"
+#: revpipycontrol.py:104
+msgid "Visit website..."
+msgstr "Webseite besuchen..."
+
+#: revpipycontrol.py:106
+msgid "Info..."
+msgstr "Info..."
+
#: revpipycontrol.py:108
+msgid "Help"
+msgstr "Hilfe"
+
+#: revpipycontrol.py:116
msgid "PLC start"
msgstr "PLC Start"
-#: revpipycontrol.py:113
+#: revpipycontrol.py:121
msgid "PLC stop"
msgstr "PLC Stopp"
-#: revpipycontrol.py:118
+#: revpipycontrol.py:126
msgid "PLC restart"
msgstr "PLC Neustart"
-#: revpipycontrol.py:123
+#: revpipycontrol.py:131
msgid "PLC logs"
msgstr "PLC Logs"
-#: revpipycontrol.py:134
+#: revpipycontrol.py:142
msgid "PLC watch mode"
msgstr "PLC watch Modus"
-#: revpipycontrol.py:151
+#: revpipycontrol.py:159
msgid "PLC log..."
msgstr "PLC Log..."
-#: revpipycontrol.py:153
+#: revpipycontrol.py:161
msgid "PLC options..."
msgstr "PLC Optionen..."
-#: revpipycontrol.py:155
+#: revpipycontrol.py:163
msgid "PLC program..."
msgstr "PLC Programm..."
-#: revpipycontrol.py:159
+#: revpipycontrol.py:167
msgid "Disconnect"
msgstr "Trennen"
-#: revpipycontrol.py:164
+#: revpipycontrol.py:172
msgid "Connect"
msgstr "Verbinden"
-#: revpipycontrol.py:200
+#: revpipycontrol.py:212
msgid ""
"The watch mode ist not supported in version {} of RevPiPyLoad on your RevPi! "
"You need at least version 0.4.0."
msgstr ""
-"Die Debug-Funktion wird von der RevPiPyLoad Version {} auf dem RevPi nicht "
+"Der Watch-Modus wird von der RevPiPyLoad Version {} auf dem RevPi nicht "
"unterstützt! Sie benötigen mindestens Version 0.4.0."
-#: revpipycontrol.py:248 revpipycontrol.py:268
+#: revpipycontrol.py:251
+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:269 revpipycontrol.py:287
msgid ""
"XML-RPC access mode in the RevPiPyLoad configuration is to small to access "
"this dialog"
@@ -546,6 +570,6 @@ msgstr ""
"Der XML-RPC Modus ist beim RevPiPyLoad nicht hoch genug eingestellt, um "
"diesen Dialog zu verwenden!"
-#: revpipycontrol.py:308
+#: revpipycontrol.py:326
msgid "Can not reach server!"
msgstr "Server ist nicht erreichbar!"
diff --git a/revpipycontrol/revpilogfile.py b/revpipycontrol/revpilogfile.py
index 060ed49..646bea3 100644
--- a/revpipycontrol/revpilogfile.py
+++ b/revpipycontrol/revpilogfile.py
@@ -5,7 +5,6 @@
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
-import pickle
import tkinter
from mytools import gettrans
@@ -16,14 +15,25 @@ _ = gettrans()
class RevPiLogfile(tkinter.Frame):
def __init__(self, master, xmlcli):
+ u"""Init RevPiLogfile-Class."""
super().__init__(master)
+ self.master.bind("", self._closewin)
self.pack(fill="both", expand=True)
self.xmlcli = xmlcli
+ # Systemvariablen
+ self.loadblock = 16384
+ self.mrkapp = 0
+ self.mrkplc = 0
+
# Fenster bauen
self._createwidgets()
+ def _closewin(self, event):
+ self.master.destroy()
+
def _createwidgets(self):
+ u"""Erstellt alle Widgets."""
self.master.wm_title(_("RevPi Python PLC Logs"))
self.rowconfigure(0, weight=0)
@@ -65,47 +75,84 @@ class RevPiLogfile(tkinter.Frame):
self.applog["yscrollcommand"] = self.appscr.set
self.appscr["command"] = self.applog.yview
- self.get_applog()
- self.get_plclog()
-
- # Timer zum nachladen aktivieren
- self.master.after(1000, self.get_applines)
- self.master.after(1000, self.get_plclines)
+ # Logtimer zum Laden starten
+ self.get_applog(full=True)
+ self.get_plclog(full=True)
def btn_clearapp(self):
+ u"""Leert die Logliste der App."""
self.applog.delete(1.0, tkinter.END)
def btn_clearplc(self):
+ u"""Leert die Logliste des PLC."""
self.plclog.delete(1.0, tkinter.END)
- def get_applines(self):
- roll = self.applog.yview()[1] == 1.0
- try:
- for line in pickle.loads(self.xmlcli.get_applines().data):
- self.applog.insert(tkinter.END, line)
- except:
- pass
- if roll:
- self.applog.see(tkinter.END)
- self.master.after(1000, self.get_applines)
+ def get_applog(self, full=False):
+ u"""Ruft App Logbuch ab.
+ @param full: Ganzes Logbuch laden"""
- def get_applog(self):
- self.applog.delete(1.0, tkinter.END)
- self.applog.insert(1.0, pickle.loads(self.xmlcli.get_applog().data))
- self.applog.see(tkinter.END)
+ # Logs abrufen und letzte Position merken
+ self.mrkapp = self._load_log(
+ self.applog, self.xmlcli.load_applog, self.mrkapp, full
+ )
- def get_plclines(self):
- roll = self.plclog.yview()[1] == 1.0
- try:
- for line in pickle.loads(self.xmlcli.get_plclines().data):
- self.plclog.insert(tkinter.END, line)
- except:
- pass
- if roll:
- self.plclog.see(tkinter.END)
- self.master.after(1000, self.get_plclines)
+ # Timer neu starten
+ self.master.after(1000, self.get_applog)
- def get_plclog(self):
- self.plclog.delete(1.0, tkinter.END)
- self.plclog.insert(1.0, pickle.loads(self.xmlcli.get_plclog().data))
- self.plclog.see(tkinter.END)
+ def get_plclog(self, full=False):
+ u"""Ruft PLC Logbuch ab.
+ @param full: Ganzes Logbuch laden"""
+
+ # Logs abrufen und letzte Position merken
+ self.mrkplc = self._load_log(
+ self.plclog, self.xmlcli.load_plclog, self.mrkplc, full
+ )
+
+ # Timer neu starten
+ self.master.after(1000, self.get_plclog)
+
+ def _load_log(self, textwidget, xmlcall, startposition, full):
+ u"""Läd die angegebenen Logfiles herunter.
+
+ @param textwidget: Widget in das Logs eingefügt werden sollen
+ @param xmlcall: xmlrpc Funktion zum Abrufen der Logdaten
+ @param startposition: Startposition ab der Logdaten kommen sollen
+ @param full: Komplettes Logbuch laden
+ @returns: Ende der Datei (neue Startposition)
+
+ """
+ roll = textwidget.yview()[1] == 1.0
+ startposition = 0 if full else startposition
+ logbytes = b''
+ while True:
+ # Datenblock vom XML-RPC Server holen
+ bytebuff = xmlcall(startposition, self.loadblock).data
+
+ logbytes += bytebuff
+ startposition += len(bytebuff)
+
+ # Prüfen ob alle Daten übertragen wurden
+ if len(bytebuff) < self.loadblock:
+ break
+
+ if full:
+ textwidget.delete(1.0, tkinter.END)
+
+ if bytebuff == b'\x16': #
+ # Kein Zugriff auf Logdatei
+ textwidget.delete(1.0, tkinter.END)
+ textwidget.insert(
+ tkinter.END, _("Can not access log file on the RevPi")
+ )
+ elif bytebuff == b'\x19': #
+ # Logdatei neu begonnen
+ startposition = 0
+ else:
+ # Text in Widget übernehmen
+ textwidget.insert(tkinter.END, logbytes.decode("utf-8"))
+
+ # Automatisch ans Ende rollen
+ if roll or full:
+ textwidget.see(tkinter.END)
+
+ return startposition
diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py
index 2d3c955..2d0afb4 100644
--- a/revpipycontrol/revpioption.py
+++ b/revpipycontrol/revpioption.py
@@ -16,10 +16,14 @@ _ = gettrans()
class RevPiOption(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode):
+ u"""Init RevPiOption-Class.
+ @returns: None"""
if xmlmode < 2:
return None
super().__init__(master)
+ self.master.bind("", self._checkclose)
+ self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
self.pack(expand=True, fill="both")
self.xmlcli = xmlcli
@@ -30,7 +34,41 @@ class RevPiOption(tkinter.Frame):
self._createwidgets()
self._loadappdata()
+ def _changesdone(self):
+ u"""Prüft ob sich die Einstellungen geändert haben.
+ @returns: 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)
+ or self.var_xmlport.get() != self.dc.get("xmlrpcport", "55123")
+ )
+
+ def _checkclose(self, event=None):
+ u"""Prüft ob Fenster beendet werden soll.
+ @param event: tkinter-Event"""
+ ask = True
+ if self._changesdone():
+ ask = tkmsg.askyesno(
+ _("Question"),
+ _("Do you really want to quit? \nUnsaved changes will "
+ "be lost"),
+ parent=self.master
+ )
+
+ if ask:
+ self.master.destroy()
+
def _createwidgets(self):
+ u"""Erstellt Widgets."""
self.master.wm_title(_("RevPi Python PLC Options"))
self.master.wm_resizable(width=False, height=False)
@@ -183,30 +221,32 @@ class RevPiOption(tkinter.Frame):
btn_save.grid(column=0, row=3)
btn_close = tkinter.Button(self)
- btn_close["command"] = self.master.destroy
+ btn_close["command"] = self._checkclose
btn_close["text"] = _("Close")
btn_close.grid(column=1, row=3)
def _loadappdata(self):
- dc = self.xmlcli.get_config()
+ u"""Läd aktuelle Einstellungen vom RevPi."""
+ self.dc = self.xmlcli.get_config()
- self.var_start.set(dc.get("autostart", "1"))
- self.var_reload.set(dc.get("autoreload", "1"))
- self.var_zexit.set(dc.get("zeroonexit", "0"))
- self.var_zerr.set(dc.get("zeroonerror", "0"))
+ self.var_start.set(self.dc.get("autostart", "1"))
+ self.var_reload.set(self.dc.get("autoreload", "1"))
+ self.var_zexit.set(self.dc.get("zeroonexit", "0"))
+ self.var_zerr.set(self.dc.get("zeroonerror", "0"))
- self.var_startpy.set(dc.get("plcprogram", "none.py"))
- self.var_startargs.set(dc.get("plcarguments", ""))
- self.var_pythonver.set(dc.get("pythonversion", "3"))
- self.var_slave.set(dc.get("plcslave", "0"))
+ self.var_startpy.set(self.dc.get("plcprogram", "none.py"))
+ self.var_startargs.set(self.dc.get("plcarguments", ""))
+ self.var_pythonver.set(self.dc.get("pythonversion", "3"))
+ self.var_slave.set(self.dc.get("plcslave", "0"))
- self.var_xmlon.set(dc.get("xmlrpc", 0) >= 1)
- self.var_xmlmod2.set(dc.get("xmlrpc", 0) >= 2)
- self.var_xmlmod3.set(dc.get("xmlrpc", 0) >= 3)
+ self.var_xmlon.set(self.dc.get("xmlrpc", 0) >= 1)
+ self.var_xmlmod2.set(self.dc.get("xmlrpc", 0) >= 2)
+ self.var_xmlmod3.set(self.dc.get("xmlrpc", 0) >= 3)
- self.var_xmlport.set(dc.get("xmlrpcport", "55123"))
+ self.var_xmlport.set(self.dc.get("xmlrpcport", "55123"))
def _setappdata(self):
+ u"""Speichert geänderte Einstellungen auf RevPi."""
dc = {}
dc["autostart"] = int(self.var_start.get())
dc["autoreload"] = int(self.var_reload.get())
@@ -252,6 +292,7 @@ class RevPiOption(tkinter.Frame):
)
def askxmlon(self):
+ u"""Fragt Nuter, ob wirklicht abgeschaltet werden soll."""
if not self.var_xmlon.get():
ask = tkmsg.askyesno(
_("Question"),
@@ -266,6 +307,7 @@ class RevPiOption(tkinter.Frame):
self.xmlmods()
def xmlmods(self):
+ u"""Passt XML-Optionszugriff an."""
self.ckb_xmlmod2["state"] = \
"normal" if self.var_xmlon.get() else "disabled"
self.ckb_xmlmod3["state"] = \
diff --git a/revpipycontrol/revpiplclist.py b/revpipycontrol/revpiplclist.py
index 801b845..309c826 100644
--- a/revpipycontrol/revpiplclist.py
+++ b/revpipycontrol/revpiplclist.py
@@ -39,6 +39,7 @@ class RevPiPlcList(tkinter.Frame):
def __init__(self, master):
super().__init__(master)
+ self.master.bind("", self._checkclose)
self.pack()
self.changes = False
@@ -50,10 +51,23 @@ class RevPiPlcList(tkinter.Frame):
self._createwidgets()
self._loadappdata()
+ def _checkclose(self, event=None):
+ ask = True
+ if self.changes:
+ ask = tkmsg.askyesno(
+ _("Question"),
+ _("Do you really want to quit? \nUnsaved changes will "
+ "be lost"),
+ parent=self.master
+ )
+
+ if ask:
+ self.master.destroy()
+
def _createwidgets(self):
self.master.wm_title(_("RevPi Python PLC connections"))
self.master.wm_resizable(width=False, height=False)
- self.master.protocol("WM_DELETE_WINDOW", self.evt_btnclose)
+ self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
# Listbox mit vorhandenen Verbindungen
self.scr_conn = tkinter.Scrollbar(self)
@@ -111,7 +125,7 @@ class RevPiPlcList(tkinter.Frame):
self, text=_("Save"), command=self.evt_btnsave)
self.btn_save.grid(column=3, row=9, sticky="se")
self.btn_close = tkinter.Button(
- self, text=_("Close"), command=self.evt_btnclose)
+ self, text=_("Close"), command=self._checkclose)
self.btn_close.grid(column=4, row=9, sticky="se")
def _loadappdata(self):
@@ -144,20 +158,6 @@ class RevPiPlcList(tkinter.Frame):
self.evt_btnnew()
self.changes = True
- def evt_btnclose(self):
- if self.changes:
- ask = tkmsg.askyesno(
- _("Question"),
- _("Do you really want to quit? \nUnsaved changes will "
- "be lost"),
- parent=self.master
- )
- else:
- ask = True
-
- if ask:
- self.master.destroy()
-
def evt_btnnew(self):
self.list_conn.select_clear(0, "end")
self.evt_listconn()
diff --git a/revpipycontrol/revpiprogram.py b/revpipycontrol/revpiprogram.py
index 3047f59..269eddd 100644
--- a/revpipycontrol/revpiprogram.py
+++ b/revpipycontrol/revpiprogram.py
@@ -40,8 +40,8 @@ class RevPiProgram(tkinter.Frame):
return None
super().__init__(master)
- # FIXME: Warnung kann nerven
- # self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
+ self.master.protocol("WM_DELETE_WINDOW", self._checkclose)
+ self.master.bind("", self._checkclose)
self.pack(expand=True, fill="both")
self.uploaded = False
@@ -59,8 +59,8 @@ class RevPiProgram(tkinter.Frame):
self._evt_optdown()
self._evt_optup()
- def _checkclose(self):
- if True or self.uploaded:
+ def _checkclose(self, event=None):
+ if self.uploaded:
tkmsg.showinfo(
_("Information"),
_("A PLC program has been uploaded. Please check the "
@@ -212,7 +212,7 @@ class RevPiProgram(tkinter.Frame):
# Beendenbutton
btn = tkinter.Button(self)
- btn["command"] = self.master.destroy
+ btn["command"] = self._checkclose
btn["text"] = _("Exit")
btn.grid()
@@ -374,7 +374,7 @@ class RevPiProgram(tkinter.Frame):
)
ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask)
- print(ec)
+
if ec == 0:
if ask:
tkmsg.showinfo(
@@ -496,9 +496,7 @@ class RevPiProgram(tkinter.Frame):
fh_pack = tarfile.open(fh.name)
# Unterverzeichnis streichen
- rootname = ""
for taritem in fh_pack.getmembers():
- print(rootname)
if not taritem.name == "revpipyload":
taritem.name = \
taritem.name.replace("revpipyload/", "")
@@ -637,7 +635,9 @@ class RevPiProgram(tkinter.Frame):
)
return False
- # Flag setzen, weil ab hier Veränderungen existieren
+ # Aktuell konfiguriertes Programm lesen (für uploaded Flag)
+ opt_program = self.xmlcli.get_config()
+ opt_program = opt_program.get("plcprogram", "none.py")
self.uploaded = True
ec = 0
@@ -655,6 +655,10 @@ class RevPiProgram(tkinter.Frame):
else:
sendname = fname.replace(dirselect, "")[1:]
+ # Prüfen ob Dateiname bereits als Startprogramm angegeben ist
+ if sendname == opt_program:
+ self.uploaded = False
+
# Datei übertragen
try:
ustatus = self.xmlcli.plcupload(
diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py
index 2051e76..a46989b 100755
--- a/revpipycontrol/revpipycontrol.py
+++ b/revpipycontrol/revpipycontrol.py
@@ -1,7 +1,7 @@
#!/usr/bin/python3
#
# RevPiPyControl
-# Version: 0.4.0
+# Version: 0.4.1
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
@@ -19,7 +19,6 @@ from functools import partial
from mytools import addroot, gettrans
from xmlrpc.client import ServerProxy
-
# Übersetzung laden
_ = gettrans()
@@ -99,6 +98,15 @@ class RevPiPyControl(tkinter.Frame):
self._fillmbar()
self._fillconnbar()
+ # Hilfe Menü
+ menu1 = tkinter.Menu(self.mbar, tearoff=False)
+ menu1.add_command(
+ label=_("Visit website..."), command=self.visitwebsite)
+ menu1.add_separator()
+ menu1.add_command(label=_("Info..."), command=self.infowindow)
+ # TODO: Menü einbauen
+ self.mbar.add_cascade(label=_("Help"), menu=menu1)
+
self.var_conn = tkinter.StringVar(self)
self.txt_connect = tkinter.Entry(
self, textvariable=self.var_conn, state="readonly", width=30)
@@ -190,6 +198,10 @@ class RevPiPyControl(tkinter.Frame):
))
self.mbar.entryconfig("PLC", state="normal")
+ def infowindow(self):
+ # TODO: Infofenster aufrufen
+ pass
+
def plcdebug(self):
u"""Baut den Debugframe und packt ihn."""
self.btn_debug["state"] = "disabled"
@@ -233,6 +245,16 @@ class RevPiPyControl(tkinter.Frame):
def plclogs(self):
u"""Öffnet das Fenster für Logdateien."""
+ if "load_plclog" not in self.xmlfuncs:
+ tkmsg.showwarning(
+ _("Warning"),
+ _("This version of Logviewer ist not supported in version {} "
+ "of RevPiPyLoad on your RevPi! You need at least version "
+ "0.4.1.").format(self.cli.version()),
+ parent=self.master
+ )
+ return None
+
if self.tklogs is None or len(self.tklogs.children) == 0:
win = tkinter.Toplevel(self)
self.tklogs = revpilogfile.RevPiLogfile(win, self.cli)
@@ -244,10 +266,8 @@ class RevPiPyControl(tkinter.Frame):
if self.xmlmode < 2:
tkmsg.showwarning(
_("Warning"),
- _(
- "XML-RPC access mode in the RevPiPyLoad "
- "configuration is to small to access this dialog"
- ),
+ _("XML-RPC access mode in the RevPiPyLoad "
+ "configuration is to small to access this dialog"),
parent=self.master
)
else:
@@ -264,10 +284,8 @@ class RevPiPyControl(tkinter.Frame):
if self.xmlmode < 2:
tkmsg.showwarning(
_("Warning"),
- _(
- "XML-RPC access mode in the RevPiPyLoad "
- "configuration is to small to access this dialog"
- ),
+ _("XML-RPC access mode in the RevPiPyLoad "
+ "configuration is to small to access this dialog"),
parent=self.master
)
else:
@@ -343,6 +361,9 @@ class RevPiPyControl(tkinter.Frame):
self.master.after(1000, self.tmr_plcrunning)
+ def visitwebsite(self):
+ # TODO: Webseite besuchen
+ pass
if __name__ == "__main__":
root = tkinter.Tk()
diff --git a/setup.py b/setup.py
index 2d518aa..60d64c8 100644
--- a/setup.py
+++ b/setup.py
@@ -23,7 +23,7 @@ globsetup = {
"author_email": "akira@narux.de",
"url": "https://revpimodio.org/revpipyplc/",
"license": "LGPLv3",
- "version": "0.4.0",
+ "version": "0.4.1",
"name": "revpipycontrol",
From 1fec478e3f92441f845112b9927d9c928d3c4f95 Mon Sep 17 00:00:00 2001
From: NaruX
Date: Fri, 30 Jun 2017 13:50:39 +0200
Subject: [PATCH 07/13] Sicherheitswarnung vor dem Output schreiben integriert
Hauptfenster alles aufr?umen vor destroy() Wertepr?fung bei RevPiCheckClient
int() Werten Bearbeitungsfunktion bei RevPiCheckClient eingebaut Hilfemen?
mit Webbrowser aufruf eingebaut
---
.hgignore | 1 +
doc/revpicheckclient.html | 186 ++++++++++++++---
doc/revpilogfile.html | 97 ++++++---
doc/revpioption.html | 71 +++++--
doc/revpiplclist.html | 16 +-
doc/revpiprogram.html | 51 +++--
doc/revpipycontrol.html | 160 +++++++++------
revpipycontrol.api | 52 +++--
revpipycontrol.bas | 1 +
revpipycontrol.e4p | 3 +-
.../locale/de/LC_MESSAGES/revpipycontrol.po | 113 ++++++----
revpipycontrol/revpicheckclient.py | 194 ++++++++++++++----
revpipycontrol/revpiprogram.py | 8 +-
revpipycontrol/revpipycontrol.py | 30 ++-
14 files changed, 718 insertions(+), 265 deletions(-)
diff --git a/.hgignore b/.hgignore
index fe4cdbb..a10df60 100644
--- a/.hgignore
+++ b/.hgignore
@@ -6,3 +6,4 @@ revpipycontrol.egg-info/*
deb/*
.eric6project/*
*.directory
+*.mo
diff --git a/doc/revpicheckclient.html b/doc/revpicheckclient.html
index 79c32c2..3e8cd4b 100644
--- a/doc/revpicheckclient.html
+++ b/doc/revpicheckclient.html
@@ -10,7 +10,7 @@ revpicheckclient
Global Attributes
Classes
@@ -35,7 +35,7 @@ tkinter.Frame
Class Attributes
Class Methods
@@ -49,11 +49,20 @@ Methods
RevPiCheckClient |
Instantiiert MyApp-Klasse. |
+| __chval |
+Schreibt neuen Output Wert auf den RevPi. |
+
| __hidewin |
- |
+Verbergt übergebenes Fenster. |
+
+| __saveoldvalue |
+Speichert bei Keypress aktuellen Wert für wiederherstellung. |
| __showwin |
- |
+Zeigt oder verbergt übergebenes Fenster. |
+
+| __spinboxkey |
+Prüft die Eingabe auf plausibilität. |
| _createiogroup |
Erstellt IO-Gruppen. |
@@ -61,20 +70,35 @@ Methods
_createwidgets |
Erstellt den Fensterinhalt. |
-| _readvalues |
+_onfrmconf |
+Erstellt Fenster in einem Canvas. |
+
+| _warnwrite |
+Warnung für Benutzer über Schreibfunktion einmal fragen. |
+
+| _workvalues |
Alle Werte der Inputs und Outputs abrufen. |
-| chval |
- |
-
-| onfrmconf |
- |
+hideallwindows |
+Versteckt alle Fenster. |
| readvalues |
- |
+Ruft nur Input Werte von RevPi ab und aktualisiert Fenster. |
+
+| refreshvalues |
+Ruft alle IO Werte von RevPi ab und aktualisiert Fenster. |
| toggleauto |
- |
+Schaltet zwischen Autorefresh um und aktualisiert Widgets. |
+
+| togglewrite |
+Schaltet zwischen DoWrite um und aktiviert Schreibfunktion. |
+
+| validatereturn |
+Überprüft die Rückgaben der setvalue Funktion. |
+
+| writevalues |
+Schreibt geänderte Outputs auf den RevPi. |
@@ -88,49 +112,147 @@ RevPiCheckClient (Constructor)
RevPiCheckClient(master, xmlcli, xmlmode=0)
Instantiiert MyApp-Klasse.
+
+
+RevPiCheckClient.__chval
+__chval(device, io, event=None)
+
+Schreibt neuen Output Wert auf den RevPi.
RevPiCheckClient.__hidewin
__hidewin(win, event=None)
-
+
+Verbergt übergebenes Fenster.
+
+- win:
+-
+Fenster zum verbergen
+
- event:
+-
+Tkinter Event
+
+
+
+RevPiCheckClient.__saveoldvalue
+__saveoldvalue(event, tkvar)
+
+Speichert bei Keypress aktuellen Wert für wiederherstellung.
+
RevPiCheckClient.__showwin
__showwin(win)
-
-
-RevPiCheckClient._createiogroup
-_createiogroup(device, frame, iotype)
-Erstellt IO-Gruppen.
-
+Zeigt oder verbergt übergebenes Fenster.
+
+- win:
+-
+Fenster zum anzeigen/verbergen
+
+
+
+RevPiCheckClient.__spinboxkey
+__spinboxkey(device, io, event=None)
+
+Prüft die Eingabe auf plausibilität.
+
+- event:
+-
+tkinter Event
+
- io:
+-
+IO Liste mit tkinter Variable
+
+
RevPiCheckClient._createwidgets
_createwidgets()
Erstellt den Fensterinhalt.
-
+
-RevPiCheckClient._readvalues
-_readvalues()
+RevPiCheckClient._onfrmconf
+_onfrmconf(canvas)
+
+Erstellt Fenster in einem Canvas.
+
+- canvas:
+-
+Canvas in dem Objekte erstellt werden sollen
+
+
+
+RevPiCheckClient._warnwrite
+_warnwrite()
+
+Warnung für Benutzer über Schreibfunktion einmal fragen.
+
+- Returns:
+-
+True, wenn Warnung einmal mit OK bestätigt wurde
+
+
+
+RevPiCheckClient._workvalues
+_workvalues(io_dicts=None, writeout=False)
Alle Werte der Inputs und Outputs abrufen.
-
+
+- io_dicts:
+-
+Arbeit nur für dieses Dict()
+
- writeout:
+-
+Änderungen auf RevPi schreiben
+
+
-RevPiCheckClient.chval
-chval(device, io)
-
-
-RevPiCheckClient.onfrmconf
-onfrmconf(canvas)
-
+RevPiCheckClient.hideallwindows
+hideallwindows()
+
+Versteckt alle Fenster.
+
RevPiCheckClient.readvalues
readvalues()
-
+
+Ruft nur Input Werte von RevPi ab und aktualisiert Fenster.
+
+
+RevPiCheckClient.refreshvalues
+refreshvalues()
+
+Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.
+
RevPiCheckClient.toggleauto
toggleauto()
-
+
+Schaltet zwischen Autorefresh um und aktualisiert Widgets.
+
+
+RevPiCheckClient.togglewrite
+togglewrite()
+
+Schaltet zwischen DoWrite um und aktiviert Schreibfunktion.
+
+
+RevPiCheckClient.validatereturn
+validatereturn(returnlist)
+
+Überprüft die Rückgaben der setvalue Funktion.
+
+- returnlist:
+-
+list() der xml Rückgabe
+
+
+
+RevPiCheckClient.writevalues
+writevalues()
+
+Schreibt geänderte Outputs auf den RevPi.
+