1
0
mirror of https://github.com/naruxde/revpipycontrol.git synced 2025-11-08 15:43:52 +01:00
Files
revpipycontrol/revpipycontrol/revpioption.py
NaruX b7115ef128 Bei fehlenden Einstellungen default Werte setzen
Programmargumente k?nnen konfiguriert werden
2017-03-20 13:22:56 +01:00

262 lines
9.2 KiB
Python

#
# RevPiPyControl
#
# Webpage: https://revpimodio.org/revpipyplc/
# (c) Sven Sager, License: LGPLv3
#
# -*- coding: utf-8 -*-
import tkinter
import tkinter.messagebox as tkmsg
class RevPiOption(tkinter.Frame):
def __init__(self, master, xmlcli, xmlmode):
if xmlmode < 2:
return None
super().__init__(master)
self.pack(expand=True, fill="both")
self.xmlcli = xmlcli
self.xmlmode = xmlmode
self.xmlstate = "normal" if xmlmode == 3 else "disabled"
# Fenster bauen
self._createwidgets()
self._loadappdata()
def _createwidgets(self):
self.master.wm_title("RevPi Python PLC Options")
self.master.wm_resizable(width=False, height=False)
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
cpadwe = {"padx": 4, "pady": 2, "sticky": "we"}
# Gruppe Start/Stop
stst = tkinter.LabelFrame(self)
stst["text"] = "Start / Stopp Verhalten"
stst.grid(columnspan=2, pady=2, sticky="we")
self.var_start = tkinter.BooleanVar(stst)
self.var_reload = tkinter.BooleanVar(stst)
self.var_zexit = tkinter.BooleanVar(stst)
self.var_zerr = tkinter.BooleanVar(stst)
ckb_start = tkinter.Checkbutton(stst)
ckb_start["text"] = "Programm automatisch starten"
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["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["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["variable"] = self.var_zerr
ckb_zerr.grid(**cpadw)
# Gruppe Programm
prog = tkinter.LabelFrame(self)
prog["text"] = "PLC Programm"
prog.grid(columnspan=2, pady=2, sticky="we")
self.var_pythonver = tkinter.IntVar(prog)
self.var_startpy = tkinter.StringVar(prog)
self.var_startargs = tkinter.StringVar(prog)
self.var_slave = tkinter.BooleanVar(prog)
self.var_pythonver.set(3)
lbl = tkinter.Label(prog)
lbl["text"] = "Python Version"
lbl.grid(columnspan=2, row=0, **cpadw)
rbn = tkinter.Radiobutton(prog)
rbn["state"] = self.xmlstate
rbn["text"] = "Python2"
rbn["value"] = 2
rbn["variable"] = self.var_pythonver
rbn.grid(column=0, row=1, **cpadw)
rbn = tkinter.Radiobutton(prog)
rbn["state"] = self.xmlstate
rbn["text"] = "Python3"
rbn["value"] = 3
rbn["variable"] = self.var_pythonver
rbn.grid(column=1, row=1, **cpadw)
lbl = tkinter.Label(prog)
lbl["text"] = "Python PLC Programname"
lbl.grid(columnspan=2, **cpadw)
lst = self.xmlcli.get_filelist()
if len(lst) == 0:
lst.append("none")
opt_startpy = tkinter.OptionMenu(
prog, self.var_startpy, *lst)
opt_startpy["state"] = self.xmlstate
opt_startpy.grid(columnspan=2, **cpadwe)
lbl = tkinter.Label(prog)
lbl["text"] = "Programm Argumente"
lbl.grid(columnspan=2, **cpadw)
txt = tkinter.Entry(prog)
txt["textvariable"] = self.var_startargs
txt.grid(columnspan=2, **cpadw)
ckb_slave = tkinter.Checkbutton(prog, justify="left")
ckb_slave["state"] = self.xmlstate
ckb_slave["text"] = "RevPi als PLC-Slave verwenden"
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.grid(columnspan=2, pady=2, sticky="we")
self.var_xmlon = tkinter.BooleanVar(xmlrpc)
self.var_xmlmod2 = tkinter.BooleanVar(xmlrpc)
self.var_xmlmod3 = tkinter.BooleanVar(xmlrpc)
self.var_xmlport = tkinter.StringVar(xmlrpc)
self.var_xmlport.set("55123")
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["variable"] = self.var_xmlon
ckb_xmlon.grid(**cpadw)
self.ckb_xmlmod2 = tkinter.Checkbutton(xmlrpc, justify="left")
self.ckb_xmlmod2["command"] = self.xmlmods
self.ckb_xmlmod2["state"] = self.xmlstate
self.ckb_xmlmod2["text"] = \
"Download von piCtory Konfiguration und\nPLC Programm zulassen"
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"
self.ckb_xmlmod3["variable"] = self.var_xmlmod3
self.ckb_xmlmod3.grid(**cpadw)
lbl = tkinter.Label(xmlrpc)
lbl["text"] = "XML-RPC Serverport"
lbl.grid(**cpadw)
spb_xmlport = tkinter.Spinbox(xmlrpc)
spb_xmlport["to"] = 65535
spb_xmlport["from"] = 1024
spb_xmlport["state"] = self.xmlstate
spb_xmlport["textvariable"] = self.var_xmlport
spb_xmlport.grid(**cpadwe)
# Buttons
btn_save = tkinter.Button(self)
btn_save["command"] = self._setappdata
btn_save["state"] = self.xmlstate
btn_save["text"] = "Speichern"
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.grid(column=1, row=3)
def _loadappdata(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_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_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_xmlport.set(dc.get("xmlrpcport", "55123"))
def _setappdata(self):
dc = {}
dc["autostart"] = int(self.var_start.get())
dc["autoreload"] = int(self.var_reload.get())
dc["zeroonexit"] = int(self.var_zexit.get())
dc["zeroonerror"] = int(self.var_zerr.get())
dc["plcprogram"] = self.var_startpy.get()
dc["plcarguments"] = self.var_startargs.get()
dc["pythonversion"] = self.var_pythonver.get()
dc["plcslave"] = int(self.var_slave.get())
dc["xmlrpc"] = 0
if self.var_xmlon.get():
dc["xmlrpc"] += 1
if self.var_xmlmod2.get():
dc["xmlrpc"] += 1
if self.var_xmlmod3.get():
dc["xmlrpc"] += 1
dc["xmlrpcport"] = self.var_xmlport.get()
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
)
if ask is not None:
if self.xmlcli.set_config(dc, ask):
tkmsg.showinfo(
"Information", "Einstellungen gespeichert.",
parent=self.master
)
else:
tkmsg.showerror(
"Fehler", "Die Einstellungen konnten nicht gesichert"
"werden. Dies kann passieren, wenn Werte falsch sind!",
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
)
if not ask:
self.var_xmlon.set(True)
self.xmlmods()
def xmlmods(self):
self.ckb_xmlmod2["state"] = \
"normal" if self.var_xmlon.get() else "disabled"
self.ckb_xmlmod3["state"] = \
"normal" if self.var_xmlmod2.get() else "disabled"