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

xml-mode abfragen und Fenster danach aufbauen

Meldungstexte ?berarbeitet
This commit is contained in:
2017-03-16 21:03:12 +01:00
parent cc03ede267
commit 29249462ca
11 changed files with 168 additions and 41 deletions

View File

@@ -3,3 +3,6 @@ syntax: glob
deb_dist/*
dist/*
revpipycontrol.egg-info/*
doc/*
deb/*
.eric6project/*

BIN
data/revpipycontrol.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
data/revpipycontrol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Project SYSTEM "Project-5.1.dtd">
<!-- eric project file for project revpipycontrol -->
<!-- Saved: 2017-03-16, 16:32:04 -->
<!-- Saved: 2017-03-16, 21:00:50 -->
<!-- Copyright (C) 2017 Sven Sager, akira@narux.de -->
<Project version="5.1">
<Language>en_US</Language>
@@ -14,7 +14,6 @@
<Email>akira@narux.de</Email>
<Eol index="-1"/>
<Sources>
<Source>revpipycontrol/__init__.py</Source>
<Source>revpipycontrol/revpipycontrol.py</Source>
<Source>revpipycontrol/revpicheckclient.py</Source>
<Source>setup.py</Source>
@@ -29,6 +28,7 @@
<Interfaces/>
<Others>
<Other>data</Other>
<Other>doc</Other>
</Others>
<MainScript>revpipycontrol/revpipycontrol.py</MainScript>
<Vcs>
@@ -144,6 +144,59 @@
<FiletypeAssociation pattern="*.pyw" type="SOURCES"/>
<FiletypeAssociation pattern="*.pyw3" type="SOURCES"/>
</FiletypeAssociations>
<Documentation>
<DocumentationParams>
<dict>
<key>
<string>ERIC4DOC</string>
</key>
<value>
<dict>
<key>
<string>ignoreFilePatterns</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>noindex</string>
</key>
<value>
<bool>True</bool>
</value>
<key>
<string>outputDirectory</string>
</key>
<value>
<string>doc</string>
</value>
<key>
<string>qtHelpEnabled</string>
</key>
<value>
<bool>False</bool>
</value>
<key>
<string>sourceExtensions</string>
</key>
<value>
<list>
<string></string>
</list>
</value>
<key>
<string>useRecursion</string>
</key>
<value>
<bool>True</bool>
</value>
</dict>
</value>
</dict>
</DocumentationParams>
</Documentation>
<Checkers>
<CheckersParams>
<dict>

View File

@@ -11,18 +11,23 @@ import tkinter.messagebox as tkmsg
class RevPiOption(tkinter.Frame):
def __init__(self, master, xmlcli):
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 Connections")
self.master.wm_title("RevPi Python PLC Options")
self.master.wm_resizable(width=False, height=False)
cpadw = {"padx": 4, "pady": 2, "sticky": "w"}
@@ -40,18 +45,25 @@ class RevPiOption(tkinter.Frame):
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 Absturz neustarten"
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
@@ -72,25 +84,33 @@ class RevPiOption(tkinter.Frame):
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)
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
@@ -109,32 +129,41 @@ 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["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)
@@ -181,9 +210,10 @@ class RevPiOption(tkinter.Frame):
dc["xmlrpc"] += 1
dc["xmlrpcport"] = self.var_xmlport.get()
self.xmlmode = dc["xmlrpc"]
ask = tkmsg.askyesnocancel(
"Frage", "Die Einstellungen werden jetzt auf den Revolution Pi "
"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
@@ -191,7 +221,8 @@ class RevPiOption(tkinter.Frame):
if ask is not None:
if self.xmlcli.set_config(dc, ask):
tkmsg.showinfo(
"Information", "Einstellungen gespeichert.", parent=self.master
"Information", "Einstellungen gespeichert.",
parent=self.master
)
else:
tkmsg.showerror(
@@ -204,7 +235,7 @@ class RevPiOption(tkinter.Frame):
if not self.var_xmlon.get():
ask = tkmsg.askyesno(
"Frage", "Soll der XML-RPC Server wirklich beendet werden? "
"Sie können dann mit diesem Programm NICHT mehr auf den "
"Sie können dann NICHT mehr mit diesem Programm auf den "
"Revolution Pi zugreifen.", parent=self.master
)
if not ask:

View File

@@ -36,6 +36,8 @@ class RevPiPlcList(tkinter.Frame):
super().__init__(master)
self.pack()
self.changes = False
# Daten laden
self._connections = {}
@@ -117,6 +119,7 @@ class RevPiPlcList(tkinter.Frame):
makedirs(os.path.dirname(savefile), exist_ok=True)
fh = open(savefile, "wb")
pickle.dump(self._connections, fh)
self.changes = False
except:
return False
return True
@@ -133,14 +136,18 @@ class RevPiPlcList(tkinter.Frame):
self.build_listconn()
self.evt_btnnew()
self.changes = True
def evt_btnclose(self):
ask = tkmsg.askyesno(
"Frage...",
"Wollen Sie wirklich beenden?\n"
"Nicht gespeicherte Änderungen gehen verloren",
parent=self.master
)
if self.changes:
ask = tkmsg.askyesno(
parent=self.master, title="Frage...",
message="Wollen Sie wirklich beenden?\n"
"Nicht gespeicherte Änderungen gehen verloren",
)
else:
ask = True
if ask:
self.master.destroy()
@@ -168,6 +175,7 @@ class RevPiPlcList(tkinter.Frame):
del self._connections[item]
self.build_listconn()
self.evt_btnnew()
self.changes = True
def evt_btnsave(self):
if self._saveappdata():

View File

@@ -19,7 +19,10 @@ from xmlrpc.client import Binary
class RevPiProgram(tkinter.Frame):
def __init__(self, master, xmlcli, revpi):
def __init__(self, master, xmlcli, xmlmode, revpi):
if xmlmode < 2:
return None
super().__init__(master)
# master.protocol("WM_DELETE_WINDOW", self._checkclose)
self.pack(expand=True, fill="both")
@@ -27,6 +30,8 @@ class RevPiProgram(tkinter.Frame):
self.uploaded = False
self.revpi = revpi
self.xmlcli = xmlcli
self.xmlmode = xmlmode
self.xmlstate = "normal" if xmlmode == 3 else "disabled"
# Fenster bauen
self._createwidgets()
@@ -56,7 +61,7 @@ class RevPiProgram(tkinter.Frame):
# Gruppe Programm
prog = tkinter.LabelFrame(self)
prog.columnconfigure(0, weight=1)
prog["text"] = "PLC Pythonprogramm"
prog["text"] = "PLC Python programm"
prog.grid(columnspan=2, pady=2, sticky="we")
# Variablen vorbereiten
@@ -98,22 +103,26 @@ class RevPiProgram(tkinter.Frame):
opt = tkinter.OptionMenu(
prog, self.var_typeup, *self.lst_typeup,
command=self._evt_optup)
opt["state"] = self.xmlstate
opt["width"] = 10
opt.grid(column=1, row=r, **cpad)
r = 3
ckb = tkinter.Checkbutton(prog)
ckb["state"] = self.xmlstate
ckb["text"] = "vorher alles im Uploadverzeichnis löschen"
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["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.grid(column=1, row=r, **cpad)
@@ -135,6 +144,7 @@ class RevPiProgram(tkinter.Frame):
lbl.grid(column=0, row=1, **cpadw)
btn = tkinter.Button(picto)
btn["command"] = self.setpictoryrsc
btn["state"] = self.xmlstate
btn["text"] = "Upload"
btn.grid(column=1, row=1, **cpad)
@@ -144,7 +154,7 @@ class RevPiProgram(tkinter.Frame):
proc["text"] = "piControl0 Prozessabbild"
proc.grid(columnspan=2, pady=2, sticky="we")
lbl = tkinter.Label(proc)
lbl["text"] = "Prozessabbild herunterladen"
lbl["text"] = "Prozessabbild-Dump herunterladen"
lbl.grid(column=0, row=0, **cpadw)
btn = tkinter.Button(proc)
btn["command"] = self.getprocimg
@@ -282,7 +292,7 @@ class RevPiProgram(tkinter.Frame):
ask = tkmsg.askyesno(
parent=self.master, title="Frage",
message="Soll nach dem Hochladen der piCtory Konfiguration "
"ein reset am piControl Treiber durchgeführt werden?"
"ein Reset am piControl Treiber durchgeführt werden?"
)
ec = self.xmlcli.set_pictoryrsc(Binary(fh.read()), ask)
@@ -400,7 +410,7 @@ class RevPiProgram(tkinter.Frame):
if tup == 0:
# Datei
fileselect = tkfd.askopenfilenames(
parent=self.master, title="Pythonprogramm übertragen...",
parent=self.master, title="Python Programm übertragen...",
filetypes=(("Python", "*.py"), ("All Files", "*.*"))
)
if type(fileselect) == tuple and len(fileselect) > 0:

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -22,6 +22,7 @@ from xmlrpc.client import ServerProxy
socket.setdefaulttimeout(2)
def addroot(filename):
u"""Hängt root-dir der Anwendung vor Dateinamen.
@@ -48,6 +49,7 @@ class RevPiPyControl(tkinter.Frame):
self.dict_conn = revpiplclist.get_connections()
self.errcount = 0
self.revpiname = None
self.xmlmode = 0
# Globale Fenster
self.tklogs = None
@@ -148,7 +150,7 @@ class RevPiPyControl(tkinter.Frame):
)
# Server prüfen
try:
sp.system.listMethods()
self.xmlmode = sp.xmlmodus()
except:
self.servererror()
else:
@@ -183,28 +185,46 @@ class RevPiPyControl(tkinter.Frame):
self._fillconnbar()
def plclogs(self):
# TODO: nicht doppelt starten
win = tkinter.Toplevel(self)
self.tklogs = revpilogfile.RevPiLogfile(win, self.cli)
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):
# TODO: Monitorfenster
#self.tkmonitor = revpicheckclient.RevPiCheckClient(self.master, self.cli)
pass
def plcoptions(self):
win = tkinter.Toplevel(self)
self.tkoptions = revpioption.RevPiOption(win, self.cli)
win.focus_set()
win.grab_set()
self.wait_window(win)
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!"
)
else:
win = tkinter.Toplevel(self)
self.tkoptions = \
revpioption.RevPiOption(win, self.cli, self.xmlmode)
win.focus_set()
win.grab_set()
self.wait_window(win)
self.xmlmode = self.tkoptions.xmlmode
def plcprogram(self):
win = tkinter.Toplevel(self)
self.tkprogram = revpiprogram.RevPiProgram(win, self.cli, self.revpiname)
win.focus_set()
win.grab_set()
self.wait_window(win)
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!"
)
else:
win = tkinter.Toplevel(self)
self.tkprogram = revpiprogram.RevPiProgram(
win, self.cli, self.xmlmode, self.revpiname)
win.focus_set()
win.grab_set()
self.wait_window(win)
def plcstart(self):
self.cli.plcstart()
@@ -223,9 +243,7 @@ class RevPiPyControl(tkinter.Frame):
self._btnstate()
self.mbar.entryconfig("PLC", state="disabled")
self.var_conn.set("")
self._closeall()
tkmsg.showerror("Fehler", "Server ist nicht erreichbar!")
def tmr_plcrunning(self):
@@ -250,6 +268,10 @@ class RevPiPyControl(tkinter.Frame):
plcec = "RUNNING"
elif plcec == -2:
plcec = "FILE NOT FOUND"
elif plcec == -9:
plcec = "PROGRAM KILLED"
elif plcec == -15:
plcec = "PROGRAMS TERMED"
elif plcec == 0:
plcec = "NOT RUNNING"
self.var_status.set(plcec)