From fa8fc6a7ceb97980dbf82466edbf695812462fc6 Mon Sep 17 00:00:00 2001 From: NaruX Date: Mon, 24 Sep 2018 10:18:57 +0200 Subject: [PATCH] Optionfenster schlie?t bei destroy alle Unterfenster mit MQTT Settings ingetriert --- doc/aclmanager.html | 4 +- doc/index.html | 3 + doc/mqttmanager.html | 134 +++++++++++++ doc/revpioption.html | 32 +++ eric-revpipycontrol.api | 16 ++ eric-revpipycontrol.bas | 1 + revpipycontrol.e4p | 3 +- revpipycontrol/aclmanager.py | 2 +- revpipycontrol/mqttmanager.py | 321 +++++++++++++++++++++++++++++++ revpipycontrol/revpioption.py | 96 ++++++++- revpipycontrol/revpipycontrol.py | 1 + 11 files changed, 600 insertions(+), 13 deletions(-) create mode 100644 doc/mqttmanager.html create mode 100644 revpipycontrol/mqttmanager.py diff --git a/doc/aclmanager.html b/doc/aclmanager.html index 8e2f07d..bd11a74 100644 --- a/doc/aclmanager.html +++ b/doc/aclmanager.html @@ -49,7 +49,7 @@ Methods - + @@ -107,7 +107,7 @@ Static Methods AclManager (Constructor)AclManager(master, minlevel, maxlevel, acl_str="", readonly=False)

-Init RevPiOption-Class. +Init AclManger-Class.

Returns:
diff --git a/doc/index.html b/doc/index.html index 82b0367..dc4be46 100644 --- a/doc/index.html +++ b/doc/index.html @@ -24,6 +24,9 @@ Modules
+ + + diff --git a/doc/mqttmanager.html b/doc/mqttmanager.html new file mode 100644 index 0000000..0af3dfa --- /dev/null +++ b/doc/mqttmanager.html @@ -0,0 +1,134 @@ + + +mqttmanager + + + +

+mqttmanager

+ +

+Global Attributes

+
AclManagerInit RevPiOption-Class.Init AclManger-Class.
__get_acltext Getter fuer Leveltexte. aclmanager
mqttmanager
mytools Tools-Sammlung.
+ +
_
__author__
__copyright__
__license__
+

+Classes

+ + + + + +
MqttManagerHauptfenster der MQTT-Einstellungen.
+

+Functions

+ + +
None
+

+ +

MqttManager

+

+Hauptfenster der MQTT-Einstellungen. +

+

+Derived from

+tkinter.Frame +

+Class Attributes

+ + +
dict_mqttsettings
root
settings
+

+Class Methods

+ + +
None
+

+Methods

+ + + + + + + + + + + + + + + + + + + + +
MqttManagerInit MqttManager-Class.
_changesdonePrüft ob sich die Einstellungen geändert haben.
_checkclosePrüft ob Fenster beendet werden soll.
_createwidgetsErstellt Widgets.
_saveÜbernimt die Änderungen.
get_settingsGibt die MQTT Konfiguration zurück.
+

+Static Methods

+ + +
None
+ +

+MqttManager (Constructor)

+MqttManager(master, settings, readonly=False) +

+Init MqttManager-Class. +

+
Returns:
+
+None +
+
+

+MqttManager._changesdone

+_changesdone() +

+Prüft ob sich die Einstellungen geändert haben. +

+
Returns:
+
+True, wenn min. eine Einstellung geändert wurde +
+
+

+MqttManager._checkclose

+_checkclose(event=None) +

+Prüft ob Fenster beendet werden soll. +

+
event
+
+tkinter-Event +
+
+

+MqttManager._createwidgets

+_createwidgets() +

+Erstellt Widgets. +

+

+MqttManager._save

+_save() +

+Übernimt die Änderungen. +

+

+MqttManager.get_settings

+get_settings() +

+Gibt die MQTT Konfiguration zurück. +

