[1198] | 1 | import tkinter as tk
|
---|
| 2 | from gui.widgets.ScrolledText import ScrolledText
|
---|
| 3 | from gui.framsutils.FramsSocket import FramsSocket
|
---|
[1202] | 4 | from gui.utils import windowHideAndMaximize, windowShowAndSetGeometry
|
---|
[1198] | 5 | from typing import Tuple, Callable
|
---|
| 6 |
|
---|
| 7 | class ConsoleWindow(tk.Toplevel):
|
---|
| 8 | def __init__(self, master, frams: FramsSocket) -> None:
|
---|
| 9 | super().__init__(master)
|
---|
| 10 |
|
---|
| 11 | self.frams: FramsSocket = frams
|
---|
| 12 | self.frams.registerMessageEventCallback(self.messageCallbackEvent)
|
---|
| 13 |
|
---|
| 14 | self.protocol("WM_DELETE_WINDOW", self._dismiss)
|
---|
| 15 | self.title("Console")
|
---|
| 16 |
|
---|
| 17 | self.frame_main = tk.Frame(master=self)
|
---|
| 18 |
|
---|
| 19 | self.console = ScrolledText(self.frame_main, height=10, state="disabled")
|
---|
| 20 | self.console.grid(row=0, column=0, columnspan=2, sticky="NSEW")
|
---|
| 21 |
|
---|
| 22 | self.input = tk.Entry(self.frame_main)
|
---|
| 23 | self.input.bind("<Return>", self.buttonSendCommand)
|
---|
| 24 | self.input.grid(row=1, column=0, sticky="NSEW")
|
---|
| 25 |
|
---|
| 26 | self.sendButton = tk.Button(self.frame_main, text="Send", command=self.buttonSendCommand)
|
---|
| 27 | self.sendButton.grid(row=1, column=1, sticky="SE")
|
---|
| 28 |
|
---|
| 29 | self.frame_main.rowconfigure(0, weight=1)
|
---|
| 30 | self.frame_main.rowconfigure(1, weight=0)
|
---|
| 31 |
|
---|
| 32 | self.frame_main.columnconfigure(0, weight=1)
|
---|
| 33 | self.frame_main.columnconfigure(1, weight=0)
|
---|
| 34 |
|
---|
| 35 | self.frame_main.grid(row=0, column=0, sticky="NSEW")
|
---|
| 36 | self.rowconfigure(0, weight=1)
|
---|
| 37 | self.columnconfigure(0, weight=1)
|
---|
| 38 |
|
---|
| 39 | def parseGeometryString(geometry: str) -> Tuple[int, int, int, int]:
|
---|
| 40 | widthxrest = geometry.split('x')
|
---|
| 41 | heightxy = widthxrest[1].split('+')
|
---|
| 42 | maxwidth = int(widthxrest[0])
|
---|
| 43 | maxheight = int(heightxy[0])
|
---|
| 44 | x = int(heightxy[1])
|
---|
| 45 | y = int(heightxy[2])
|
---|
| 46 | return maxwidth, maxheight, x, y
|
---|
| 47 |
|
---|
| 48 | self.update_idletasks()
|
---|
| 49 |
|
---|
| 50 | width, height, x, y = parseGeometryString(self.winfo_geometry())
|
---|
[1202] | 51 | windowHideAndMaximize(self)
|
---|
[1198] | 52 | rootx = self.winfo_rootx()
|
---|
| 53 | maxWidth, maxHeight, x, y = parseGeometryString(self.winfo_geometry())
|
---|
| 54 | x = (maxWidth - width) / 2
|
---|
| 55 | y = (maxHeight - height) / 2
|
---|
[1202] | 56 | windowShowAndSetGeometry(self, "+%d+%d" % (int(rootx + x), int(y)))
|
---|
[1198] | 57 | self.maxsize(maxWidth, maxHeight)
|
---|
| 58 |
|
---|
| 59 | def buttonSendCommand(self, event=None):
|
---|
| 60 | request = self.input.get().strip()
|
---|
| 61 | if len(request) > 0:
|
---|
| 62 | self.sendButton.config(state=tk.DISABLED)
|
---|
| 63 | self.input.delete(0, tk.END)
|
---|
| 64 |
|
---|
| 65 | response = self.frams.sendRequest(request)
|
---|
| 66 |
|
---|
| 67 | self.console.config(state=tk.NORMAL)
|
---|
| 68 | self.console.insert(tk.END, ">>> {}\n".format(request))
|
---|
| 69 | for r in response:
|
---|
| 70 | self.console.insert(tk.END, r)
|
---|
| 71 | self.console.see(tk.END)
|
---|
| 72 | self.console.config(state=tk.DISABLED)
|
---|
| 73 |
|
---|
| 74 | self.sendButton.config(state=tk.NORMAL)
|
---|
| 75 |
|
---|
| 76 | def _dismiss(self):
|
---|
| 77 | self.frams.registerMessageEventCallback(None)
|
---|
| 78 | self.destroy()
|
---|
| 79 |
|
---|
| 80 | def messageCallbackEvent(self, block, header):
|
---|
| 81 | response = self.frams._infoParser(block)
|
---|
| 82 |
|
---|
| 83 | self.console.config(state=tk.NORMAL)
|
---|
| 84 | self.console.insert(tk.END, ">>> {}\n".format(response[0].p["func"]))
|
---|
| 85 | for r in str(response[0].p["message"]):
|
---|
| 86 | self.console.insert(tk.END, r)
|
---|
| 87 | self.console.insert(tk.END, "\n")
|
---|
| 88 | self.console.see(tk.END)
|
---|
| 89 | self.console.config(state=tk.DISABLED)
|
---|