From c5ef2ae249e5789ec81023bbde4033aa70dd8949 Mon Sep 17 00:00:00 2001 From: NaruX Date: Sat, 4 Mar 2017 17:31:50 +0100 Subject: [PATCH] Men? eingebaut automatische Statusaktualisierung code style --- revpipycontrol.e4p | 3 +- revpipycontrol/revpicheckclient.py | 22 ++++---- revpipycontrol/revpipycontrol.py | 82 +++++++++++++++++++++--------- 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/revpipycontrol.e4p b/revpipycontrol.e4p index 7921dd4..b98a9dc 100644 --- a/revpipycontrol.e4p +++ b/revpipycontrol.e4p @@ -1,7 +1,7 @@ - + en_US @@ -18,6 +18,7 @@ revpipycontrol/revpipycontrol.py revpipycontrol/revpicheckclient.py setup.py + revpipycontrol/revpiplclist.py diff --git a/revpipycontrol/revpicheckclient.py b/revpipycontrol/revpicheckclient.py index 3076f1d..010adb7 100644 --- a/revpipycontrol/revpicheckclient.py +++ b/revpipycontrol/revpicheckclient.py @@ -73,7 +73,7 @@ class RevPiCheckClient(tkinter.Frame): sleep(0.1) - def onFrameConfigure(self, canvas): + def onfrmconf(self, canvas): canvas.configure(scrollregion=canvas.bbox("all")) def _createiogroup(self, device, frame, iotype): @@ -88,13 +88,17 @@ class RevPiCheckClient(tkinter.Frame): canvas.pack(side="left", fill="both", expand=True) canvas.create_window((4, 4), window=s_frame, anchor="nw") - s_frame.bind("", lambda event, canvas=canvas: self.onFrameConfigure(canvas)) - + s_frame.bind( + "", lambda event, canvas=canvas: self.onfrmconf(canvas) + ) + rowcount = 0 for io in self.cli.get_iolist(device, iotype): # io = [name,default,anzbits,adressbyte,export,adressid,bmk,bitaddress,tkinter_var] - tkinter.Label(s_frame, text=io[0]).grid(column=0, row=rowcount, sticky="w") + tkinter.Label(s_frame, text=io[0]).grid( + column=0, row=rowcount, sticky="w" + ) if io[7] >= 0: var = tkinter.BooleanVar() @@ -103,16 +107,13 @@ class RevPiCheckClient(tkinter.Frame): check["text"] = "" check["variable"] = var check.grid(column=1, row=rowcount) - #check.pack(anchor="e", side="right") else: var = tkinter.IntVar() - #txt = tkinter.Spinbox(fra_group, to=256) txt = tkinter.Spinbox(s_frame, to=256) txt["state"] = "disabled" if iotype == "inp" else "normal" txt["width"] = 4 txt["textvariable"] = var txt.grid(column=1, row=rowcount) - #txt.pack(anchor="e", side="right") # Steuerelementvariable in IO übernehmen io.append(var) @@ -120,7 +121,7 @@ class RevPiCheckClient(tkinter.Frame): self.dict_inpvar[device].append(io) elif iotype == "out": self.dict_outvar[device].append(io) - + rowcount += 1 def _createwidgets(self): @@ -158,7 +159,7 @@ class RevPiCheckClient(tkinter.Frame): self.btn_read["text"] = "LESEN" self.btn_read["command"] = self.readvalues self.btn_read.pack(side="bottom", fill="x") - + check = tkinter.Checkbutton(self) check["command"] = self.toggleauto check["text"] = "autoupdate" @@ -211,7 +212,8 @@ class RevPiCheckClient(tkinter.Frame): def toggleauto(self): self.btn_read["state"] = "disabled" if self.autorw.get() else "normal" self.btn_write["state"] = "disabled" if self.autorw.get() else "normal" - if self.autorw.get() and (self.fut_autorw is None or self.fut_autorw.done()): + if self.autorw.get() \ + and (self.fut_autorw is None or self.fut_autorw.done()): e = ThreadPoolExecutor(max_workers=1) self.fut_autorw = e.submit(self._autorw) diff --git a/revpipycontrol/revpipycontrol.py b/revpipycontrol/revpipycontrol.py index 2f04a09..fa47d7b 100644 --- a/revpipycontrol/revpipycontrol.py +++ b/revpipycontrol/revpipycontrol.py @@ -13,8 +13,8 @@ from argparse import ArgumentParser from xmlrpc.client import ServerProxy, Binary -class RevPiPyLogs(tkinter.Frame): - +class RevPiPlcLogs(tkinter.Frame): + def __init__(self, master, xmlcli): super().__init__(master) self.pack(fill="both", expand=True) @@ -29,6 +29,7 @@ class RevPiPyLogs(tkinter.Frame): self.plcscr = tkinter.Scrollbar(self) self.plclog.pack(side="left", expand=True, fill="both") self.plcscr.pack(side="left", fill="y") + # self.plclog["state"] = "disabled" self.plclog["yscrollcommand"] = self.plcscr.set self.plcscr["command"] = self.plclog.yview @@ -37,12 +38,13 @@ class RevPiPyLogs(tkinter.Frame): self.appscr = tkinter.Scrollbar(self) self.appscr.pack(side="right", fill="y") self.applog.pack(side="right", expand=True, fill="both") + # self.applog["state"] = "disabled" self.applog["yscrollcommand"] = self.appscr.set self.appscr["command"] = self.applog.yview self.get_applog() self.get_plclog() - + # Timer zum nachladen aktivieren self.master.after(1000, self.get_applines) self.master.after(1000, self.get_plclines) @@ -75,12 +77,12 @@ class RevPiPyLogs(tkinter.Frame): class RevPiPyControl(tkinter.Frame): - + def __init__(self, master=None): super().__init__(master) self.pack(fill="both", expand=True) - # Command arguments + # Command arguments parser = ArgumentParser( description="Revolution Pi IO-Client" ) @@ -102,22 +104,33 @@ class RevPiPyControl(tkinter.Frame): self._createwidgets() # Daten aktualisieren - self.plcrunning() + self.tmr_plcrunning() def _createwidgets(self): """Erstellt den Fensterinhalt.""" # Hauptfenster self.master.wm_title("RevPi Python PLC Loader") - self.var_status = tkinter.StringVar() - self.txt_status = tkinter.Entry() - self.txt_status["textvariable"] = self.var_status - self.txt_status.pack(fill="x") + self.var_opt = tkinter.StringVar() + self.lst_opt = [ + "Verbindungen...", + "------------------", + "PLC Log...", + "PLC Monitor...", + "PLC Optionen...", + "------------------", + "Beenden", + ] + self.opt_menu = tkinter.OptionMenu( + self, self.var_opt, *self.lst_opt, command=self._opt_do + ) + self.opt_menu.pack(fill="x") - self.btn_plcrunning = tkinter.Button(self) - self.btn_plcrunning["text"] = "PLC Status" - self.btn_plcrunning["command"] = self.plcrunning - self.btn_plcrunning.pack(fill="x") + self.var_conn = tkinter.StringVar() + self.txt_conn = tkinter.Entry(self) + self.txt_conn["state"] = "readonly" + self.txt_conn["textvariable"] = self.var_conn + self.txt_conn.pack() self.btn_plcstart = tkinter.Button(self) self.btn_plcstart["text"] = "PLC Start" @@ -144,34 +157,53 @@ class RevPiPyControl(tkinter.Frame): self.btn_plcrestart["command"] = self.plclogs self.btn_plcrestart.pack(fill="x") + self.var_status = tkinter.StringVar() + self.txt_status = tkinter.Entry(self) + self.txt_status["state"] = "readonly" + self.txt_status["textvariable"] = self.var_status + self.txt_status.pack() + + def _opt_do(self, text): + optselect = self.lst_opt.index(text) + if optselect == 0: + # Verbindungen + pass + elif optselect == 2: + self.plclogs() + elif optselect == 3: + pass + # self.plcmonitor() + elif optselect == 4: + # Optionen + pass + elif optselect == 6: + self.master.destroy() + self.var_opt.set("") + def plclogs(self): root = tkinter.Tk() - self.tklogs = RevPiPyLogs(root, self.cli) + self.tklogs = RevPiPlcLogs(root, self.cli) def plcmonitor(self): root = tkinter.Tk() self.tkmonitor = revpicheckclient.RevPiCheckClient(root, self.cli) - def plcstart (self): + def plcstart(self): self.cli.plcstart() - self.plcrunning() def plcstop(self): self.cli.plcstop() - self.plcrunning() def plcrestart(self): self.cli.plcstop() self.cli.plcstart() - self.plcrunning() - def plcrunning(self): + def tmr_plcrunning(self): if self.cli.plcrunning(): - self.btn_plcrunning["activebackground"] = "green" - self.btn_plcrunning["bg"] = "green" + self.txt_status["readonlybackground"] = "green" else: - self.btn_plcrunning["activebackground"] = "red" - self.btn_plcrunning["bg"] = "red" + self.txt_status["readonlybackground"] = "red" + plcec = self.cli.plcexitcode() if plcec == -1: plcec = "RUNNING" @@ -179,6 +211,8 @@ class RevPiPyControl(tkinter.Frame): plcec = "NOT RUNNING" self.var_status.set(plcec) + self.master.after(1000, self.tmr_plcrunning) + if __name__ == "__main__": root = tkinter.Tk()