+
Returns:
+
+Settings als +
+
+
Up
+
+ \ No newline at end of file diff --git a/doc/revpioption.html b/doc/revpioption.html index e87b5ae..0fc6641 100644 --- a/doc/revpioption.html +++ b/doc/revpioption.html @@ -54,6 +54,9 @@ Methods _changesdone Prüft ob sich die Einstellungen geändert haben. +_changesdone_mqtt +Prüft ob MQTT-Settings geändert wurden. + _checkclose Prüft ob Fenster beendet werden soll. @@ -72,11 +75,17 @@ Methods askxmlon Fragt Nuter, ob wirklicht abgeschaltet werden soll. +btn_mqttsettings +Öffnet Fenster für MQTT Einstellungen. + btn_slaveacl Öffnet Fenster für ACL-Verwaltung. btn_xmlacl Öffnet Fenster für ACL-Verwaltung. + +destroy +Beendet alle Unterfenster und sich selbst.

@@ -106,6 +115,17 @@ Prüft ob sich die Einstellungen geändert haben.
True, wenn min. eine Einstellung geändert wurde
+ +

+RevPiOption._changesdone_mqtt

+_changesdone_mqtt() +

+Prüft ob MQTT-Settings geändert wurden. +

+
Returns:
+
+True, wenn Änderungen existieren +

RevPiOption._checkclose

@@ -162,6 +182,12 @@ RevPiOption.askxmlon askxmlon()

Fragt Nuter, ob wirklicht abgeschaltet werden soll. +

+

+RevPiOption.btn_mqttsettings

+btn_mqttsettings() +

+Öffnet Fenster für MQTT Einstellungen.

RevPiOption.btn_slaveacl

@@ -174,6 +200,12 @@ RevPiOption.btn_xmlacl btn_xmlacl()

Öffnet Fenster für ACL-Verwaltung. +

+

+RevPiOption.destroy

+destroy() +

+Beendet alle Unterfenster und sich selbst.

Up

