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

Sortierung der Devices beibehalten

RevPiOption Einstellungen in globalem dc
RevPiOption Interaktion bei Meldungen verbessert
RevPiCheckClient auf kleine xml Einstellungen angepasst
RevPiInfo Text-Feld angepasst auf kleine xml Einstellung
bugfix: RevPiPyControl.serverdisconnect()
bugfix: RevPiCheckClient Doppelter Timerstart verhindert
This commit is contained in:
2017-07-01 16:08:11 +02:00
parent 0653c6c8eb
commit 145468d35b
7 changed files with 167 additions and 92 deletions

View File

@@ -88,6 +88,9 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiCheckClient.refreshvalues">refreshvalues</a></td> <td><a style="color:#0000FF" href="#RevPiCheckClient.refreshvalues">refreshvalues</a></td>
<td>Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.</td> <td>Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.tmr_workvalues">tmr_workvalues</a></td>
<td>Timer f&#252;r zyklische Abfrage.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiCheckClient.toggleauto">toggleauto</a></td> <td><a style="color:#0000FF" href="#RevPiCheckClient.toggleauto">toggleauto</a></td>
<td>Schaltet zwischen Autorefresh um und aktualisiert Widgets.</td> <td>Schaltet zwischen Autorefresh um und aktualisiert Widgets.</td>
</tr><tr> </tr><tr>
@@ -240,7 +243,18 @@ RevPiCheckClient.refreshvalues</h3>
<b>refreshvalues</b>(<i></i>) <b>refreshvalues</b>(<i></i>)
<p> <p>
Ruft alle IO Werte von RevPi ab und aktualisiert Fenster. Ruft alle IO Werte von RevPi ab und aktualisiert Fenster.
</p><a NAME="RevPiCheckClient.toggleauto" ID="RevPiCheckClient.toggleauto"></a> </p><a NAME="RevPiCheckClient.tmr_workvalues" ID="RevPiCheckClient.tmr_workvalues"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.tmr_workvalues</h3>
<b>tmr_workvalues</b>(<i></i>)
<p>
Timer f&#252;r zyklische Abfrage.
</p><dl>
<dt>Returns:</dt>
<dd>
None
</dd>
</dl><a NAME="RevPiCheckClient.toggleauto" ID="RevPiCheckClient.toggleauto"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiCheckClient.toggleauto</h3> RevPiCheckClient.toggleauto</h3>
<b>toggleauto</b>(<i></i>) <b>toggleauto</b>(<i></i>)

View File

@@ -67,7 +67,10 @@ Methods</h3>
<td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td> <td><a style="color:#0000FF" href="#RevPiOption.askxmlon">askxmlon</a></td>
<td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td> <td>Fragt Nuter, ob wirklicht abgeschaltet werden soll.</td>
</tr><tr> </tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.xmlmods">xmlmods</a></td> <td><a style="color:#0000FF" href="#RevPiOption.xmlmod2_tail">xmlmod2_tail</a></td>
<td>Passt XML-Optionszugriff an.</td>
</tr><tr>
<td><a style="color:#0000FF" href="#RevPiOption.xmlmod_tail">xmlmod_tail</a></td>
<td>Passt XML-Optionszugriff an.</td> <td>Passt XML-Optionszugriff an.</td>
</tr> </tr>
</table> </table>
@@ -79,7 +82,7 @@ Static Methods</h3>
<a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a> <a NAME="RevPiOption.__init__" ID="RevPiOption.__init__"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption (Constructor)</h3> RevPiOption (Constructor)</h3>
<b>RevPiOption</b>(<i>master, xmlcli, xmlmode</i>) <b>RevPiOption</b>(<i>master, xmlcli</i>)
<p> <p>
Init RevPiOption-Class. Init RevPiOption-Class.
</p><dl> </p><dl>
@@ -118,10 +121,15 @@ Erstellt Widgets.
</p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a> </p><a NAME="RevPiOption._loadappdata" ID="RevPiOption._loadappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._loadappdata</h3> RevPiOption._loadappdata</h3>
<b>_loadappdata</b>(<i></i>) <b>_loadappdata</b>(<i>refresh=False</i>)
<p> <p>
L&#228;d aktuelle Einstellungen vom RevPi. L&#228;d aktuelle Einstellungen vom RevPi.
</p><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a> </p><dl>
<dt><i>refresh</i></dt>
<dd>
Wenn True, werden Einstellungen heruntergeladen.
</dd>
</dl><a NAME="RevPiOption._setappdata" ID="RevPiOption._setappdata"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption._setappdata</h3> RevPiOption._setappdata</h3>
<b>_setappdata</b>(<i></i>) <b>_setappdata</b>(<i></i>)
@@ -133,10 +141,16 @@ RevPiOption.askxmlon</h3>
<b>askxmlon</b>(<i></i>) <b>askxmlon</b>(<i></i>)
<p> <p>
Fragt Nuter, ob wirklicht abgeschaltet werden soll. Fragt Nuter, ob wirklicht abgeschaltet werden soll.
</p><a NAME="RevPiOption.xmlmods" ID="RevPiOption.xmlmods"></a> </p><a NAME="RevPiOption.xmlmod2_tail" ID="RevPiOption.xmlmod2_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000"> <h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmods</h3> RevPiOption.xmlmod2_tail</h3>
<b>xmlmods</b>(<i></i>) <b>xmlmod2_tail</b>(<i></i>)
<p>
Passt XML-Optionszugriff an.
</p><a NAME="RevPiOption.xmlmod_tail" ID="RevPiOption.xmlmod_tail"></a>
<h3 style="background-color:#FFFFFF;color:#FF0000">
RevPiOption.xmlmod_tail</h3>
<b>xmlmod_tail</b>(<i></i>)
<p> <p>
Passt XML-Optionszugriff an. Passt XML-Optionszugriff an.
</p> </p>

