This repository has been archived on 2026-10-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
KNZ_GeoTrackLab/app/Ui_main.py
T
2024-11-08 16:39:42 +08:00

513 lines
22 KiB
Python

# @ File : UI_main.py
#
# Copyright (c) 2024 KenanZhu. All Right Reserved.
#
# @ Author : KenanZhu
# @ Time : 2024/11/04
# @ Brief : Main window class.
# #
# @ IDE : PyCharm 2024.2.1 (Community Edition)
#
# ----------------------------------------------------------------------------------------
### 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
import threading
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 cartopy.crs as ccrs
import cartopy.io.shapereader as shp
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_, func_):
abo.ABODUI(hwndparemt, cfg_get_, func_)
def _instanceOPT(hwndparemt, cfg_get_, func_):
T = threading.Thread(target=lambda :instanceOPT(hwndparemt, cfg_get_, func_))
T.start()
def _instancePRO(hwndparemt, cfg_get_, func_):
T = threading.Thread(target=lambda :instancePRO(hwndparemt, cfg_get_, func_))
T.start()
def _instanceVIE(hwndparemt, func_):
T = threading.Thread(target=lambda :instanceVIE(hwndparemt, func_))
T.start()
def _instanceABO(hwndparemt, cfg_get_, func_):
T = threading.Thread(target=lambda :instanceABO(hwndparemt, cfg_get_, func_))
T.start()
# noinspection PyUnusedLocal,PyProtectedMember
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',
command=lambda :self.func._OpenkslnFile(
self.ex,self.nx,self.ux,self.satn,self.satvisb,
self.canvas0,self.canvas1,self.plotstate)
)
### File > Open... > Open Sat Solution
openmenu.add_command(
label="Open Sat Solution",
accelerator='Ctrl+S',
command=lambda :self.func._Plot2polar(
self.sattrack,self.plotstate,self.canvas2)
)
### 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, self.func)
)
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=ccrs.Mercator()
)
self.sattrack.coastlines(resolution='110m')
self.sattrack.gridlines()
fig.subplots_adjust(
left=0,
bottom=0.045,
right=1,
top=0.90
)
for spine in ['right', 'left']:
self.sattrack.spines[spine].set_visible(False)
self.sattrack.set_facecolor('#f5f5f5')
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)