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:
@@ -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ü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ü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>)
|
||||||
|
|||||||
@@ -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äd aktuelle Einstellungen vom RevPi.
|
Lä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>
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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."""
|
||||||
|
|||||||
Reference in New Issue
Block a user