View File

@@ -13,6 +13,7 @@ revpicheckclient.RevPiCheckClient._workvalues?5(io_dicts=None, writeout=False)
revpicheckclient.RevPiCheckClient.hideallwindows?4() revpicheckclient.RevPiCheckClient.hideallwindows?4()
revpicheckclient.RevPiCheckClient.readvalues?4() revpicheckclient.RevPiCheckClient.readvalues?4()
revpicheckclient.RevPiCheckClient.refreshvalues?4() revpicheckclient.RevPiCheckClient.refreshvalues?4()
revpicheckclient.RevPiCheckClient.tmr_workvalues?4()
revpicheckclient.RevPiCheckClient.toggleauto?4() revpicheckclient.RevPiCheckClient.toggleauto?4()
revpicheckclient.RevPiCheckClient.togglewrite?4() revpicheckclient.RevPiCheckClient.togglewrite?4()
revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist) revpicheckclient.RevPiCheckClient.validatereturn?4(returnlist)
@@ -39,11 +40,12 @@ revpilogfile._?8
revpioption.RevPiOption._changesdone?5() revpioption.RevPiOption._changesdone?5()
revpioption.RevPiOption._checkclose?5(event=None) revpioption.RevPiOption._checkclose?5(event=None)
revpioption.RevPiOption._createwidgets?5() revpioption.RevPiOption._createwidgets?5()
revpioption.RevPiOption._loadappdata?5() revpioption.RevPiOption._loadappdata?5(refresh=False)
revpioption.RevPiOption._setappdata?5() revpioption.RevPiOption._setappdata?5()
revpioption.RevPiOption.askxmlon?4() revpioption.RevPiOption.askxmlon?4()
revpioption.RevPiOption.xmlmods?4() revpioption.RevPiOption.xmlmod2_tail?4()
revpioption.RevPiOption?1(master, xmlcli, xmlmode) revpioption.RevPiOption.xmlmod_tail?4()
revpioption.RevPiOption?1(master, xmlcli)
revpioption._?8 revpioption._?8
revpiplclist.RevPiPlcList._checkclose?5(event=None) revpiplclist.RevPiPlcList._checkclose?5(event=None)
revpiplclist.RevPiPlcList._createwidgets?5() revpiplclist.RevPiPlcList._createwidgets?5()

View File

