From d4db845cb34ac49069d085fd74e2920cb6fb4c4f Mon Sep 17 00:00:00 2001 From: KenanZhu111 <3471685733@qq.com> Date: Fri, 1 Nov 2024 23:11:53 +0800 Subject: [PATCH] Modify: Restruct ui code --- app/Config_file.py | 100 +++++++++ app/Func_callback.py | 359 ++++++++++++++++++++++++++++++ app/Ui_about.py | 39 ++++ app/Ui_main.py | 477 ++++++++++++++++++++++++++++++++++++++++ app/Ui_options.py | 512 +++++++++++++++++++++++++++++++++++++++++++ app/Ui_processor.py | 243 ++++++++++++++++++++ app/Ui_view.py | 270 +++++++++++++++++++++++ 7 files changed, 2000 insertions(+) create mode 100644 app/Config_file.py create mode 100644 app/Func_callback.py create mode 100644 app/Ui_about.py create mode 100644 app/Ui_main.py create mode 100644 app/Ui_options.py create mode 100644 app/Ui_processor.py create mode 100644 app/Ui_view.py diff --git a/app/Config_file.py b/app/Config_file.py new file mode 100644 index 0000000..8bd3234 --- /dev/null +++ b/app/Config_file.py @@ -0,0 +1,100 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# +from configparser import ConfigParser + +class Configinit: + def __init__(self, config_filepath): + # init + # ------------------------------------------------------------------------------- + self.config = ConfigParser() + self.config_filepath = config_filepath### Config file path + + def load_config(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + try: + with open(self.config_filepath, 'r'): + pass + except FileNotFoundError: + self.create_config() + + def get_config(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.config.read(self.config_filepath) + return self.config + + def create_config(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + ### Config for software info + self.config.add_section('INFO') + self.config.set('INFO', 'Version','1.5.4.1') + self.config.add_section('Options_Calc') + ### Config for calculate param + self.config.set('Options_Calc', 'Iono_model', '0') + self.config.set('Options_Calc', 'Trop_model', '0') + self.config.set('Options_Calc', 'Elev_angle', '0') + self.config.set('Options_Calc', 'Sat_system', '0') + ### Config for plot param + self.config.add_section('Options_Draw') + self.config.set('Options_Draw', 'E_Color', '#0080FF') + self.config.set('Options_Draw', 'N_Color', '#0080FF') + self.config.set('Options_Draw', 'U_Color', '#0080FF') + self.config.set('Options_Draw', 'E_Line', '0.80') + self.config.set('Options_Draw', 'N_Line', '0.80') + self.config.set('Options_Draw', 'U_Line', '0.80') + self.config.set('Options_Draw', 'Sat_Amount_Color', '#0080FF') + ### Config for input path + self.config.add_section('Input_Obs_Path') + self.config.set('Input_Obs_Path', '0', '') + self.config.add_section('Input_Nav_Path') + self.config.set('Input_Nav_Path', '0', '') + ### Config for output path + self.config.add_section('Output_Path') + self.config.set('Output_Path','0','') + + with open(self.config_filepath, 'w') as configfile: + self.config.write(configfile) + return + + def save_config(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + with open(self.config_filepath, 'w') as configfile: + self.config.write(configfile) + + + + + + + + + + + diff --git a/app/Func_callback.py b/app/Func_callback.py new file mode 100644 index 0000000..f72a5d5 --- /dev/null +++ b/app/Func_callback.py @@ -0,0 +1,359 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Std +import threading + +import ctypes as ct +import tkinter as tk + +from tkinter import filedialog +from tkinter import colorchooser + +class CALLBACK: + def __init__(self, cfg, cfg_get): + self.cfg = cfg + self.cfg_get = cfg_get + + self.system = {1:'G',2:'C',3:'E',4:'R',5:'S'} + self.ioncormode = {'OFF':'0', 'Ion-Free LC':'1', 'Broadcast':'2'} + self.trocormode = {'OFF':'0', 'Hopfield':'1', 'Saastamoinen':'2'} + + self.colorvalue = [ + self.cfg_get['Options_Draw']['e_color'], + self.cfg_get['Options_Draw']['n_color'], + self.cfg_get['Options_Draw']['u_color'], + self.cfg_get['Options_Draw']['sat_amount_color'] + ] + self.linewidth = [ + self.cfg_get['Options_Draw']['e_line'], + self.cfg_get['Options_Draw']['n_line'], + self.cfg_get['Options_Draw']['u_line'] + ] + + self.obsvar = ('',) + self.navvar = ('',) + self.outvar = ('',) + + self.outdir = dict(self.cfg_get.items('Output_Path')) + self.obspath = dict(self.cfg_get.items('Input_Obs_Path')) + self.navpath = dict(self.cfg_get.items('Input_Nav_Path')) + + for i in self.obspath: + if self.obspath.get(i): + self.obsvar += (self.obspath.get(i),) + + for i in self.navpath: + if self.navpath.get(i): + self.navvar += (self.navpath.get(i),) + + for i in self.outdir: + if self.outdir.get(i): + self.outvar += (self.outdir.get(i),) + + @staticmethod + def Move_center(hwnd, win_x, win_y): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # + # + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + position_x = int((hwnd.winfo_screenwidth() - win_x) / 2) + position_y = int((hwnd.winfo_screenheight() - win_y) / 2) + hwnd.geometry(f'{win_x}x{win_y}+{position_x}+{position_y}') + + def Calcuconfirm(self, cionbox, ctrobox, canglebox, systemv): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # + # + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + + self.cfg_get.set('Options_Calc', 'Iono_model', self.ioncormode.get(cionbox.get())) + self.cfg_get.set('Options_Calc', 'Trop_model', self.trocormode.get(ctrobox.get())) + self.cfg_get.set('Options_Calc', 'Elev_angle', canglebox.get()) + self.cfg_get.set('Options_Calc', 'Sat_system', str(systemv.get())) + self.cfg.save_config() + + def Colorchoose(self, hwndparent, i, colorlab, mode): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : hwndparent : + # i : 0==e & 1==n & 2==u & 3==satn + # colorlab : + # mode : + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + match mode: + case 0: + if not i==3: + self.colorvalue = [ + self.cfg_get['Options_Draw']['e_color'], + self.cfg_get['Options_Draw']['n_color'], + self.cfg_get['Options_Draw']['u_color'], + self.colorvalue[3] + ] + colorlab.config(bg=self.colorvalue[i]) + else: + self.colorvalue = [ + self.colorvalue[0], + self.colorvalue[1], + self.colorvalue[2], + self.cfg_get['Options_Draw']['sat_amount_color'] + ] + colorlab.config(bg=self.colorvalue[i]) + case 1: + colorvalue = tk.colorchooser.askcolor(parent=hwndparent) + if colorvalue[1]: + self.colorvalue[i] = str(colorvalue[1]) + colorlab.config(bg=self.colorvalue[i]) + case 2: + self.cfg_get.set('Options_Draw', 'E_Color', str(self.colorvalue[0])) + self.cfg_get.set('Options_Draw', 'N_Color', str(self.colorvalue[1])) + self.cfg_get.set('Options_Draw', 'U_Color', str(self.colorvalue[2])) + self.cfg_get.set('Options_Draw', 'Sat_Amount_Color', str(self.colorvalue[3])) + self.cfg.save_config() + + def Linewchoose(self, entry0, entry1, entry2, mode): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : entry0 : spinbox handle + # entry1 : spinbox handle + # entry2 : spinbox handle + # mode : 0==undo & 1==confirm + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + match mode: + case 0: + entry0.set(self.cfg_get['Options_Draw']['e_line']) + entry1.set(self.cfg_get['Options_Draw']['n_line']) + entry2.set(self.cfg_get['Options_Draw']['u_line']) + case 1: + self.cfg_get.set('Options_Draw', 'E_Line', str(entry0.get())) + self.cfg_get.set('Options_Draw', 'N_Line', str(entry1.get())) + self.cfg_get.set('Options_Draw', 'U_Line', str(entry2.get())) + self.cfg.save_config() + + def Dir_or_name_get(self, path, mode): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : path : + # mode : 0==get file name & 1==get file dir + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + global nameend, filename, filedir + match mode: + case 0: + path_len = len(path) + while path_len > 0: + sig = path[path_len - 1:path_len] + if sig == '.': + nameend = path_len + if sig == '\\' or sig == '/': + filename = path[path_len:nameend] + return filename + path_len -= 1 + + + case 1: + path_len = len(path) + while path_len > 0: + sig = path[path_len - 1:path_len] + if sig == '\\' or sig == '/': + filedir = path[:path_len] + return filedir + path_len -= 1 + + def GetObsFilePath(self, hwndparent, ObsFileSelectBox): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + path = filedialog.askopenfilename( + parent=hwndparent, + title='RINEX OBS File', + filetypes=[('RINEX OBS File(*.o*.*.*obs.*.*d)', '*.*o;*.*obs;*.*d'), + ('All Files', '*.*')] + ) + if path and path not in ObsFileSelectBox['value']: + ObsFileSelectBox['value'] += (path,) + ObsFileSelectBox.current(len(ObsFileSelectBox['value']) - 1) + self.obsvar += (path,) + self.cfg_get.set('Input_Obs_Path', '%s' + % str(len(ObsFileSelectBox['value']) - 1), + path) + self.cfg.save_config() + + def GetNavFilePath(self, hwndparent, NavFileSelectBox): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + path = filedialog.askopenfilename( + parent=hwndparent, + title='RINEX NAV File', + filetypes=[('RINEX NAV File(*.*nav.*.hnav.*.gnav.*.qnav.*.*n.*.*g.*.*h.*.*q.*.*p)', + '*.*nav;*.hnav;*.gnav;*.qnav;*.*n;*.*g;*.*h;*.*q;*.*p'), + ('All Files', '*.*')] + ) + if path and path not in NavFileSelectBox['value']: + NavFileSelectBox['value'] += (path,) + NavFileSelectBox.current(len(NavFileSelectBox['value']) - 1) + self.navvar += (path,) + self.cfg_get.set('Input_Nav_Path', '%s' + % str(len(NavFileSelectBox['value']) - 1), + path) + self.cfg.save_config() + + def AskDirectory(self, hwndparent, AskDirectorySelectBox): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + path = filedialog.askdirectory(parent=hwndparent) + if path and path not in AskDirectorySelectBox['value']: + AskDirectorySelectBox['value'] += (path + '/*.sp',) + AskDirectorySelectBox.current(len(AskDirectorySelectBox['value']) - 1) + self.outvar += (path + '/*.sp',) + self.cfg_get.set('Output_Path', '%s' + % str(len(AskDirectorySelectBox['value']) - 1), + path + '/*.sp') + self.cfg.save_config() + + def AskOrNotCheck(self, + AskOrNotCheckVar, + AskDirectorySelectBox, + AskDirectorySelectButton): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + if AskOrNotCheckVar.get() == 0: + AskDirectorySelectBox.config(state=tk.DISABLED) + AskDirectorySelectButton.config(state=tk.DISABLED) + else: + AskDirectorySelectBox.config(state=tk.NORMAL) + AskDirectorySelectButton.config(state=tk.NORMAL) + + def ExecuteFile(self, + ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Param : + # + # Return: + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + statemsg = "" + state3 = ["","",""] + if not ObsSelectBoxVar.get(): + state3[0] = " obs file." + if not NavSelectBoxVar.get(): + state3[1] = " nav file." + if not DirectorySelectBoxVar.get(): + if AskOrNotCheckVar.get(): + state3[2] = " solution directory." + for state in state3: + statemsg += state + if statemsg: + ExecuteState.config(text='No file: %s !'%statemsg) + return 0 + + obspath = ObsSelectBoxVar.get() + navpath = NavSelectBoxVar.get() + directory = obspath + if AskOrNotCheckVar.get(): + directory = DirectorySelectBoxVar.get() + + directory = self.Dir_or_name_get(directory, 1) + syssign = self.system.get(int(self.cfg_get['Options_Calc']['sat_system'])) + resname = syssign + '-' + self.Dir_or_name_get(obspath,0) + 'sp' + respath = (directory + resname) + + ExecuteState.config(text='Processing...... file : %s' %resname) + + dll = ct.cdll.LoadLibrary('./brdm2pos.dll') + dll.brdm2pos.restype = ct.c_double + match dll.brdm2pos( + navpath.encode(), + obspath.encode(), + respath.encode(), + int(self.cfg_get['Options_Calc']['sat_system']), + int(self.cfg_get['Options_Calc']['elev_angle']) + ): + case 0.0: + ExecuteState.config(text='Generated successfully ! file : %s' %resname) + case -1.0: + ExecuteState.config(text='Error ! cant open nav file') + case -2.0: + ExecuteState.config(text='Error ! cant open obs file') + case -3.0: + ExecuteState.config(text='Error ! unsupported nav file') + case -4.0: + ExecuteState.config(text='Error ! no nav data') + case -5.0: + ExecuteState.config(text='Error ! unsupported obs file') + case -6.0: + ExecuteState.config(text='Error ! no obs data') + ct.windll.kernel32.FreeLibrary('./brdm2pos.dll') + + def _ExecuteFile(self,ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar): + T = threading.Thread(target=lambda: self.ExecuteFile(ExecuteState, + ObsSelectBoxVar, + NavSelectBoxVar, + AskOrNotCheckVar, + DirectorySelectBoxVar)) + T.start() \ No newline at end of file diff --git a/app/Ui_about.py b/app/Ui_about.py new file mode 100644 index 0000000..e7163d6 --- /dev/null +++ b/app/Ui_about.py @@ -0,0 +1,39 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Std +import tkinter as tk + +class ABODUI: + def __init__(self, hwndparent, cfg_get): + # init + # ------------------------------------------------------------------------------- + self.cfg_get = cfg_get + self.hwndparent = hwndparent + + self.initGUI() + + def initGUI(self): + abo = tk.Toplevel(self.hwndparent) + abo.title("About") + abo.attributes('-toolwindow', 2) + self.func.Move_center(abo, 200, 100) + abo.minsize(200, 100) + abo.maxsize(200, 100) + + About = tk.Label(abo, + text="\nKNZ_GeoTrackLab %s" + "\n" + "\nCopyright (c) 2024 by KenanZhu" + "\nAll Right Reserved." + % self.cfg_get['INFO']['Version'] + ) + About.pack(side=tk.TOP, expand=tk.YES) \ No newline at end of file diff --git a/app/Ui_main.py b/app/Ui_main.py new file mode 100644 index 0000000..5dc2fff --- /dev/null +++ b/app/Ui_main.py @@ -0,0 +1,477 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Self +import Ui_view as vie +import Ui_about as abo +import Ui_options as opt +import Ui_processor as pro +import Config_file as config +import Func_callback as func + +### Std +from tkinter import ttk +from PIL import ImageTk +from base64 import b64decode +from matplotlib.backends.backend_tkagg import ( + FigureCanvasTkAgg, NavigationToolbar2Tk) + +import tkinter as tk +import tkinter.font as tkfont +import matplotlib as mpl +mpl.use('TkAgg') +import matplotlib.pyplot as plt + +def instanceOPT(hwndparent, cfg_get_, func_): + opt.OPTGUI(hwndparent, cfg_get_, func_) + +def instancePRO(hwndparent, cfg_get_, func_): + pro.EXECUDUI(hwndparent, cfg_get_, func_) + +def instanceVIE(hwndparent, func_): + vie.VIEWGUI(hwndparent, func_) + +def instanceABO(hwndparemt, cfg_get_): + abo.ABODUI(hwndparemt, cfg_get_) + +class MAINGUI: + def __init__(self, hwnd_, func_): + # init + # ------------------------------------------------------------------------------- + self.func = func_ + self.hwnd = hwnd_ + + self.ux = None + self.nx = None + self.ex = None + + self.satn = None + self.satvisb = None + self.sattrack = None + + self.canvas1 = None + self.canvas0 = None + self.canvas2 = None + + self.Drawcards = None + self.Figurefrm_Sky = None + self.Figurefrm_Vis = None + self.Figurefrm_ENU = None + + self.lastx = None + self.lasty = None + self.press = None + + self.plotstate = None + + self.initGUI() + + def initGUI(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + ### Set size + self.hwnd.title( + "KNZ_GeoTrackLab %s" + %cfg_get['INFO']['Version'] + ) + self.func.Move_center(hwnd,1200,700) + self.hwnd.minsize(1200, 700) + ### Set icon + icon_ico = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4xMTGQMDAwKgAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTE0MjIy7jMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8QMTExSAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAMTExNDIyMu4zMzP/MzMz/zMzM/8zMzPrMDAwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vEDIyMsoyMjLKAAAAAAAAAAAAAAAAAAAAADExMTQyMjLuMzMz/zIy' + b'MvsxMTGaMjIy/TMzM/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAyMjJRMjIy3TExMbgyMjLKMzMz/zIyMtkAAAAAMDAwOioqKgYAAAAAMTExszMzM/8yMjL7MDAwWQAAAAAxMTFhMjIy/TMz' + b'M/8zMzPrMTExLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMt0zMzP/MzMz/zMz' + b'M/8zMzP/MTExrjExMU0yMjL4MTExsyoqKgYqKioMMjIyvzAwMFkAAAAAAAAAAAAAAAAxMTFhMjIy/TMzM/8zMzPrMTExLgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExuDMzM/8zMzP/MzMz/zMzM/8xMTGaMjIy+DMz' + b'M/8zMzP/MTExsyoqKgYAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTFhMjIy/jMzM/8yMjLfAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8vLxAyMjLKMzMz/zMzM/8zMzP/MzMz9TIyMvkzMzP/MzMz/zMzM/8zMzP/MTExsyoq' + b'KgYAAAAAAAAAAAAAAAAAAAAAAAAAADExMY8zMzP/MzMz/zMzM8gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAvLy8QMjIyyjMzM/8zMzP/MzMz/zMzM/UyMjL+MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAAAAAAAAA' + b'AAAxMTGPMzMz/zMzM/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMUgyMjLKMjIy2DEx' + b'Ma4xMTGaMjIy+TMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYAAAAAMTExbDMzM/8zMzP/MjIy0zAw' + b'MBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTTIyMvgzMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMzMzwzIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDoyMjL4MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MTExsyoqKgYqKioMMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MTExsyoqKgYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIyfgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExNDExMbMqKioMKioqBjIy' + b'MrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8xMTGUAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDUyMjLvMzMz/zIyMsAAAAABKioqBjIyMrIzMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/MjIy3i0tLRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAwMDA1MjIy7zMzM/8yMjL7MDAwWQAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMz' + b'M/8zMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwLzIy' + b'Mu8zMzP/MjIy+zAwMFkAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MzMz/zMzM/8yMjLeMzMzHgAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTGQMzMz/zMzM/8zMzObAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAKioqBjIyMrIzMzP/MzMz/zMzM/8zMzP/MjIy3jMzMx4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMSkzMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAAAAAAAAAAADEx' + b'MWwqKioMKioqBjIyMrIzMzP/MzMz/zIyMt4zMzMeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiAAAAAAAAAAAxMTGQMzMz/zMzM8MqKioMKioqBjIy' + b'Mn4xMTGULy8vGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAADExMS4zMzPrMzMz/zIyMv0xMTFiMTExkDMzM/8zMzP/MjIy0zAwMBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEx' + b'MS4zMzPrMzMz/zIyMv4zMzP/MzMz/zIyMtMwMDAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4zMzPrMzMz/zMz' + b'M/8yMjLTMDAwFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMS4yMjLfMTExxzAwMBUAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////' + b'/////////////////x////4P//58B//8eAP/4EhB/+AA4P/gAfD/wAHw/4AA4P+AAEH/8AAD/+AAB//gAA//8AAP/8AAD/+A' + b'AA//BgAf/g8AP/4fgH/+DwD//wYB//+AH///wD///+B////w//8=') + icon_ico = b64decode(icon_ico) + icon_ico = ImageTk.PhotoImage(data=icon_ico) + self.hwnd.tk.call('wm', 'iconphoto', self.hwnd._w, icon_ico) + ### Set front + default_font = tkfont.nametofont("TkDefaultFont") + default_font.configure(family="Segoe UI", size=9) + ### Top tool + self.initTOPMENU() + ### Plot area + self.initPLOT() + ### State bar + self.initSTATE_BAR() + ### Quit event & mainloop start + self.hwnd.protocol("WM_DELETE_WINDOW", self.hwnd.quit) + self.hwnd.mainloop() + + def initTOPMENU(self): + # ------------------------------------------------------------------------------- + # Class : + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + topmenu = tk.Menu(self.hwnd) + ### File + filemenu = tk.Menu(topmenu, tearoff=False) + ### File > Open... + openmenu = tk.Menu(filemenu, tearoff=False) + ### File > Open... > Open Pos Solution + openmenu.add_command( + label="Open Pos Solution", + accelerator='Ctrl+S' + ) + ### File > Open... > Open Sat Solution + openmenu.add_command( + label="Open Sat Solution", + accelerator='Ctrl+S' + ) + ### File > Open... > Open RINEX + openmenu.add_command( + label="Open RINEX", + command=lambda :instancePRO(hwnd, cfg_get, self.func), + accelerator='Ctrl+P' + ) + filemenu.add_cascade(label="Open...", menu=openmenu) + ### File > Clesr + filemenu.add_command( + label="Clear", + command=self.Clear_canvas + ) + ### File > View + filemenu.add_command( + label="View", + command=lambda :instanceVIE(self.hwnd, self.func) + ) + ### File > Exit + filemenu.add_command( + label="Exit", + command=self.hwnd.quit, + accelerator='Ctrl+E' + ) + topmenu.add_cascade(label="File", menu=filemenu) + + ### Options + optmenu = tk.Menu(topmenu, tearoff=False) + ### Options > Options... + optmenu.add_command( + label="Options...", + command=lambda :instanceOPT(self.hwnd,cfg_get,self.func) + ) + topmenu.add_cascade( + label="Options", + menu=optmenu + ) + + ### Help + helpmenu = tk.Menu(topmenu, tearoff=False) + ### Help > About + helpmenu.add_command( + label="About", + command=lambda :instanceABO(self.hwnd, cfg_get) + ) + topmenu.add_cascade(label="Help", menu=helpmenu) + + self.hwnd.config(menu=topmenu) + + def initPLOT(self): + # ------------------------------------------------------------------------------- + # > + # Method: initPLOT + # Brief : Initializes the drawing area of the main ui + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.Drawcards = ttk.Notebook(self.hwnd) + # E-N-U Plot area + # ------------------------------------------------------------------------------- + self.PLOT_ENU() + self.Drawcards.add(self.Figurefrm_ENU, text='ENU-Draw') + # Valid Satellite Amout area + # ------------------------------------------------------------------------------- + self.PLOT_VIS() + self.Drawcards.add(self.Figurefrm_Vis, text='Sat Number') + # Sky Track Plot area + # ------------------------------------------------------------------------------- + self.PLOT_SKY() + self.Drawcards.add(self.Figurefrm_Sky, text='Sat Track') + self.Drawcards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + + def PLOT_ENU(self): + # ------------------------------------------------------------------------------- + # > + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.Figurefrm_ENU = tk.Frame(self.hwnd) + self.Figurefrm_ENU.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + plt.rc('font', family='Segoe UI') + plt.rcParams['xtick.direction'] = 'in' + plt.rcParams['ytick.direction'] = 'in' + fig, (self.ex, self.nx, self.ux) = plt.subplots( + 3, + 1, + figsize=(10, 0), + sharex=True + ) + for spine in ['right', 'left']: + self.ex.spines[spine].set_visible(False) + self.ex.set_facecolor('#f5f5f5') + for spine in ['right', 'left']: + self.nx.spines[spine].set_visible(False) + self.nx.set_facecolor('#f5f5f5') + + for spine in ['right', 'left']: + self.ux.spines[spine].set_visible(False) + self.ux.set_facecolor('#f5f5f5') + fig.subplots_adjust( + left=0, + bottom=0.040, + right=1, + top=1, + hspace=0.0 + ) + self.canvas0 = FigureCanvasTkAgg(fig, self.Figurefrm_ENU) + self.canvas0.draw() + self.canvas0.get_tk_widget().pack( side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + toolbar0 = NavigationToolbar2Tk(self.canvas0, self.Figurefrm_ENU, pack_toolbar=False) + toolbar0.update() + toolbar0.pack(side=tk.LEFT) + ### Call back event + self.canvas0.mpl_connect("button_press_event",self.On_press) + self.canvas0.mpl_connect("button_release_event",self.On_release) + self.canvas0.mpl_connect("motion_notify_event",self.On_move) + self.canvas0.mpl_connect('scroll_event',self.On_scaleing) + + def PLOT_VIS(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.Figurefrm_Vis = tk.Frame(self.hwnd) + self.Figurefrm_Vis.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + plt.rc('font', family='Segoe UI') + plt.rcParams['xtick.direction'] = 'in' + plt.rcParams['ytick.direction'] = 'in' + fig, (self.satn, self.satvisb) = plt.subplots( + 2, + 1, + figsize=(10, 0), + sharex=True + ) + fig.subplots_adjust( + left=0, + bottom=0.045, + right=1, + top=0.95, + hspace=0.0 + ) + for spine in ['right', 'left']: + self.satn.spines[spine].set_visible(False) + self.satn.set_facecolor('#f5f5f5') + for spine in ['right', 'left']: + self.satvisb.spines[spine].set_visible(False) + self.satvisb.set_facecolor('#f5f5f5') + + self.canvas1 = FigureCanvasTkAgg(fig, self.Figurefrm_Vis) + self.canvas1.draw() + self.canvas1.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + toolbar1 = NavigationToolbar2Tk(self.canvas1, self.Figurefrm_Vis, pack_toolbar=False) + toolbar1.update() + toolbar1.pack(side=tk.LEFT) + + def PLOT_SKY(self): + # ------------------------------------------------------------------------------- + # > + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.Figurefrm_Sky = tk.Frame(self.hwnd) + self.Figurefrm_Sky.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + + plt.rc('font', family='Segoe UI') + fig = plt.figure() + self.sattrack = fig.add_subplot(projection='polar') + fig.subplots_adjust( + left=0, + bottom=0.03, + right=1, + top=0.95 + ) + self.canvas2 = FigureCanvasTkAgg(fig, self.Figurefrm_Sky) + self.canvas2.draw() + self.canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=tk.YES) + toolbar2 = NavigationToolbar2Tk(self.canvas2, self.Figurefrm_Sky, pack_toolbar=False) + toolbar2.update() + toolbar2.pack(side=tk.TOP, anchor='w') + + def initSTATE_BAR(self): + stateframe = tk.Frame(self.hwnd) + stateframe.pack(side=tk.BOTTOM, fill=tk.X) + self.plotstate = ttk.Label(stateframe, text="None") + self.plotstate.pack(side=tk.LEFT, anchor='w') + + def On_press(self, event): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + if event.inaxes: + if event.button == 1: + self.press = True + self.lastx = event.xdata + self.lasty = event.ydata + + def On_move(self, event): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + axtemp = event.inaxes + if axtemp: + if self.press: + x = event.xdata - self.lastx + y = event.ydata - self.lasty + x_min, x_max = axtemp.get_xlim() + y_min, y_max = axtemp.get_ylim() + x_min = x_min - x + x_max = x_max - x + y_min = y_min - y + y_max = y_max - y + axtemp.set_xlim(x_min, x_max) + axtemp.set_ylim(y_min, y_max) + self.canvas0.draw() + + def On_release(self, event): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + if self.press: + self.press = False + + def On_scaleing(self, event): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + axtemp = event.inaxes + y_min, y_max = axtemp.get_ylim() + scaley = (y_max - y_min) / 10 + if event.button == 'up': + axtemp.set(ylim=(y_min + scaley, y_max - scaley)) + elif event.button == 'down': + axtemp.set(ylim=(y_min - scaley, y_max + scaley)) + self.canvas0.draw_idle() + + def Clear_canvas(self): + # ------------------------------------------------------------------------------- + # > + # Method: Clear_canvas + # Brief : clear the canvas + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.ex.clear() + self.nx.clear() + self.ux.clear() + self.satn.clear() + self.satvisb.clear() + self.sattrack.clear() + self.canvas0.draw() + self.canvas1.draw() + self.canvas2.draw() + self.plotstate.config(text="None") + self.hwnd.update() + +if __name__ == "__main__": + + ### LOad Config + cfg = config.Configinit('config.ini') + cfg.load_config() + cfg_get = cfg.get_config() + + ### Call Back Process + func = func.CALLBACK(cfg, cfg_get) + + ### Main Window + hwnd = tk.Tk() + mainui = MAINGUI(hwnd, func) + + diff --git a/app/Ui_options.py b/app/Ui_options.py new file mode 100644 index 0000000..65111d8 --- /dev/null +++ b/app/Ui_options.py @@ -0,0 +1,512 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Std +from PIL import ImageTk +from tkinter import ttk +from base64 import b64decode + +import tkinter as tk + +class OPTGUI: + def __init__( + self, + hwndparent, + cfg_get, + func + ): + # init + # ------------------------------------------------------------------------------- + self.func = func + self.cfg_get = cfg_get + self.hwndparent = hwndparent + + self.PlotFrame = None + self.CalcuFrame = None + + self.systemv = None + self.ctrobox = None + self.cionbox = None + self.opthwnd = None + self.canglebox = None + self.angleentry = None + + self.ulinewidth = None + self.nlinewidth = None + self.elinewidth = None + + self.initGUI() + + def initGUI(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + ### Set size + self.opthwnd = tk.Toplevel(self.hwndparent) + self.opthwnd.title("Options") + self.opthwnd.resizable(0,0) + self.func.Move_center(self.opthwnd,320,250) + self.opthwnd.minsize(320,250) + self.opthwnd.maxsize(320,250) + ### Set icon + icon_ico = (b'AAABAAEAICAAAAAAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'ABAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAABIAAAASAAAACQAAAAAAAAACAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAABwAAAJAAAADqAAAA7gAAAO4AAADqAAAAk' + b'QAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAACQAAAA/wAAAPw' + b'AAAD/AAAA/wAAAPwAAAD/AAAAkAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAADAAAAAQAAAAEAAAAAA' + b'AAACwAAAOMAAAD/AAAA/AAAAP4AAAD+AAAA/AAAAP8AAADjAAAACgAAAAAAAAABAAAAAQAAAAMA' + b'AAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAA' + b'AAAAAAAABAAAABQAAAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAA' + b'AAAAAAAAUAAAABAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AABAAAAAAAAABEAAABTAAAAUQAAAA8AAAAAAAAAAAAAAEQAAAD/AAAA/gAAAP8AAAD/AAAA/wAA' + b'AP8AAAD+AAAA/wAAAEQAAAAAAAAAAAAAAA8AAABRAAAAUwAAABEAAAAAAAAAAQAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAgAAAAAAAAAwAAAA5QAAAP8AAAD/AAAA4QAAAHYAAAB2AAAA6QAAAP8AAA' + b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA6QAAAHYAAAB1AAAA4QAAAP8AAAD/AAAA5QAAA' + b'DAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMoAAAD/AAAA+gAAAPwAAAD/AAAA' + b'/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD' + b'/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAwAAAAAAAABrAAAA/wAAAP' + b'oAAAD/AAAA/wAAAP0AAAD7AAAA+wAAAP4AAAD/AAAA/AAAAP0AAAD/AAAA/wAAAP0AAAD8AAAA/' + b'wAAAP4AAAD7AAAA+wAAAP0AAAD/AAAA/wAAAPoAAAD/AAAAawAAAAAAAAADAAAAAAAAAAEAAAAA' + b'AAAAAwAAANUAAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA/wAAAPI' + b'AAADyAAAA/wAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAP8AAADVAAAAAw' + b'AAAAAAAAABAAAAAQAAAAAAAAATAAAA7AAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9A' + b'AAA/wAAAK8AAAA8AAAAFQAAABUAAAA8AAAArgAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8A' + b'AAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAAAAAAAAQAAAAAAAADBAAAA/wAAAPoAAAD/AAAA/wA' + b'AAP8AAAD/AAAA/QAAAP8AAAB3AAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAAdwAAAP8AAAD9AA' + b'AA/wAAAP8AAAD/AAAA/wAAAPoAAAD/AAAAwQAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAADEAA' + b'ADmAAAA/wAAAP0AAAD/AAAA/wAAAPwAAAD/AAAAqwAAAAAAAAAEAAAAAwAAAAEAAAABAAAABAAA' + b'AAQAAAAAAAAArAAAAP8AAAD8AAAA/wAAAP8AAAD9AAAA/wAAAOYAAAAwAAAAAAAAAAIAAAAAAAA' + b'AAAAAAAAAAAABAAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACvAAAADQAAA' + b'AAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAAD4AAAA/wAAAP0AAAD/AAAA' + b'8gAAABgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABgAAADyAAAA/wAAAP0AAAD' + b'/AAAA+AAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAIAAAAP' + b'gAAAD/AAAA/QAAAP8AAADyAAAAGAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAG' + b'AAAAPIAAAD/AAAA/QAAAP8AAAD4AAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB' + b'AAAAAAAAAA0AAACuAAAA/wAAAP0AAAD/AAAA/QAAAP8AAABCAAAAAAAAAAMAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAwAAAAAAAABCAAAA/wAAAP0AAAD/AAAA/QAAAP8AAACuAAAADQAAAAAAAAABAAAAAA' + b'AAAAAAAAAAAAAAAgAAAAAAAAAxAAAA5gAAAP8AAAD9AAAA/wAAAP8AAAD8AAAA/wAAAKsAAAAAA' + b'AAABAAAAAMAAAABAAAAAQAAAAMAAAAEAAAAAAAAAKsAAAD/AAAA/AAAAP8AAAD/AAAA/QAAAP8A' + b'AADmAAAAMAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAAMEAAAD/AAAA+gAAAP8AAAD/AAAA/wA' + b'AAP8AAAD9AAAA/wAAAHcAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAAB3AAAA/wAAAP0AAAD/AA' + b'AA/wAAAP8AAAD/AAAA+gAAAP8AAADBAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAATAAAA7AAAAP8AA' + b'AD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAK4AAAA8AAAAFQAAABUAAAA8AAAArgAA' + b'AP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAA/wAAAOwAAAATAAAAAAAAAAEAAAABAAA' + b'AAAAAAAMAAADWAAAA/wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD9AAAA/wAAAP8AAA' + b'DyAAAA8gAAAP8AAAD/AAAA/QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA1QAAA' + b'AMAAAAAAAAAAQAAAAAAAAADAAAAAAAAAGsAAAD/AAAA+gAAAP8AAAD/AAAA/QAAAPsAAAD7AAAA' + b'/gAAAP8AAAD8AAAA/QAAAP8AAAD/AAAA/QAAAPwAAAD/AAAA/gAAAPsAAAD7AAAA/QAAAP8AAAD' + b'/AAAA+gAAAP8AAABrAAAAAAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAAAwAAAMsAAAD/AAAA+gAAAP' + b'wAAAD/AAAA/wAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/gAAAP4AAAD/AAAA/wAAAP8AAAD+AAAA/' + b'wAAAP8AAAD/AAAA/AAAAPoAAAD/AAAAywAAAAMAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAA' + b'AAAAMQAAAOYAAAD/AAAA/wAAAOEAAAB2AAAAdgAAAOkAAAD/AAAA/gAAAP8AAAD/AAAA/wAAAP8' + b'AAAD+AAAA/wAAAOkAAAB2AAAAdgAAAOEAAAD/AAAA/wAAAOYAAAAxAAAAAAAAAAIAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAFQAAABRAAAADwAAAAAAAAAAAAAARAAAAP8AAAD+A' + b'AAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAARAAAAAAAAAAAAAAADwAAAFEAAABUAAAAEQAAAAAA' + b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAABAAAABQA' + b'AAAAAAAATAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD+AAAA/wAAAO0AAAATAAAAAAAAAAUAAAABAA' + b'AAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' + b'AAEAAAABAAAAAEAAAABAAAAAAAAAAsAAADjAAAA/wAAAPwAAAD+AAAA/gAAAPwAAAD/AAAA4wAA' + b'AAoAAAAAAAAAAQAAAAEAAAAEAAAABAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAAJAAAAD/AAAA/AAAAP8AAA' + b'D/AAAA/AAAAP8AAACQAAAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAA' + b'BwAAAJAAAADqAAAA7gAAAO4AAADqAAAAkQAAAAcAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAkAAAASAAAAEgAAAAoAAAAAAAAAAgAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAM' + b'AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9GL//' + b'+kJf//kAn//5AJ/+ggBBfTIATLqCAEFZAAAAkgAAAEIAAABEAAAAJAAAACIAQgBKAIEAVQClAKq' + b'AmQFagJkBVQClAKoAgQBSAEIARAAAACQAAAAiAAAAQgAAAEkAAACaggBBXTIATL6CAEF/+QCf//' + b'kAn//6Ql///Ri/8=') + icon_ico = b64decode(icon_ico) + icon_ico = ImageTk.PhotoImage(data=icon_ico) + self.opthwnd.tk.call('wm', 'iconphoto', self.opthwnd._w, icon_ico) + ### Main window + self.initOPTION() + self.initCONFIRM() + + def initOPTION(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + Optionscards = tk.ttk.Notebook(self.opthwnd) + + # Calcu options card + # ------------------------------------------------------------------------------- + self.initCARDCALCU() + Optionscards.add(self.CalcuFrame, text='Calc options') + # Plot options card + # ------------------------------------------------------------------------------- + + self.initCARDDRAW() + Optionscards.add(self.PlotFrame, text='Draw options') + Optionscards.pack(fill=tk.BOTH, expand=True, padx='2px', pady='0px') + + def initCARDCALCU(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.CalcuFrame = tk.Frame(self.opthwnd) + # Iono option frame + # ------------------------------------------------------------------------------- + self.IONOOPT() + # Trop option frame + # ------------------------------------------------------------------------------- + self.TROPOPT() + # Elev option frame + # ------------------------------------------------------------------------------- + self.HANGOPT() + # Syst option frame + # ------------------------------------------------------------------------------- + self.SYSOPT() + + def IONOOPT(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # ION correction frame# + IonoFrame = ttk.Frame(self.CalcuFrame) + IonoFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + ioncor = ttk.Label(IonoFrame, text='Ionosphere Correction') + ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') + + self.cionbox = ttk.Combobox(IonoFrame, width=15, height=4) + self.cionbox['state'] = 'readonly' + self.cionbox['value'] = ('OFF', 'Ion-Free LC', 'Broadcast') + self.cionbox.current(self.cfg_get['Options_Calc']['iono_model']) + self.cionbox.pack(side=tk.RIGHT, anchor='e') + + def TROPOPT(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # TRO correction frame# + TropFrame = ttk.Frame(self.CalcuFrame) + TropFrame.pack( side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + ioncor = ttk.Label(TropFrame, text='Troposphere Correction') + ioncor.pack(side=tk.LEFT, anchor='w', padx='1px') + + self.ctrobox = ttk.Combobox(TropFrame, width=15, height=4) + self.ctrobox['state'] = 'readonly' + self.ctrobox['value'] = ('OFF', 'Hopfield', 'Saastamoinen') + self.ctrobox.current(self.cfg_get['Options_Calc']['trop_model']) + self.ctrobox.pack(side=tk.RIGHT, anchor='e') + + def HANGOPT(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # Angle of elevation frame + SatElevFrame = ttk.Frame(self.CalcuFrame) + SatElevFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + h_angle = ttk.Label(SatElevFrame, text='Satellite Elevation(°) / #') + h_angle.pack(side=tk.LEFT, anchor='w', padx='1px') + + self.angleentry = ttk.Entry(SatElevFrame, width=8) + self.angleentry.pack(side=tk.RIGHT, anchor='w') + + self.canglebox = ttk.Combobox(SatElevFrame, width=6, height=10) + self.canglebox['state'] = 'readonly' + self.canglebox['value'] = ( + '00', '05', '10', '15', + '20', '25', '30', '35', + '40', '45', '50', '55',) + pos = int(self.cfg_get['Options_Calc']['elev_angle'])/5 + self.canglebox.current(int(pos)) + self.canglebox.pack(side=tk.RIGHT,anchor='e') + + def SYSOPT(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # GNSS Options + SystemFrame = ttk.LabelFrame(self.CalcuFrame, text='Satellite system', labelanchor='nw') + SystemFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='2px', fill=tk.X) + + satsys = [("GPS", 1), ("GLO", 4), ("BeiDou", 2), ("Galileo", 3), ("SBAS", 5)] + self.systemv = tk.IntVar() + for sys, num in satsys: + + radio_button = ttk.Radiobutton(SystemFrame, text=sys, variable=self.systemv, value=num) + radio_button.pack(side=tk.LEFT, padx='3px', anchor='w') + + self.systemv.set(self.cfg_get['Options_Calc']['sat_system']) + + def initCARDDRAW(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.PlotFrame = tk.Frame(self.opthwnd) + + self.initDRAWCOLOR() + self.initDRAWLINE() + + def initDRAWLINE(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # Line's weight options# + LineoptFrame = ttk.LabelFrame(self.PlotFrame, text='Draw configs', labelanchor='nw') + LineoptFrame.pack(side=tk.RIGHT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) + + EFrame = tk.Frame(LineoptFrame) + EFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + elinewopt = tk.Label( + EFrame, + text='Eline:', + width=5, + height=1 + ) + elinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.elinewidth = ttk.Spinbox( + EFrame, + from_=0, + to=10, + increment=0.01, + width=10 + ) + self.elinewidth.set(self.cfg_get['Options_Draw']['e_line']) + self.elinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + NFrame = tk.Frame(LineoptFrame) + NFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + nlinewopt = tk.Label( + NFrame, + text='Nline:', + width=5, + height=1 + ) + nlinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.nlinewidth = ttk.Spinbox( + NFrame, + from_=0, + to=10, + increment=0.01, + width=10 + ) + self.nlinewidth.set(self.cfg_get['Options_Draw']['n_line']) + self.nlinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + UFrame = tk.Frame(LineoptFrame) + UFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ulinewopt = tk.Label( + UFrame, + text='Uline:', + width=5, + height=1 + ) + ulinewopt.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + self.ulinewidth = ttk.Spinbox( + UFrame, + from_=0, + to=10, + increment=0.01, + width=10 + ) + self.ulinewidth.set(self.cfg_get['Options_Draw']['u_line']) + self.ulinewidth.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + LineCon = tk.Frame(LineoptFrame) + LineCon.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + linewre = ttk.Button( + LineCon, + text='Undo', + width=10, + command=lambda :self.func.Linewchoose( + self.elinewidth, + self.nlinewidth, + self.ulinewidth, + 0 + ) + ) + linewre.pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + def initDRAWCOLOR(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + # Satnum plot options# + SatvisFrame = ttk.LabelFrame(self.PlotFrame, text='Satn configs', labelanchor='nw') + SatvisFrame.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='1px', fill=tk.BOTH) + + SatnFrame = tk.Frame(SatvisFrame) + SatnFrame.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + satncollab = tk.Label( + SatnFrame, + width=5, + height=1, + bg=self.cfg_get['Options_Draw']['sat_amount_color']) + satncollab.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + satncolopt = ttk.Button( + SatnFrame, + text='Satn Color', + width=10, + command=lambda :self.func.Colorchoose(self.opthwnd, 3, satncollab, 1) + ) + satncolopt.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + + SatviCon = tk.Frame(SatvisFrame) + SatviCon.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + satviopt = ttk.Button( + SatviCon, + text='Undo', + width=10, + command=lambda :self.func.Colorchoose(self.opthwnd, 3, satncollab, 0) + ) + satviopt .pack(side=tk.LEFT, expand=tk.YES, padx='1px') + + # Line's colors options# + LinecolorFrame = ttk.LabelFrame(self.PlotFrame, text='ENU colors', labelanchor='nw') + LinecolorFrame.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='1px', fill=tk.Y) + + EFrame = tk.Frame(LinecolorFrame) + EFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ecollab = tk.Label( + EFrame, + width=5, + height=1, + bg=self.cfg_get['Options_Draw']['e_color']) + ecollab.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + ecolopt = ttk.Button( + EFrame, + text='E Color', + width=10, + command=lambda :self.func.Colorchoose(self.opthwnd, 0, ecollab, 1) + ) + ecolopt.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + + NFrame = tk.Frame(LinecolorFrame) + NFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ncollab = tk.Label( + NFrame, + width=5, + height=1, + bg=self.cfg_get['Options_Draw']['n_color'] + ) + ncollab.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + ncolopt = ttk.Button( + NFrame, + text='N Color', + width=10, + command=lambda :self.func.Colorchoose(self.opthwnd, 1, ncollab, 1) + ) + ncolopt.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + + + UFrame = tk.Frame(LinecolorFrame) + UFrame.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + ucollab = tk.Label( + UFrame, + width=5, + height=1, + bg=self.cfg_get['Options_Draw']['u_color'] + ) + ucollab.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + ucolopt = ttk.Button( + UFrame, + text='U Color', + width=10, + command=lambda :self.func.Colorchoose(self.opthwnd, 2, ucollab, 1) + ) + ucolopt.pack(side=tk.RIGHT, expand=tk.YES, padx='5px', pady='0px') + + ColorCon = tk.Frame(LinecolorFrame) + ColorCon.pack(side=tk.TOP, expand=tk.YES, padx='5px', pady='0px') + colorcon = ttk.Button( + ColorCon, + text='Undo', + width=10, + command=lambda :[ + self.func.Colorchoose(self.opthwnd, 0, ecollab, 0), + self.func.Colorchoose(self.opthwnd, 1, ncollab, 0), + self.func.Colorchoose(self.opthwnd, 2, ucollab, 0), + ] + ) + colorcon.pack(side=tk.LEFT, expand=tk.YES, padx='5px', pady='0px') + + def initCONFIRM(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + ConfirmFrame = ttk.Frame(self.opthwnd) + ConfirmFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.Y) + TotalCancel = ttk.Button( + ConfirmFrame, + text='Cancel', + width=10, + command=lambda :[ + self.opthwnd.destroy() + ] + ) + TotalCancel.pack(side=tk.RIGHT, padx='1px', anchor='e') + TotalCon = ttk.Button( + ConfirmFrame, + text='Confirm', + width=10, + command=lambda :[ + self.func.Colorchoose(self.opthwnd, 0, None, 2), + self.func.Linewchoose( + self.elinewidth, + self.nlinewidth, + self.ulinewidth, + 1 + ), + self.func.Calcuconfirm( + self.cionbox, + self.ctrobox, + self.canglebox, + self.systemv + ), + self.opthwnd.destroy() + ] + ) + TotalCon.pack(side=tk.RIGHT, padx='1px', anchor='e') \ No newline at end of file diff --git a/app/Ui_processor.py b/app/Ui_processor.py new file mode 100644 index 0000000..a4b2c3e --- /dev/null +++ b/app/Ui_processor.py @@ -0,0 +1,243 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Std +from tkinter import ttk +from PIL import ImageTk +from base64 import b64decode + +import tkinter as tk + + +class EXECUDUI: + def __init__(self, hwndparent, cfg_get, func): + # init + # ------------------------------------------------------------------------------- + self.func = func + self.cfg_get = cfg_get + self.hwndparent = hwndparent + + self.exehwnd = None + self.ObsSelectBoxVar = tk.StringVar() + self.NavSelectBoxVar = tk.StringVar() + self.AskOrNotCheckButtonVar = tk.IntVar() + self.DirectorySelectBoxVar = tk.StringVar() + + self.initGUI() + + def initGUI(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.exehwnd = tk.Toplevel(self.hwndparent) + self.exehwnd.title("RINEX Processor") + self.exehwnd.resizable(0,0) + self.func.Move_center(self.exehwnd,550,180) + self.exehwnd.minsize(550,180) + self.exehwnd.maxsize(550,180) + + ### Set icon + icon_ico = (b'AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAADjsAAA47AAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAEAAAAAQ' + b'AAAAAAAAAAAAAAAQAAAAQAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'QAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAADAAAAAAAAAAAAAAABAAAADQAAAA0AAAABAAAA' + b'AAAAAAAAAAADAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAwAAAAAAAAAzAAAAlgAAANQAAADwAAAA8AAAANQAAACWAAAAMwAAAAAAAAADAA' + b'AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAARAAAAEAAAABAAAAAPAAAAAQAAAAAAAAAAA' + b'AAAAQAAAAAAAAAIAAAAlwAAAP4AAAD/AAAA/wAAAPcAAAD3AAAA/wAAAP8AAAD+AAAAlwAAAAgAAAAAAAAAAQAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAgAAAAAAAABRAAAA5gAAAPIAAADwAAAA9gAAAOIAAAAQAAAAAAAAAAIAAAAAAAAACAAAALsAAAD' + b'/AAAA8gAAAIsAAAAyAAAAFAAAABQAAAAyAAAAiwAAAPIAAAD/AAAAuwAAAAgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAA' + b'AAAAAABgAAANwAAAD/AAAA8QAAAPEAAAD2AAAA4gAAABAAAAAAAAAABAAAAAAAAACWAAAA/wAAAN0AAAAuAAAAAAAAAAIAA' + b'AAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAARAAAA8AAAAPEA' + b'AAAfAAAADAAAABIAAAAPAAAAAQAAAAIAAAAAAAAANgAAAP8AAAD2AAAAMwAAAAAAAAAHAAAAAgAAAAAAAAAFAAAABAAAAAY' + b'AAAAAAAAAMwAAAPYAAAD/AAAANgAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABAAAADxAAAA8gAAABAAAAAAAAAAAQAAAA' + b'AAAAAAAAAABAAAAAAAAACSAAAA/wAAAIoAAAAAAAAAAAAAABUAAACiAAAAJwAAAAAAAAADAAAAAwAAAAYAAAAAAAAAigAAA' + b'P8AAACSAAAAAAAAAAQAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAAAAEAAAAAAAAAAAAA' + b'ANAAAAD/AAAANwAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAAAAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAOAAAA7QAAAPcAAAAWAAAAAA' + b'AAAAAAAAARAAAA6gAAAP8AAAD/AAAA5gAAAFYAAAAAAAAAAAAAABYAAAD3AAAA7QAAAA0AAAAAAAAAAQAAAAAAAAABAAAAA' + b'AAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAA4AAADtAAAA9gAAABYAAAAAAAAAAAAAABEAAADqAAAA' + b'/wAAAP8AAADmAAAAVgAAAAAAAAAAAAAAFgAAAPcAAADtAAAADQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAA' + b'AEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAANAAAAD/AAAANgAAAAAAAAAAAAAAEQAAAO8AAAD7AAAAfgAAAAgAAAAAAA' + b'AAAwAAAAAAAAA3AAAA/wAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAA' + b'AAAAAAAAAQAAAAAAAAAkgAAAP8AAACJAAAAAAAAAAAAAAAVAAAAogAAACcAAAAAAAAAAwAAAAMAAAAGAAAAAAAAAIoAAAD/' + b'AAAAkwAAAAAAAAAEAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAgAAAAAAAAA' + b'2AAAA/wAAAPUAAAAyAAAAAAAAAAcAAAACAAAAAAAAAAUAAAAEAAAABgAAAAAAAAAyAAAA9gAAAP8AAAA2AAAAAAAAAAIAAA' + b'AAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAAAAACWAAAA/wAAANwAA' + b'AAuAAAAAAAAAAIAAAAAAAAAAAAAAAIAAAAAAAAALgAAAN0AAAD/AAAAlgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAQAAAAAA' + b'AAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAC7AAAA/wAAAPEAAACKAAAAMgAAABQ' + b'AAAAUAAAAMgAAAIoAAADyAAAA/wAAALsAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAAB' + b'AAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAACXAAAA/wAAAP8AAAD/AAAA9gAAAPcAAAD/AAAA/wAAA' + b'P8AAACXAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEQAAAAAAAAACAAAAAQAA' + b'AAEAAAABAAAAAQAAAAEAAAACAAAAAwAAAAAAAAA0AAAAlgAAANUAAADwAAAA8AAAANUAAACXAAAANAAAAAAAAAADAAAAAgA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAQAAAA8gAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' + b'EwAAABQAAAAQAAAADAAAAAwAAAAQAAAAFAAAABMAAAAQAAAAEgAAABAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAA' + b'AEQAAAO4AAAD/AAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPMAAADzAA' + b'AA8wAAAPMAAADyAAAA8gAAAPEAAADyAAAA3QAAABAAAAAAAAAAAQAAAAAAAAAAAAAAAQAAAAAAAAARAAAA7gAAAP8AAADyA' + b'AAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADy' + b'AAAA8gAAAP8AAADuAAAAEQAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8wAAAB8AAAAMAAAAEQAAABAAAAA' + b'QAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEQAAAAwAAAAfAAAA8gAAAPEAAA' + b'AQAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADyAAAAEAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABAAAADyAAAA8gAAABAAAAAAAAAAAQAAAAAA' + b'AAAAAAAAAQAAAAAAAAAQAAAA8QAAAPIAAAAQAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEAAAAPIAAADxAAAAEAAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAB' + b'EAAADwAAAA8QAAAB8AAAAMAAAAEQAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAA' + b'BAAAAAQAAAAEQAAAAwAAAAfAAAA8QAAAPAAAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAABgAAANwAAAD/AAAA8QAA' + b'APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gA' + b'AAPEAAAD/AAAA3AAAAAYAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAUgAAAOYAAADyAAAA8gAAAPIAAADyAAAA8g' + b'AAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAOYAAABSAAAAA' + b'AAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAACAAAABEAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAA' + b'EAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAARAAAACAAAAAAAAAABAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAB' + b'AAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//2Mb+gSYZfS9IBLqBgABZAUAAmgFCEIoAhIhKFIhEShGMFGoVDAwqFQwMKhW' + b'MFGoUiERKFISIShZCEIoWQACaFoABWhAIBJoX+hf6AAAAWgAAAFoAAABaAAAAWhf/6FoX/+haAAAAWgAAAFkAAACagAABXS' + b'//9L6AAAF/////8=') + icon_ico = b64decode(icon_ico) + icon_ico = ImageTk.PhotoImage(data=icon_ico) + self.exehwnd.tk.call('wm', 'iconphoto', self.exehwnd._w, icon_ico) + + self.initIO() + + def initIO(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + MainFrame = tk.Frame(self.exehwnd) + MainFrame.pack() + InputFrame = ttk.Frame(MainFrame) + InputFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='1px', fill=tk.X) + + # Input Frame + # ------------------------------------------------------------------------------- + ### Observation file + ObsInFrame = ttk.LabelFrame(InputFrame, text='RINEX Obs File') + ObsInFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) + ObsFileSelectBox = ttk.Combobox( + ObsInFrame, + width=70, + height=4, + values=self.func.obsvar, + textvariable=self.ObsSelectBoxVar + ) + ObsFileSelectBox.current(len(ObsFileSelectBox['value'])-1) + ObsFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') + ObsFileSelectButton = ttk.Button( + ObsInFrame, + text='...', + width=3, + command=lambda :self.func.GetObsFilePath(self.exehwnd, ObsFileSelectBox) + ) + ObsFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') + ### Navigation file + NavInFrame = ttk.LabelFrame(InputFrame, text='RINEX Nav File') + NavInFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) + NavFileSelectBox = ttk.Combobox( + NavInFrame, + width=70, + height=4, + values=self.func.navvar, + textvariable=self.NavSelectBoxVar + ) + NavFileSelectBox.current(len(NavFileSelectBox['value'])-1) + NavFileSelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') + NavFileSelectButton = ttk.Button( + NavInFrame, + text='...', + width=3, + command=lambda :self.func.GetNavFilePath(self.exehwnd, NavFileSelectBox) + ) + NavFileSelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') + + # Output Frame + # ------------------------------------------------------------------------------- + OutputFrame = ttk.Frame(MainFrame) + OutputFrame.pack(side=tk.BOTTOM, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) + + FileOutFrame = ttk.LabelFrame(OutputFrame, text='Output Directory') + FileOutFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) + ## CheckButton Initialize + AskOrNotCheckButton = ttk.Checkbutton( + FileOutFrame, + text='Directory', + variable=self.AskOrNotCheckButtonVar, + onvalue=1, + offvalue=0, + command=lambda :self.func.AskOrNotCheck( + self.AskOrNotCheckButtonVar, + AskDirectorySelectBox, + AskDirectorySelectButton + ) + ) + AskOrNotCheckButton.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') + AskDirectorySelectBox = ttk.Combobox( + FileOutFrame, + width=60, + height=4, + values=self.func.outvar, + state=tk.DISABLED, + textvariable=self.DirectorySelectBoxVar + ) + AskDirectorySelectBox.current(len(AskDirectorySelectBox['value'])-1) + AskDirectorySelectBox.pack(side=tk.LEFT, anchor='w', padx='0px', pady='0px') + AskDirectorySelectButton = ttk.Button( + FileOutFrame, + text='...', + width=3, + state=tk.DISABLED, + command=lambda :self.func.AskDirectory(self.exehwnd, AskDirectorySelectBox) + ) + AskDirectorySelectButton.pack(side=tk.RIGHT, anchor='e', padx='1px', pady='0px') + + # Execute frame + # ------------------------------------------------------------------------------- + ExeFrame = ttk.Frame(OutputFrame) + ExeFrame.pack(side=tk.TOP, expand=tk.YES, padx='1px', pady='0px', fill=tk.X) + + ExitButton = ttk.Button( + ExeFrame, + text='Exit', + width=10, + command=self.exehwnd.destroy + ) + ExitButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + ExecuteButton = ttk.Button( + ExeFrame, + text='Execute', + width=10, + command=lambda :self.func._ExecuteFile( + ExecuteState, + self.ObsSelectBoxVar, + self.NavSelectBoxVar, + self.AskOrNotCheckButtonVar, + self.DirectorySelectBoxVar + ) + ) + ExecuteButton.pack(side=tk.LEFT, expand=tk.YES, padx='1px', pady='0px') + + # State bar + # ------------------------------------------------------------------------------- + StateFrame = ttk.Frame(OutputFrame) + StateFrame.pack(side=tk.TOP, fill=tk.X, padx='1px', pady='0px') + ExecuteState = ttk.Label(StateFrame, text="None") + ExecuteState.pack(side=tk.LEFT, anchor='nw') \ No newline at end of file diff --git a/app/Ui_view.py b/app/Ui_view.py new file mode 100644 index 0000000..0c195f7 --- /dev/null +++ b/app/Ui_view.py @@ -0,0 +1,270 @@ +# +# +# +# +# +# +# +# +# +#-----------------------------------------------------------------# + +### Std +from PIL import ImageTk +from base64 import b64decode +from tkinter import filedialog + +import tkinter as tk + +class VIEWGUI: + def __init__(self, hwndparent, func): + # init + # ------------------------------------------------------------------------------- + self.func = func + self.hwndparent = hwndparent + + self.view = None + + self.initGUI() + + def initGUI(self): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + self.view = tk.Toplevel(self.hwndparent) + self.view.title("View") + self.func.Move_center(self.view, 1000, 600) + self.view.minsize(1000, 600) + + icon_ico = (b'AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAACQAAPY6AQD2OgEAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAA' + b'ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAACAAAAAgAAAAAAAAABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAAB' + b'EAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAD' + b'QAAAAEAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACQAAAHEAAADMAAAA6wAAAO8' + b'AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7g' + b'AAAO4AAADuAAAA7gAAAO4AAADvAAAA6wAAAMwAAAByAAAACQAAAAAAAAACAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAA' + b'AAAdAAAAzwAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wA' + b'AAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AA' + b'AA0AAAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD/AAAA/wAA' + b'AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAA' + b'A/wAAAP8AAAD/AAAA/gAAAPoAAAD6AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAHIAAAD/AAAA+QAAA' + b'P8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA' + b'7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAAP8AAAD/AAAA+QAAAP8AAAB' + b'xAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAAAAGQAAABEAAAASAAAAEQAAABEAAAARAAAAE' + b'QAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAAUAAAAFgAAABUAAAAR' + b'AAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAA' + b'AAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAA' + b'AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgA' + b'AAO0AAAD/AAAA/wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAA' + b'AAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAABQAAAAAAAAA/AAAAkwAAAE0AAAAAAAAAAAAAABQAA' + b'ADtAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAQAAAAEAAAABAAAAAIAAAAFAAAAAAAAAFsAAA' + b'D/AAAA/gAAAP8AAABNAAAAAAAAABUAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA' + b'/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAIAAAAAAAAAXAAAAP8AAAD9AAAA9QAAAP8AAACIAAAAAAAAABUAAADuAAAA/wAAAP' + b'8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAgAAAAIAAAAAAAAAKgAAAGcAAAB7AAAAaAAAAB0AAABaAAAA/wAAAP0AAAD8AAAA/QAAAP8' + b'AAAA/AAAAAAAAABQAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARA' + b'AAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABYAAACrAAAA/gAAAP8AAAD+AAAA/wAAAPcA' + b'AAD4AAAA/gAAAP0AAAD9AAAA/wAAAFwAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgA' + b'AAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' + b'AAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAAAAAAGAAAANgAA' + b'AD/AAAA/QAAAPkAAAD2AAAA+QAAAP8AAAD9AAAA/gAAAP8AAAD/AAAAXAAAAAAAAAAFAAAAAAAA' + b'ABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAA' + b'AAAAAAAAAAAAIAAAAAAAAArAAAAP8AAAD5AAAA/QAAAP8AAAD/AAAA/wAAAP0AAAD+AAAA/wAAA' + b'P8AAABbAAAAAAAAAAUAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD' + b'/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAwAAAA/gAAAP0AAAD+AAAA/wAAAM' + b'YAAACAAAAAygAAAP8AAAD9AAAA/wAAAPoAAAAmAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/' + b'wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAA' + b'AAABqAAAA/wAAAPkAAAD/AAAAxQAAAAMAAAAAAAAABgAAAMsAAAD/AAAA+QAAAP8AAABkAAAAAA' + b'AAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4A' + b'AAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAAB/AAAA/wAAAPcAAAD/AAAAggAAAAAAAAASAAAAAAA' + b'AAIoAAAD/AAAA9wAAAP8AAAB4AAAAAAAAAAQAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAA' + b'AAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAA' + b'AAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAABAAAAAAAAABrAAAA/wAA' + b'APkAAAD/AAAAwQAAAAAAAAAAAAAAAwAAAMcAAAD/AAAA+QAAAP8AAABkAAAAAAAAAAQAAAABAAA' + b'AAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAA' + b'AEAAAAAAAAAAgAAAAAAAAAyAAAA/wAAAP0AAAD+AAAA/wAAAMEAAAB4AAAAxAAAAP8AAAD+AAAA' + b'/gAAAPwAAAArAAAAAAAAAAIAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAA' + b'BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO' + b'0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAsAAAAP8AAAD5AAAA/' + b'QAAAP8AAAD/AAAA/wAAAP0AAAD5AAAA/wAAAKkAAAAAAAAAAgAAAAAAAAABAAAAAAAAABEAAADu' + b'AAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAA' + b'AAAAEAAAAAAAAAHAAAAN0AAAD/AAAA/AAAAPgAAAD2AAAA+AAAAPwAAAD/AAAA2AAAABgAAAAAA' + b'AAAAQAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wA' + b'AAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAACAAAAAAAAABsAAAC0AAAA/wAAAP8AAAD+AA' + b'AA/wAAAP8AAACvAAAAGAAAAAAAAAACAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AA' + b'ADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAQAAAAEAAAABAAA' + b'AAwAAAAIAAAAAAAAAMQAAAG8AAACEAAAAbgAAAC8AAAAAAAAAAgAAAAMAAAABAAAAAQAAAAAAAA' + b'ABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAA' + b'AAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAA' + b'AAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAE' + b'gAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAASAAAAEgAAABIAAAAS' + b'AAAAFAAAABYAAAAWAAAAFgAAABQAAAASAAAAEgAAABIAAAASAAAAEAAAAAEAAAABAAAAAAAAABE' + b'AAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQA' + b'AAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwA' + b'AADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AA' + b'AA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AA' + b'AD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAA' + b'AP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAA' + b'D+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAA' + b'BIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAA' + b'RAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADtAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO' + b'4AAADuAAAA7gAAAO0AAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAE' + b'gAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA' + b'AAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAABIAAAARAAAAEQAAABE' + b'AAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAAEAAAAAEAAAABAAAAAA' + b'AAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AA' + b'AD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAABEAAADuAAA' + b'A/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAEAAAABAAAAEAAAA' + b'BIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAA' + b'EAAAAAEAAAABAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO' + b'4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7' + b'QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADt' + b'AAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE' + b'AAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAASAAAA7QAAAP8AAAD+AAAA/w' + b'AAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAAD/AAAA7QAAABIAAAAAA' + b'AAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/wAAAO4AAAARAAAAAAA' + b'AAAAAAAASAAAA7QAAAP8AAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AA' + b'AA/wAAAP4AAAD/AAAA7QAAABIAAAAAAAAAAAAAABEAAADuAAAA/wAAAP8AAADtAAAAEgAAAAAAA' + b'AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAA' + b'AO0AAAD/AAAA/wAAAO4AAAARAAAAAAAAAAAAAAAQAAAA3QAAAPIAAADsAAAA7QAAAO0AAADtAAA' + b'A7QAAAO0AAADtAAAA7QAAAO0AAADtAAAA7QAAAOwAAADyAAAA3QAAABAAAAAAAAAAAAAAABEAAA' + b'DuAAAA/wAAAP8AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAEAAAAAAAAAEQAAAO0AAAD/AAAA/wAAAO4AAAASAAAAAAAAAAEAAAABAAAA' + b'EAAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAASAAAAEgAAABIAAAA' + b'SAAAAEAAAAAEAAAABAAAAAAAAABIAAADuAAAA/wAAAP8AAADtAAAAEQAAAAAAAAABAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAEgAAAO0AAAD/AAAA/' + b'wAAAO0AAAATAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAACAAAAAAAAABMAAADtAAAA/wAAAP8' + b'AAADtAAAAEgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAEAAAAAAAAADQAAAOgAAAD/AAAA/wAAAPkAAAAjAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAACAAAAAAAAACMAAAD5AAAA/wAAAP8AAADnAAAADQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAMcAAAD/AAAA+gAAAP8AAACtAA' + b'AAGQAAABEAAAASAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAA' + b'AARAAAAEQAAABEAAAARAAAAEQAAABIAAAARAAAAGQAAAK0AAAD/AAAA+gAAAP8AAADHAAAAAAAA' + b'AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA' + b'AAAAAAHIAAAD/AAAA+QAAAP8AAAD/AAAA9wAAAO0AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAA' + b'DuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADtAAAA9wAAA' + b'P8AAAD/AAAA+QAAAP8AAABxAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAADMAAAA/wAAAPoAAAD6AAAA/gAAAP8AAAD' + b'/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP' + b'8AAAD/AAAA/wAAAP8AAAD/AAAA/gAAAPoAAAD5AAAA/wAAAMwAAAAIAAAAAAAAAAEAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAd' + b'AAAA0AAAAP8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8' + b'AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP0AAAD/AAAA0A' + b'AAAB0AAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAACgAAAHIAAADNAAAA6wAAAO8AAADuAAAA7gAAAO4A' + b'AADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gAAAO4AAADuAAAA7gA' + b'AAO4AAADvAAAA6wAAAM0AAAByAAAACgAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAA' + b'AABAAAADQAAABIAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAARAAAAEQAA' + b'ABEAAAARAAAAEQAAABEAAAARAAAAEQAAABEAAAASAAAADQAAAAEAAAAAAAAAAgAAAAIAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAQAAAAQAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' + b'AAAAAAEAAAAEAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/Rf/' + b'/ov8AAP6QAAAJfwAA/UAAAAK/AAD+gAAAAX8AAPkAAAAAnwAA+QAAAACfAAD5AAAAAJ8AAPoF//' + b'+gXwAA+gQABGBfAAD6BegIIF8AAPoF0pAgXwAA+gWkACBfAAD6BVAAYF8AAPoFIACgXwAA+gUgA' + b'SBfAAD6BUABIF8AAPoFQIEgXwAA+gVBQSBfAAD6BUCBIF8AAPoFQAEgXwAA+gUgAiBfAAD6BSAC' + b'IF8AAPoFUAUgXwAA+gQEECBfAAD6Bf//oF8AAPoEAAAgXwAA+gYAAGBfAAD6BgAAYF8AAPoGAAB' + b'gXwAA+gYAAGBfAAD6BAAAIF8AAPoF//+gXwAA+gX//6BfAAD6BAAAIF8AAPoGAABgXwAA+gYAAG' + b'BfAAD6BgAAYF8AAPoGAABgXwAA+gQAACBfAAD6BF/6IF8AAPoF//+gXwAA+QAAAACfAAD5AAAAA' + b'J8AAPkAAAAAnwAA/oAAAAF/AAD9QAAAAr8AAP6QAAAJfwAA/0X//6L/AAA=') + icon_ico = b64decode(icon_ico) + icon_ico = ImageTk.PhotoImage(data=icon_ico) + self.view.tk.call('wm', 'iconphoto', self.view._w, icon_ico) + + topmenu = tk.Menu(self.view) + ### File + filemenu = tk.Menu(topmenu, tearoff=False) + ### File > Oprn File + filemenu.add_command( + label="Open File", + command=lambda: self.View_windowshow(text, self.view), + accelerator='Ctrl+F' + ) + ### File > Exit + filemenu.add_command( + label="Exit", + command=self.view.destroy, + accelerator='Ctrl+E' + ) + topmenu.add_cascade(label="File", menu=filemenu) + + self.view.config(menu=topmenu) + + ybar = tk.Scrollbar(self.view) + ybar.pack(side=tk.RIGHT, fill=tk.Y) + xbar = tk.Scrollbar(self.view, orient=tk.HORIZONTAL) + xbar.pack(side=tk.BOTTOM, fill=tk.X) + + text = tk.Text( + self.view, + xscrollcommand=xbar.set, + yscrollcommand=ybar.set, + height=500, width=1000, + undo=True, + autoseparators=False, + wrap='none' + ) + text.pack(side=tk.TOP, fill=tk.BOTH) + ybar.config(command=text.yview) + xbar.config(command=text.xview) + + def View_windowshow(self, text, view): + # ------------------------------------------------------------------------------- + # > + # Method: + # Brief : + # Author: @KenanZhu All Right Reserved. + # ------------------------------------------------------------------------------- + f_path = filedialog.askopenfilename(parent=view) + if not f_path: + return 0 + self.view.title('Viewing: %s' % f_path) + text.delete('1.0', 'end') + with open(f_path, 'r') as f: + fcon = f.read() + text.insert('insert', fcon) + text.config() \ No newline at end of file