diff --git a/eric-revpipycontrol.api b/eric-revpipycontrol.api index d8723c2..869b6bb 100644 --- a/eric-revpipycontrol.api +++ b/eric-revpipycontrol.api @@ -21,6 +21,19 @@ aclmanager._?8 aclmanager.__author__?9 aclmanager.__copyright__?9 aclmanager.__license__?9 +mqttmanager.MqttManager._changesdone?5() +mqttmanager.MqttManager._checkclose?5(event=None) +mqttmanager.MqttManager._createwidgets?5() +mqttmanager.MqttManager._save?5() +mqttmanager.MqttManager.dict_mqttsettings?7 +mqttmanager.MqttManager.get_settings?4() +mqttmanager.MqttManager.root?7 +mqttmanager.MqttManager.settings?7 +mqttmanager.MqttManager?1(master, settings, readonly=False) +mqttmanager._?8 +mqttmanager.__author__?9 +mqttmanager.__copyright__?9 +mqttmanager.__license__?9 mytools.__author__?9 mytools.__copyright__?9 mytools.__license__?9 @@ -104,14 +117,17 @@ revpilogfile.__author__?9 revpilogfile.__copyright__?9 revpilogfile.__license__?9 revpioption.RevPiOption._changesdone?5() +revpioption.RevPiOption._changesdone_mqtt?5() revpioption.RevPiOption._checkclose?5(event=None) revpioption.RevPiOption._checkvalues?5() revpioption.RevPiOption._createwidgets?5() revpioption.RevPiOption._loadappdata?5(refresh=False) revpioption.RevPiOption._setappdata?5() revpioption.RevPiOption.askxmlon?4() +revpioption.RevPiOption.btn_mqttsettings?4() revpioption.RevPiOption.btn_slaveacl?4() revpioption.RevPiOption.btn_xmlacl?4() +revpioption.RevPiOption.destroy?4() revpioption.RevPiOption?1(master, xmlcli) revpioption._?8 revpioption.__author__?9 diff --git a/eric-revpipycontrol.bas b/eric-revpipycontrol.bas index b0573bb..06ea4cf 100644 --- a/eric-revpipycontrol.bas +++ b/eric-revpipycontrol.bas @@ -1,4 +1,5 @@ AclManager ttk.Frame +MqttManager tkinter.Frame RevPiCheckClient tkinter.Frame RevPiDevelop ttk.Frame RevPiInfo tkinter.Frame diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p index c547970..8fd9c6f 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,7 +1,7 @@ - + en_US @@ -14,6 +14,7 @@ revpipycontrol/aclmanager.py + revpipycontrol/mqttmanager.py revpipycontrol/mytools.py revpipycontrol/revpicheckclient.py revpipycontrol/revpidevelop.py diff --git a/revpipycontrol/aclmanager.py b/revpipycontrol/aclmanager.py index b193753..4818ffb 100644 --- a/revpipycontrol/aclmanager.py +++ b/revpipycontrol/aclmanager.py @@ -20,7 +20,7 @@ class AclManager(ttk.Frame): u"""Hauptfenster des ACL-Managers.""" def __init__(self, master, minlevel, maxlevel, acl_str="", readonly=False): - u"""Init RevPiOption-Class. + u"""Init AclManger-Class. @return None""" super().__init__(master) self.master.bind("", self._checkclose) diff --git a/revpipycontrol/mqttmanager.py b/revpipycontrol/mqttmanager.py new file mode 100644 index 0000000..9847489 --- /dev/null +++ b/revpipycontrol/mqttmanager.py @@ -0,0 +1,321 @@ +# -*- coding: utf-8 -*- +u"""Optionen für das MQTT System.""" + +__author__ = "Sven Sager" +__copyright__ = "Copyright (C) 2018 Sven Sager" +__license__ = "GPLv3" + +import tkinter +import tkinter.messagebox as tkmsg +from mytools import gettrans + +# Übersetzung laden +_ = gettrans() + + +class MqttManager(tkinter.Frame): + + u"""Hauptfenster der MQTT-Einstellungen.""" + + def __init__(self, master, settings, readonly=False): + u"""Init MqttManager-Class. + @return None""" + if not isinstance(settings, dict): + raise ValueError("parameter settings must be ") + if not isinstance(readonly, bool): + raise ValueError("parameter readonly must be ") + + super().__init__(master) + self.master.bind("", self._checkclose) + self.master.protocol("WM_DELETE_WINDOW", self._checkclose) + self.pack(expand=True, fill="both") + + # Daten laden + self.__ro = "disabled" if readonly else "normal" + self.__settings = settings + + # Fenster bauen + self._createwidgets() + + def _changesdone(self): + u"""Prüft ob sich die Einstellungen geändert haben. + @return True, wenn min. eine Einstellung geändert wurde""" + return ( + self.var_basetopic.get() != self.__settings["mqttbasetopic"] or + self.var_send_events.get() != self.__settings["mqttsend_events"] or + self.var_client_id.get() != self.__settings["mqttclient_id"] or + self.var_password.get() != self.__settings["mqttpassword"] or + self.var_port.get() != str(self.__settings["mqttport"]) or + self.var_tls_set.get() != self.__settings["mqtttls_set"] or + self.var_username.get() != self.__settings["mqttusername"] or + self.var_broker_address.get() != + self.__settings["mqttbroker_address"] or + self.var_sendinterval.get() != + str(self.__settings["mqttsendinterval"]) or + self.var_write_outputs.get() != + self.__settings["mqttwrite_outputs"] + ) + + 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, default="no" + ) + + if ask: + self.master.destroy() + + def _createwidgets(self): + u"""Erstellt Widgets.""" + self.master.wm_title(_("MQTT Settings")) + self.master.wm_resizable(width=False, height=False) + + # cpade = {"padx": 4, "pady": 2, "sticky": "e"} + cpadw = {"padx": 4, "pady": 2, "sticky": "w"} + cpadwe = {"padx": 4, "pady": 2, "sticky": "we"} + + # Gruppe MQTT System ###################################### + + # Basetopic + gb = tkinter.LabelFrame(self) + gb["text"] = _("MQTT base topic") + gb.columnconfigure(0, weight=1) + gb.pack(expand=True, fill="both", padx=4, pady=4) + + self.var_basetopic = tkinter.StringVar( + gb, self.__settings["mqttbasetopic"]) + + row = 0 + lbl = tkinter.Label(gb) + lbl["text"] = _("Base topic") + ":" + lbl.grid(row=row, column=0, **cpadw) + + txt = tkinter.Entry(gb) + txt["state"] = self.__ro + txt["textvariable"] = self.var_basetopic + txt["width"] = 34 + txt.grid(row=row, column=1, **cpadwe) + + row += 1 + lbl = tkinter.Label(gb) + lbl["justify"] = "left" + lbl["text"] = _( + """The base topic is the first part of any mqtt topic, the +Revolution Pi will publish. You can use any character +includig '/' to identify the messages and subscribe them +on your broker. + +For example: revpi0000/data""" + ) + lbl.grid(row=row, column=0, columnspan=2, **cpadw) + + # Publish settings + gb = tkinter.LabelFrame(self) + gb["text"] = _("MQTT publish settings") + gb.columnconfigure(0, weight=1) + gb.pack(expand=True, fill="both", padx=4, pady=4) + + self.var_send_events = tkinter.BooleanVar( + gb, self.__settings["mqttsend_events"]) + self.var_sendinterval = tkinter.StringVar( + gb, self.__settings["mqttsendinterval"]) + self.var_write_outputs = tkinter.BooleanVar( + gb, self.__settings["mqttwrite_outputs"]) + + row = 0 + lbl = tkinter.Label(gb) + lbl["text"] = _("Publish all exported values every n seconds") + ":" + lbl.grid(row=row, column=0, **cpadw) + sb = tkinter.Spinbox(gb) + sb["state"] = self.__ro + sb["textvariable"] = self.var_sendinterval + sb["width"] = 5 + sb.grid(row=row, column=1, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["justify"] = "left" + lbl["text"] = _("Topic: \t[basetopic]/io/[ioname]") + lbl.grid(row=row, columnspan=2, **cpadw) + + row += 1 + cb = tkinter.Checkbutton(gb) + cb["state"] = self.__ro + cb["text"] = _("Send exported values immediately on value change") + cb["variable"] = self.var_send_events + cb.grid(row=row, columnspan=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["justify"] = "left" + lbl["text"] = _("Topic: \t[basetopic]/event/[ioname]") + lbl.grid(row=row, columnspan=2, **cpadw) + + # Subscribe settings + gb = tkinter.LabelFrame(self) + gb["text"] = _("MQTT set outputs") + gb.columnconfigure(0, weight=1) + gb.pack(expand=True, fill="both", padx=4, pady=4) + + row = 0 + cb = tkinter.Checkbutton(gb) + cb["state"] = self.__ro + cb["text"] = _("Allow MQTT to to set outputs on Revolution Pi") + cb["variable"] = self.var_write_outputs + cb.grid(row=row, columnspan=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["justify"] = "left" + lbl["text"] = _( + """The Revolution Pi will subscribe a topic on which your client +can publish messages with the new value as payload. + +Publish values with topic: \t[basetopic]/set/[outputname]""" + ) + lbl.grid(row=row, columnspan=2, **cpadw) + + # ############################################################ + + # Gruppe Broker ########################################## + gb = tkinter.LabelFrame(self) + gb["text"] = _("MQTT broker settings") + gb.pack(expand=True, fill="both", padx=4, pady=4) + gb.columnconfigure(2, weight=1) + + # Variablen + self.var_client_id = tkinter.StringVar( + gb, self.__settings["mqttclient_id"]) + self.var_broker_address = tkinter.StringVar( + gb, self.__settings["mqttbroker_address"]) + self.var_password = tkinter.StringVar( + gb, self.__settings["mqttpassword"]) + self.var_port = tkinter.StringVar( + gb, self.__settings["mqttport"]) + self.var_tls_set = tkinter.BooleanVar( + gb, self.__settings["mqtttls_set"]) + self.var_username = tkinter.StringVar( + gb, self.__settings["mqttusername"]) + + row = 0 + lbl = tkinter.Label(gb) + lbl["text"] = _("Broker address") + ":" + lbl.grid(row=row, column=0, **cpadw) + txt = tkinter.Entry(gb) + txt["state"] = self.__ro + txt["textvariable"] = self.var_broker_address + txt.grid(row=row, column=1, columnspan=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["text"] = _("Broker port") + ":" + lbl.grid(row=row, column=0, **cpadw) + sb = tkinter.Spinbox(gb) + sb["state"] = self.__ro + sb["textvariable"] = self.var_port + sb["width"] = 6 + sb.grid(row=row, column=1, **cpadw) + + ckb = tkinter.Checkbutton(gb) + ckb["state"] = self.__ro + ckb["text"] = _("Use TLS") + ":" + ckb["variable"] = self.var_tls_set + ckb.grid(row=row, column=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["text"] = _("Username") + ":" + lbl.grid(row=row, column=0, **cpadw) + txt = tkinter.Entry(gb) + txt["state"] = self.__ro + txt["textvariable"] = self.var_username + txt.grid(row=row, column=1, columnspan=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["text"] = _("Password") + ":" + lbl.grid(row=row, column=0, **cpadw) + txt = tkinter.Entry(gb) + txt["state"] = self.__ro + txt["textvariable"] = self.var_password + txt.grid(row=row, column=1, columnspan=2, **cpadw) + + row += 1 + lbl = tkinter.Label(gb) + lbl["text"] = _("Client ID") + ":" + lbl.grid(row=row, column=0, **cpadw) + txt = tkinter.Entry(gb) + txt["state"] = self.__ro + txt["textvariable"] = self.var_client_id + txt["width"] = 30 + txt.grid(row=row, column=1, columnspan=2, **cpadw) + + # ############################################################ + + frame = tkinter.Frame(self) + frame.columnconfigure(0, weight=1) + frame.columnconfigure(1, weight=1) + frame.pack(expand=True, fill="both", pady=4) + + # Buttons + btn_save = tkinter.Button(frame) + btn_save["command"] = self._save + btn_save["state"] = self.__ro + btn_save["text"] = _("Save") + btn_save.grid(column=0, row=0) + + btn_close = tkinter.Button(frame) + btn_close["command"] = self._checkclose + btn_close["text"] = _("Close") + btn_close.grid(column=1, row=0) + + def _save(self): + u"""Übernimt die Änderungen.""" + + # TODO: Wertprüfung + + # Wertübernahme + self.__settings["mqttbasetopic"] = self.var_basetopic.get() + self.__settings["mqttsendinterval"] = int(self.var_sendinterval.get()) + self.__settings["mqttsend_events"] = int(self.var_send_events.get()) + self.__settings["mqttwrite_outputs"] = \ + int(self.var_write_outputs.get()) + self.__settings["mqttbroker_address"] = self.var_broker_address.get() + self.__settings["mqtttls_set"] = int(self.var_tls_set.get()) + self.__settings["mqttport"] = int(self.var_port.get()) + self.__settings["mqttusername"] = self.var_username.get() + self.__settings["mqttpassword"] = self.var_password.get() + self.__settings["mqttclient_id"] = self.var_client_id.get() + + self._checkclose() + + def get_settings(self): + u"""Gibt die MQTT Konfiguration zurück. + @return Settings als """ + return self.__settings + + settings = property(get_settings) + + +# Debugging +if __name__ == "__main__": + dict_mqttsettings = { + "mqttbasetopic": "revpi01", + "mqttclient_id": "", + "mqttbroker_address": "127.0.0.1", + "mqttpassword": "", + "mqttport": 1883, + "mqttsend_events": 0, + "mqttsendinterval": 30, + "mqtttls_set": 0, + "mqttusername": "", + "mqttwrite_outputs": 0, + } + root = MqttManager(tkinter.Tk(), dict_mqttsettings) + root.mainloop() diff --git a/revpipycontrol/revpioption.py b/revpipycontrol/revpioption.py index 17938ef..899e556 100644 --- a/revpipycontrol/revpioption.py +++ b/revpipycontrol/revpioption.py @@ -8,6 +8,7 @@ __license__ = "GPLv3" import tkinter import tkinter.messagebox as tkmsg from aclmanager import AclManager +from mqttmanager import MqttManager from mytools import gettrans # Übersetzung laden @@ -32,10 +33,27 @@ class RevPiOption(tkinter.Frame): self.master.protocol("WM_DELETE_WINDOW", self._checkclose) self.pack(expand=True, fill="both") + self.frm_mqttmgr = None + self.frm_slaveacl = None + self.frm_xmlacl = None + # XML-RPC Server konfigurieren self.xmlcli = xmlcli self.xmlmodus = self.xmlcli.xmlmodus() + self._dict_mqttsettings = { + "mqttbasetopic": "revpi01", + "mqttclient_id": "", + "mqttbroker_address": "127.0.0.1", + "mqttpassword": "", + "mqttport": 1883, + "mqttsend_events": 0, + "mqttsendinterval": 30, + "mqtttls_set": 0, + "mqttusername": "", + "mqttwrite_outputs": 0, + } + self.mrk_xmlmodask = False self.dorestart = False @@ -61,9 +79,19 @@ class RevPiOption(tkinter.Frame): self.var_slaveacl.get() != self.dc.get("plcslaveacl", "") or self.var_mqtton.get() != self.dc.get("mqtt", 0) or self.var_xmlon.get() != self.dc.get("xmlrpc", 0) or - self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "") + self.var_xmlacl.get() != self.dc.get("xmlrpcacl", "") or + self._changesdone_mqtt() ) + def _changesdone_mqtt(self): + u"""Prüft ob MQTT-Settings geändert wurden. + @return True, wenn Änderungen existieren""" + for key in self._dict_mqttsettings: + if key in self.dc: + if self._dict_mqttsettings[key] != self.dc[key]: + return True + return False + def _checkclose(self, event=None): u"""Prüft ob Fenster beendet werden soll. @param event tkinter-Event""" @@ -246,7 +274,7 @@ class RevPiOption(tkinter.Frame): self.var_mqtton = tkinter.BooleanVar(services) try: status = self.xmlcli.mqttrunning() - except: + except Exception: pass else: row = 2 @@ -257,7 +285,7 @@ class RevPiOption(tkinter.Frame): ckb_slave.grid(column=0, **cpadw) btn_slaveacl = tkinter.Button(services, justify="center") - # TODO: btn_slaveacl["command"] = self.btn_mqttsettings + btn_slaveacl["command"] = self.btn_mqttsettings btn_slaveacl["text"] = _("Settings") btn_slaveacl.grid(column=1, row=row, **cpadwe) @@ -317,7 +345,11 @@ class RevPiOption(tkinter.Frame): self.var_startargs.set(self.dc.get("plcarguments", "")) self.var_pythonver.set(self.dc.get("pythonversion", 3)) + # MQTT Einstellungen laden self.var_mqtton.set(self.dc.get("mqtt", 0)) + for key in self._dict_mqttsettings: + if key in self.dc: + self._dict_mqttsettings[key] = self.dc[key] self.var_slave.set(self.dc.get("plcslave", 0)) self.var_slaveacl.set(self.dc.get("plcslaveacl", "")) @@ -361,11 +393,34 @@ class RevPiOption(tkinter.Frame): self.dc["zeroonerror"] = int(self.var_zerr.get()) self.dc["zeroonexit"] = int(self.var_zexit.get()) + # MQTT Settings self.dc["mqtt"] = int(self.var_mqtton.get()) + self.dc["mqttbasetopic"] = \ + self._dict_mqttsettings["mqttbasetopic"] + self.dc["mqttclient_id"] = \ + self._dict_mqttsettings["mqttclient_id"] + self.dc["mqttbroker_address"] = \ + self._dict_mqttsettings["mqttbroker_address"] + self.dc["mqttpassword"] = \ + self._dict_mqttsettings["mqttpassword"] + self.dc["mqttusername"] = \ + self._dict_mqttsettings["mqttusername"] + self.dc["mqttport"] = \ + int(self._dict_mqttsettings["mqttport"]) + self.dc["mqttsend_events"] = \ + int(self._dict_mqttsettings["mqttsend_events"]) + self.dc["mqttsendinterval"] = \ + int(self._dict_mqttsettings["mqttsendinterval"]) + self.dc["mqtttls_set"] = \ + int(self._dict_mqttsettings["mqtttls_set"]) + self.dc["mqttwrite_outputs"] = \ + int(self._dict_mqttsettings["mqttwrite_outputs"]) + # PLCSlave Settings self.dc["plcslave"] = int(self.var_slave.get()) self.dc["plcslaveacl"] = self.var_slaveacl.get() + # XML Settings self.dc["xmlrpc"] = int(self.var_xmlon.get()) self.dc["xmlrpcacl"] = self.var_xmlacl.get() @@ -398,34 +453,46 @@ class RevPiOption(tkinter.Frame): if not self.mrk_xmlmodask: self.var_xmlon.set(True) + def btn_mqttsettings(self): + u"""Öffnet Fenster für MQTT Einstellungen.""" + win = tkinter.Toplevel(self) + win.focus_set() + win.grab_set() + self.frm_mqttmgr = MqttManager( + win, self._dict_mqttsettings, + readonly=self.xmlmodus < 4 + ) + self.wait_window(win) + self._dict_mqttsettings = self.frm_mqttmgr.settings + def btn_slaveacl(self): u"""Öffnet Fenster für ACL-Verwaltung.""" win = tkinter.Toplevel(self) win.focus_set() win.grab_set() - slaveacl = AclManager( + self.frm_slaveacl = AclManager( win, 0, 1, self.var_slaveacl.get(), readonly=self.xmlmodus < 4 ) - slaveacl.acltext = { + self.frm_slaveacl.acltext = { 0: _("read only"), 1: _("read and write") } self.wait_window(win) - self.var_slaveacl.set(slaveacl.acl) + self.var_slaveacl.set(self.frm_slaveacl.acl) def btn_xmlacl(self): u"""Öffnet Fenster für ACL-Verwaltung.""" win = tkinter.Toplevel(self) win.focus_set() win.grab_set() - slaveacl = AclManager( + self.frm_xmlacl = AclManager( win, 0, 4, self.var_xmlacl.get(), readonly=self.xmlmodus < 4 ) - slaveacl.acltext = { + self.frm_xmlacl.acltext = { 0: _("Start/Stop PLC program and read logs"), 1: _("+ read IOs in watch modus"), 2: _("+ read properties and download PLC program"), @@ -433,4 +500,15 @@ class RevPiOption(tkinter.Frame): 4: _("+ set properties") } self.wait_window(win) - self.var_xmlacl.set(slaveacl.acl) + self.var_xmlacl.set(self.frm_xmlacl.acl) + + def destroy(self): + u"""Beendet alle Unterfenster und sich selbst.""" + if self.frm_mqttmgr is not None: + self.frm_mqttmgr.master.destroy() + if self.frm_slaveacl is not None: + self.frm_slaveacl.master.destroy() + if self.frm_xmlacl is not None: + self.frm_xmlacl.master.destroy() + + super().destroy() diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index ac37e7d..dea88e2 100755 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -82,6 +82,7 @@ class RevPiPyControl(tkinter.Frame): self.tklogs.master.destroy() if self.tkoptions is not None: self.tkoptions.destroy() + self.tkoptions.master.destroy() if self.tkprogram is not None: self.tkprogram.destroy() if self.debugframe is not None: