1 | import tkinter as tk
|
---|
2 | from gui.widgets.ScrolledText import ScrolledText
|
---|
3 | from gui.framsutils.FramsSocket import FramsSocket
|
---|
4 | from gui.utils import windowHideAndMaximize, windowShowAndSetGeometry
|
---|
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())
|
---|
51 | windowHideAndMaximize(self)
|
---|
52 | rootx = self.winfo_rootx()
|
---|
53 | maxWidth, maxHeight, x, y = parseGeometryString(self.winfo_geometry())
|
---|
54 | x = (maxWidth - width) / 2
|
---|
55 | y = (maxHeight - height) / 2
|
---|
56 | windowShowAndSetGeometry(self, "+%d+%d" % (int(rootx + x), int(y)))
|
---|
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)
|
---|