@@ -28,7 +28,9 @@ class RevPiCheckClient(tkinter.Frame):
self.xmlmode = xmlmode self.xmlmode = xmlmode
self.cli = xmlcli self.cli = xmlcli
self.cli.psstart() self.cli.psstart()
self.dict_devices = {v[0]: v[1] for v in self.cli.ps_devices()} self.lst_devices = self.cli.ps_devices()
self.dict_devices = {v[0]: v[1] for v in self.lst_devices}
self.lst_devices = [d[0] for d in self.lst_devices]
self.dict_inps = pickle.loads(self.cli.ps_inps().data) self.dict_inps = pickle.loads(self.cli.ps_inps().data)
self.dict_outs = pickle.loads(self.cli.ps_outs().data) self.dict_outs = pickle.loads(self.cli.ps_outs().data)
@@ -202,7 +204,7 @@ class RevPiCheckClient(tkinter.Frame):
devgrp["text"] = _("Devices of RevPi") devgrp["text"] = _("Devices of RevPi")
devgrp.pack(fill="y", side="left") devgrp.pack(fill="y", side="left")
for dev in self.dict_devices: for dev in self.lst_devices:
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
win.wm_title(self.dict_devices[dev]) win.wm_title(self.dict_devices[dev])
win.protocol( win.protocol(
@@ -245,15 +247,17 @@ class RevPiCheckClient(tkinter.Frame):
self.btn_read.pack(fill="x") self.btn_read.pack(fill="x")
self.btn_write = tkinter.Button(cntgrp) self.btn_write = tkinter.Button(cntgrp)
self.btn_write["state"] = "normal" if self.xmlmode >= 3 \
else "disabled"
self.btn_write["text"] = _("Write Outputs") self.btn_write["text"] = _("Write Outputs")
self.btn_write["command"] = self.writevalues self.btn_write["command"] = self.writevalues
self.btn_write.pack(fill="x") self.btn_write.pack(fill="x")
check = tkinter.Checkbutton(cntgrp) self.chk_auto = tkinter.Checkbutton(cntgrp)
check["command"] = self.toggleauto self.chk_auto["command"] = self.toggleauto
check["text"] = _("Autorefresh values") self.chk_auto["text"] = _("Autorefresh values")
check["variable"] = self.autorw self.chk_auto["variable"] = self.autorw
check.pack(anchor="w") self.chk_auto.pack(anchor="w")
self.chk_dowrite = tkinter.Checkbutton(cntgrp) self.chk_dowrite = tkinter.Checkbutton(cntgrp)
self.chk_dowrite["command"] = self.togglewrite self.chk_dowrite["command"] = self.togglewrite
@@ -335,9 +339,6 @@ class RevPiCheckClient(tkinter.Frame):
with self.lk: with self.lk:
self.validatereturn(xmlmc()) self.validatereturn(xmlmc())
if self.autorw.get():
self.master.after(200, self._workvalues)
def hideallwindows(self): def hideallwindows(self):
u"""Versteckt alle Fenster.""" u"""Versteckt alle Fenster."""
for win in self.dict_wins: for win in self.dict_wins:
@@ -353,19 +354,35 @@ class RevPiCheckClient(tkinter.Frame):
if not self.autorw.get(): if not self.autorw.get():
self._workvalues() self._workvalues()
def tmr_workvalues(self):
u"""Timer für zyklische Abfrage.
@return None"""
# Verbleibener Timer könnte schon ungültig sein
if not self.autorw.get():
try:
self.chk_auto["state"] = "normal"
except:
pass
return None
self._workvalues()
self.master.after(200, self.tmr_workvalues)
def toggleauto(self): def toggleauto(self):
u"""Schaltet zwischen Autorefresh um und aktualisiert Widgets.""" u"""Schaltet zwischen Autorefresh um und aktualisiert Widgets."""
stateval = "disabled" if self.autorw.get() else "normal" stateval = "disabled" if self.autorw.get() else "normal"
self.btn_refresh["state"] = stateval self.btn_refresh["state"] = stateval
self.btn_read["state"] = stateval self.btn_read["state"] = stateval
self.btn_write["state"] = stateval self.btn_write["state"] = stateval if self.xmlmode >= 3 \
else "disabled"
self.chk_dowrite["state"] = "normal" if self.xmlmode >= 3 \ self.chk_dowrite["state"] = "normal" if self.xmlmode >= 3 \
and self.autorw.get() else "disabled" and self.autorw.get() else "disabled"
if self.autorw.get(): if self.autorw.get():
self._workvalues() self.tmr_workvalues()
else: else:
self.chk_auto["state"] = "disabled"
self.dowrite.set(False) self.dowrite.set(False)
def togglewrite(self): def togglewrite(self):

View File

@@ -112,23 +112,25 @@ class RevPiInfo(tkinter.Frame):
# Rechte Seite Mittelframe --------------- # Rechte Seite Mittelframe ---------------
# Funktionen der Gegenstelle # Funktionen der Gegenstelle
frame_func = tkinter.Frame(frame_main) if self.xmlcli is not None:
txt_xmlfunc = tkinter.Text(frame_func, width=30, height=15) frame_func = tkinter.Frame(frame_main)
scr_xmlfunc = tkinter.Scrollbar(frame_func) txt_xmlfunc = tkinter.Text(frame_func, width=30, height=15)
if extended: scr_xmlfunc = tkinter.Scrollbar(frame_func)
txt_xmlfunc.insert(tkinter.END, "\n".join( if extended:
[] if self.xmlcli is None else self.xmlcli.system.listMethods() txt_xmlfunc.insert(tkinter.END, "\n".join(
)) self.xmlcli.system.listMethods()
else: ))
txt_xmlfunc.insert(tkinter.END, "\n".join( elif "get_filelist" in self.xmlcli.system.listMethods():
[] if self.xmlcli is None else self.xmlcli.get_filelist() txt_xmlfunc.insert(tkinter.END, "\n".join(
)) self.xmlcli.get_filelist()
txt_xmlfunc["yscrollcommand"] = scr_xmlfunc.set ))
txt_xmlfunc["state"] = "disabled" txt_xmlfunc["yscrollcommand"] = scr_xmlfunc.set
scr_xmlfunc["command"] = txt_xmlfunc.yview txt_xmlfunc["state"] = "disabled"
txt_xmlfunc.pack(side="left") scr_xmlfunc["command"] = txt_xmlfunc.yview
scr_xmlfunc.pack(fill="y", side="right") txt_xmlfunc.pack(side="left")
frame_func.grid(column=3, row=0, rowspan=int_row + 1, **cpadnw) scr_xmlfunc.pack(fill="y", side="right")
if txt_xmlfunc.get(1.0) != "\n":
frame_func.grid(column=3, row=0, rowspan=int_row + 1, **cpadnw)
# Unten Beenden-Button ----------------------------------------------- # Unten Beenden-Button -----------------------------------------------
self.btnapplog = tkinter.Button(self) self.btnapplog = tkinter.Button(self)

View File

@@ -15,10 +15,13 @@ _ = gettrans()
class RevPiOption(tkinter.Frame): class RevPiOption(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode): def __init__(self, master, xmlcli):
u"""Init RevPiOption-Class. u"""Init RevPiOption-Class.
@return None""" @return None"""
if xmlmode < 2: try:
self.dc = xmlcli.get_config()
except:
self.dc = None
return None return None
super().__init__(master) super().__init__(master)
@@ -27,8 +30,9 @@ class RevPiOption(tkinter.Frame):
self.pack(expand=True, fill="both") self.pack(expand=True, fill="both")
self.xmlcli = xmlcli self.xmlcli = xmlcli
self.xmlmode = xmlmode self.mrk_var_xmlmod2 = False
self.xmlstate = "normal" if xmlmode == 3 else "disabled" self.mrk_var_xmlmod3 = False
self.mrk_xmlmodask = False
# Fenster bauen # Fenster bauen
self._createwidgets() self._createwidgets()
@@ -61,7 +65,7 @@ class RevPiOption(tkinter.Frame):
_("Question"), _("Question"),
_("Do you really want to quit? \nUnsaved changes will " _("Do you really want to quit? \nUnsaved changes will "
"be lost"), "be lost"),
parent=self.master parent=self.master, default="no"
) )
if ask: if ask:
@@ -72,6 +76,8 @@ class RevPiOption(tkinter.Frame):
self.master.wm_title(_("RevPi Python PLC Options")) self.master.wm_title(_("RevPi Python PLC Options"))
self.master.wm_resizable(width=False, height=False) self.master.wm_resizable(width=False, height=False)
xmlstate = "normal" if self.dc["xmlrpc"] >= 3 else "disabled"
cpadw = {"padx": 4, "pady": 2, "sticky": "w"} cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"} cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
@@ -87,18 +93,18 @@ class RevPiOption(tkinter.Frame):
ckb_start = tkinter.Checkbutton(stst) ckb_start = tkinter.Checkbutton(stst)
ckb_start["text"] = _("Start program automatically") ckb_start["text"] = _("Start program automatically")
ckb_start["state"] = self.xmlstate ckb_start["state"] = xmlstate
ckb_start["variable"] = self.var_start ckb_start["variable"] = self.var_start
ckb_start.grid(**cpadw) ckb_start.grid(**cpadw)
ckb_reload = tkinter.Checkbutton(stst) ckb_reload = tkinter.Checkbutton(stst)
ckb_reload["text"] = _("Restart program after exit") ckb_reload["text"] = _("Restart program after exit")
ckb_reload["state"] = self.xmlstate ckb_reload["state"] = xmlstate
ckb_reload["variable"] = self.var_reload ckb_reload["variable"] = self.var_reload
ckb_reload.grid(**cpadw) ckb_reload.grid(**cpadw)
ckb_zexit = tkinter.Checkbutton(stst, justify="left") ckb_zexit = tkinter.Checkbutton(stst, justify="left")
ckb_zexit["state"] = self.xmlstate ckb_zexit["state"] = xmlstate
ckb_zexit["text"] = _( ckb_zexit["text"] = _(
"Set process image to NULL if program\n" "Set process image to NULL if program\n"
"terminates successfully") "terminates successfully")
@@ -106,7 +112,7 @@ class RevPiOption(tkinter.Frame):
ckb_zexit.grid(**cpadw) ckb_zexit.grid(**cpadw)
ckb_zerr = tkinter.Checkbutton(stst, justify="left") ckb_zerr = tkinter.Checkbutton(stst, justify="left")
ckb_zerr["state"] = self.xmlstate ckb_zerr["state"] = xmlstate
ckb_zerr["text"] = _( ckb_zerr["text"] = _(
"Set process image to NULL if program\n" "Set process image to NULL if program\n"
"terminates with errors") "terminates with errors")
@@ -129,14 +135,14 @@ class RevPiOption(tkinter.Frame):
lbl["text"] = _("Python version") lbl["text"] = _("Python version")
lbl.grid(columnspan=2, row=0, **cpadw) lbl.grid(columnspan=2, row=0, **cpadw)
rbn = tkinter.Radiobutton(prog) rbn = tkinter.Radiobutton(prog)
rbn["state"] = self.xmlstate rbn["state"] = xmlstate
rbn["text"] = "Python2" rbn["text"] = "Python2"
rbn["value"] = 2 rbn["value"] = 2
rbn["variable"] = self.var_pythonver rbn["variable"] = self.var_pythonver
rbn.grid(column=0, row=1, **cpadw) rbn.grid(column=0, row=1, **cpadw)
rbn = tkinter.Radiobutton(prog) rbn = tkinter.Radiobutton(prog)
rbn["state"] = self.xmlstate rbn["state"] = xmlstate
rbn["text"] = "Python3" rbn["text"] = "Python3"
rbn["value"] = 3 rbn["value"] = 3
rbn["variable"] = self.var_pythonver rbn["variable"] = self.var_pythonver
@@ -151,7 +157,7 @@ class RevPiOption(tkinter.Frame):
lst.append("none") lst.append("none")
opt_startpy = tkinter.OptionMenu( opt_startpy = tkinter.OptionMenu(
prog, self.var_startpy, *lst) prog, self.var_startpy, *lst)
opt_startpy["state"] = self.xmlstate opt_startpy["state"] = xmlstate
opt_startpy.grid(columnspan=2, **cpadwe) opt_startpy.grid(columnspan=2, **cpadwe)
lbl = tkinter.Label(prog) lbl = tkinter.Label(prog)
@@ -163,7 +169,7 @@ class RevPiOption(tkinter.Frame):
txt.grid(columnspan=2, **cpadw) txt.grid(columnspan=2, **cpadw)
ckb_slave = tkinter.Checkbutton(prog, justify="left") ckb_slave = tkinter.Checkbutton(prog, justify="left")
ckb_slave["state"] = self.xmlstate ckb_slave["state"] = xmlstate
ckb_slave["text"] = _("Use RevPi as PLC-Slave") ckb_slave["text"] = _("Use RevPi as PLC-Slave")
ckb_slave["state"] = "disabled" ckb_slave["state"] = "disabled"
ckb_slave["variable"] = self.var_slave ckb_slave["variable"] = self.var_slave
@@ -182,21 +188,21 @@ class RevPiOption(tkinter.Frame):
ckb_xmlon = tkinter.Checkbutton(xmlrpc) ckb_xmlon = tkinter.Checkbutton(xmlrpc)
ckb_xmlon["command"] = self.askxmlon ckb_xmlon["command"] = self.askxmlon
ckb_xmlon["state"] = self.xmlstate ckb_xmlon["state"] = xmlstate
ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi") ckb_xmlon["text"] = _("Activate XML-RPC server on RevPi")
ckb_xmlon["variable"] = self.var_xmlon ckb_xmlon["variable"] = self.var_xmlon
ckb_xmlon.grid(**cpadw) ckb_xmlon.grid(**cpadw)
self.ckb_xmlmod2 = tkinter.Checkbutton(xmlrpc, justify="left") self.ckb_xmlmod2 = tkinter.Checkbutton(xmlrpc, justify="left")
self.ckb_xmlmod2["command"] = self.xmlmods self.ckb_xmlmod2["command"] = self.xmlmod2_tail
self.ckb_xmlmod2["state"] = self.xmlstate self.ckb_xmlmod2["state"] = xmlstate
self.ckb_xmlmod2["text"] = \ self.ckb_xmlmod2["text"] = \
_("Allow download of piCtory configuration and\nPLC programm") _("Allow download of piCtory configuration and\nPLC programm")
self.ckb_xmlmod2["variable"] = self.var_xmlmod2 self.ckb_xmlmod2["variable"] = self.var_xmlmod2
self.ckb_xmlmod2.grid(**cpadw) self.ckb_xmlmod2.grid(**cpadw)
self.ckb_xmlmod3 = tkinter.Checkbutton(xmlrpc, justify="left") self.ckb_xmlmod3 = tkinter.Checkbutton(xmlrpc, justify="left")
self.ckb_xmlmod3["state"] = self.xmlstate self.ckb_xmlmod3["state"] = xmlstate
self.ckb_xmlmod3["text"] = \ self.ckb_xmlmod3["text"] = \
_("Allow upload of piCtory configuration and\nPLC programm") _("Allow upload of piCtory configuration and\nPLC programm")
self.ckb_xmlmod3["variable"] = self.var_xmlmod3 self.ckb_xmlmod3["variable"] = self.var_xmlmod3
@@ -209,14 +215,14 @@ class RevPiOption(tkinter.Frame):
spb_xmlport = tkinter.Spinbox(xmlrpc) spb_xmlport = tkinter.Spinbox(xmlrpc)
spb_xmlport["to"] = 65535 spb_xmlport["to"] = 65535
spb_xmlport["from"] = 1024 spb_xmlport["from"] = 1024
spb_xmlport["state"] = self.xmlstate spb_xmlport["state"] = xmlstate
spb_xmlport["textvariable"] = self.var_xmlport spb_xmlport["textvariable"] = self.var_xmlport
spb_xmlport.grid(**cpadwe) spb_xmlport.grid(**cpadwe)
# Buttons # Buttons
btn_save = tkinter.Button(self) btn_save = tkinter.Button(self)
btn_save["command"] = self._setappdata btn_save["command"] = self._setappdata
btn_save["state"] = self.xmlstate btn_save["state"] = xmlstate
btn_save["text"] = _("Save") btn_save["text"] = _("Save")
btn_save.grid(column=0, row=3) btn_save.grid(column=0, row=3)
@@ -225,9 +231,11 @@ class RevPiOption(tkinter.Frame):
btn_close["text"] = _("Close") btn_close["text"] = _("Close")
btn_close.grid(column=1, row=3) btn_close.grid(column=1, row=3)
def _loadappdata(self): def _loadappdata(self, refresh=False):
u"""Läd aktuelle Einstellungen vom RevPi.""" u"""Läd aktuelle Einstellungen vom RevPi.
self.dc = self.xmlcli.get_config() @param refresh Wenn True, werden Einstellungen heruntergeladen."""
if refresh:
self.dc = self.xmlcli.get_config()
self.var_start.set(self.dc.get("autostart", "1")) self.var_start.set(self.dc.get("autostart", "1"))
self.var_reload.set(self.dc.get("autoreload", "1")) self.var_reload.set(self.dc.get("autoreload", "1"))
@@ -241,33 +249,33 @@ class RevPiOption(tkinter.Frame):
self.var_xmlon.set(self.dc.get("xmlrpc", 0) >= 1) self.var_xmlon.set(self.dc.get("xmlrpc", 0) >= 1)
self.var_xmlmod2.set(self.dc.get("xmlrpc", 0) >= 2) self.var_xmlmod2.set(self.dc.get("xmlrpc", 0) >= 2)
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
self.var_xmlmod3.set(self.dc.get("xmlrpc", 0) >= 3) self.var_xmlmod3.set(self.dc.get("xmlrpc", 0) >= 3)
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
self.var_xmlport.set(self.dc.get("xmlrpcport", "55123")) self.var_xmlport.set(self.dc.get("xmlrpcport", "55123"))
def _setappdata(self): def _setappdata(self):
u"""Speichert geänderte Einstellungen auf RevPi.""" u"""Speichert geänderte Einstellungen auf RevPi."""
dc = {} self.dc["autostart"] = int(self.var_start.get())
dc["autostart"] = int(self.var_start.get()) self.dc["autoreload"] = int(self.var_reload.get())
dc["autoreload"] = int(self.var_reload.get()) self.dc["zeroonexit"] = int(self.var_zexit.get())
dc["zeroonexit"] = int(self.var_zexit.get()) self.dc["zeroonerror"] = int(self.var_zerr.get())
dc["zeroonerror"] = int(self.var_zerr.get())
dc["plcprogram"] = self.var_startpy.get() self.dc["plcprogram"] = self.var_startpy.get()
dc["plcarguments"] = self.var_startargs.get() self.dc["plcarguments"] = self.var_startargs.get()
dc["pythonversion"] = self.var_pythonver.get() self.dc["pythonversion"] = self.var_pythonver.get()
dc["plcslave"] = int(self.var_slave.get()) self.dc["plcslave"] = int(self.var_slave.get())
dc["xmlrpc"] = 0 self.dc["xmlrpc"] = 0
if self.var_xmlon.get(): if self.var_xmlon.get():
dc["xmlrpc"] += 1 self.dc["xmlrpc"] += 1
if self.var_xmlmod2.get(): if self.var_xmlmod2.get():
dc["xmlrpc"] += 1 self.dc["xmlrpc"] += 1
if self.var_xmlmod3.get(): if self.var_xmlmod3.get():
dc["xmlrpc"] += 1 self.dc["xmlrpc"] += 1
dc["xmlrpcport"] = self.var_xmlport.get() self.dc["xmlrpcport"] = self.var_xmlport.get()
self.xmlmode = dc["xmlrpc"]
ask = tkmsg.askyesnocancel( ask = tkmsg.askyesnocancel(
_("Question"), _("Question"),
@@ -277,12 +285,13 @@ class RevPiOption(tkinter.Frame):
parent=self.master parent=self.master
) )
if ask is not None: if ask is not None:
if self.xmlcli.set_config(dc, ask): if self.xmlcli.set_config(self.dc, ask):
tkmsg.showinfo( tkmsg.showinfo(
_("Information"), _("Information"),
_("Settings saved"), _("Settings saved"),
parent=self.master parent=self.master
) )
self._checkclose()
else: else:
tkmsg.showerror( tkmsg.showerror(
_("Error"), _("Error"),
@@ -293,22 +302,36 @@ class RevPiOption(tkinter.Frame):
def askxmlon(self): def askxmlon(self):
u"""Fragt Nuter, ob wirklicht abgeschaltet werden soll.""" u"""Fragt Nuter, ob wirklicht abgeschaltet werden soll."""
if not self.var_xmlon.get(): if not (self.var_xmlon.get() or self.mrk_xmlmodask):
ask = tkmsg.askyesno( self.mrk_xmlmodask = tkmsg.askyesno(
_("Question"), _("Question"),
_("Are you sure you want to deactivate the XML-RPC server? " _("Are you sure you want to deactivate the XML-RPC server? "
"You will NOT be able to access the Revolution Pi with " "You will NOT be able to access the Revolution Pi with "
"this program."), "this program."),
parent=self.master parent=self.master
) )
if not ask: if not self.mrk_xmlmodask:
self.var_xmlon.set(True) self.var_xmlon.set(True)
self.xmlmods() self.xmlmod_tail()
def xmlmods(self): def xmlmod_tail(self):
u"""Passt XML-Optionszugriff an.""" u"""Passt XML-Optionszugriff an."""
self.ckb_xmlmod2["state"] = \ if self.var_xmlon.get():
"normal" if self.var_xmlon.get() else "disabled" self.var_xmlmod2.set(self.mrk_var_xmlmod2)
self.ckb_xmlmod3["state"] = \ self.ckb_xmlmod2["state"] = "normal"
"normal" if self.var_xmlmod2.get() else "disabled" else:
self.mrk_var_xmlmod2 = self.var_xmlmod2.get()
self.var_xmlmod2.set(False)
self.ckb_xmlmod2["state"] = "disabled"
self.xmlmod2_tail()
def xmlmod2_tail(self):
u"""Passt XML-Optionszugriff an."""
if self.var_xmlmod2.get():
self.var_xmlmod3.set(self.mrk_var_xmlmod3)
self.ckb_xmlmod3["state"] = "normal"
else:
self.mrk_var_xmlmod3 = self.var_xmlmod3.get()
self.var_xmlmod3.set(False)
self.ckb_xmlmod3["state"] = "disabled"

View File

@@ -78,6 +78,7 @@ class RevPiPyControl(tkinter.Frame):
if self.tkprogram is not None: if self.tkprogram is not None:
self.tkprogram.destroy() self.tkprogram.destroy()
if self.debugframe is not None: if self.debugframe is not None:
self.plcdebug()
self.debugframe.destroy() self.debugframe.destroy()
self.cli.psstop() self.cli.psstop()
self.debugframe = None self.debugframe = None
@@ -243,8 +244,9 @@ class RevPiPyControl(tkinter.Frame):
# Show/Hide wechseln # Show/Hide wechseln
if self.debugframe.winfo_viewable(): if self.debugframe.winfo_viewable():
self.debugframe.hideallwindows() self.debugframe.hideallwindows()
self.debugframe.autorw.set(False) if self.debugframe.autorw.get():
self.debugframe.toggleauto() self.debugframe.autorw.set(False)
self.debugframe.toggleauto()
self.debugframe.dowrite.set(False) self.debugframe.dowrite.set(False)
self.debugframe.pack_forget() self.debugframe.pack_forget()
else: else:
@@ -293,11 +295,12 @@ class RevPiPyControl(tkinter.Frame):
else: else:
win = tkinter.Toplevel(self) win = tkinter.Toplevel(self)
self.tkoptions = \ self.tkoptions = \
revpioption.RevPiOption(win, self.cli, self.xmlmode) revpioption.RevPiOption(win, self.cli)
win.focus_set() win.focus_set()
win.grab_set() win.grab_set()
self.wait_window(win) self.wait_window(win)
self.xmlmode = self.tkoptions.xmlmode if self.tkoptions.dc is not None:
self.xmlmode = self.tkoptions.dc["xmlrpc"]
def plcprogram(self): def plcprogram(self):
u"""Startet das Programmfenster.""" u"""Startet das Programmfenster."""
@@ -331,12 +334,12 @@ class RevPiPyControl(tkinter.Frame):
def serverdisconnect(self): def serverdisconnect(self):
u"""Trennt eine bestehende Verbindung.""" u"""Trennt eine bestehende Verbindung."""
self._closeall()
socket.setdefaulttimeout(2) socket.setdefaulttimeout(2)
self.cli = None self.cli = None
self._btnstate() self._btnstate()
self.mbar.entryconfig("PLC", state="disabled") self.mbar.entryconfig("PLC", state="disabled")
self.var_conn.set("") self.var_conn.set("")
self._closeall()
def servererror(self): def servererror(self):
u"""Setzt alles zurück für neue Verbindungen.""" u"""Setzt alles zurück für neue Verbindungen."""