Source code for UI.View

import os
import sys
import inspect
import tkinter as tk
from tkinter import ttk
from tkinter import StringVar
from tkinter import filedialog

currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)

from Utils.Utils import Callbacks, Messages, Utils
from .WarningWindow import WarningWindow
from .ShareTradingFrame import ShareTradingFrame
from .SettingsWindow import SettingsWindow

APP_NAME = "TradingMate"

[docs]class View(): def __init__(self): # Local data initialisation self.callbacks = {} self.create_UI() # GRAPHICAL DEFINITIONS def create_UI(self): # Create main window self.mainWindow = tk.Tk() self.mainWindow.title(APP_NAME) img = tk.Image("photo", file=currentdir + '/assets/trading_mate_icon.png') self.mainWindow.tk.call('wm','iconphoto',self.mainWindow._w,img) self.mainWindow.protocol("WM_DELETE_WINDOW", self.on_close_event) self.mainWindow.geometry("1024x600") # Define the app menu self.create_menu() # Create the tab format window self.noteBook = ttk.Notebook(self.mainWindow) self.noteBook.pack(expand=1, fill="both") # Create Share trading Tab self.create_share_trading_tab() def create_menu(self): self.menubar = tk.Menu(self.mainWindow) # Menu File filemenu = tk.Menu(self.menubar, tearoff=0) filemenu.add_command(label="Open...", command=self.on_open_portfolio_event) filemenu.add_command(label="Export...", command=self.on_save_portfolio_event) filemenu.add_command(label="Settings...", command=self.on_show_settings) filemenu.add_command(label="Exit", command=self.on_close_event) self.menubar.add_cascade(label="File", menu=filemenu) # Menu About helpmenu = tk.Menu(self.menubar, tearoff=0) helpmenu.add_command(label="About", command=self.show_about_popup) self.menubar.add_cascade(label="Help", menu=helpmenu) # Display the menu self.mainWindow.config(menu=self.menubar) def create_share_trading_tab(self): # Create the main frame container and add it to the notebook as a tab self.shareTradingFrame = ShareTradingFrame(self.noteBook) self.shareTradingFrame.pack(expand=True) self.noteBook.add(self.shareTradingFrame, text="Shares Trading") self.shareTradingFrame.set_callback(Callbacks.ON_MANUAL_REFRESH_EVENT, self.on_manual_refresh_event) self.shareTradingFrame.set_callback(Callbacks.ON_NEW_TRADE_EVENT, self.on_new_trade_event) self.shareTradingFrame.set_callback(Callbacks.ON_SET_AUTO_REFRESH_EVENT, self.set_auto_refresh_event) self.shareTradingFrame.set_callback(Callbacks.ON_OPEN_LOG_FILE_EVENT, self.on_open_portfolio_event) self.shareTradingFrame.set_callback(Callbacks.ON_SAVE_LOG_FILE_EVENT, self.on_save_portfolio_event) self.shareTradingFrame.set_callback(Callbacks.ON_DELETE_LAST_TRADE_EVENT, self.on_delete_last_trade_event) def start(self): self.shareTradingFrame.set_auto_refresh() # Start the view thread self.mainWindow.mainloop() def set_callback(self, id, callback): self.callbacks[id] = callback # ******* MAIN WINDOW *********** def on_close_event(self): # Notify the Controller and close the main window self.callbacks[Callbacks.ON_CLOSE_VIEW_EVENT]() self.mainWindow.destroy() def show_about_popup(self): # Show the about panel WarningWindow(self.mainWindow, "About", Messages.ABOUT_MESSAGE.value) # ******* SHARE TRADING FRAME ************ def on_new_trade_event(self, newTrade): try: self.callbacks[Callbacks.ON_NEW_TRADE_EVENT](newTrade) return {'success': True, 'message': 'ok'} except RuntimeError as e: return {'success': False, 'message': e} def on_manual_refresh_event(self): # Notify the Controller to request new data self.callbacks[Callbacks.ON_MANUAL_REFRESH_EVENT]() def reset_view(self, resetHistory=False): self.shareTradingFrame.reset_view(resetHistory) def update_share_trading_history_log(self, logList): for entry in logList: self.shareTradingFrame.add_entry_to_log_table(entry) def update_share_trading_portfolio_balances(self, cash, holdingsValue, totalValue, pl, pl_perc, holdingPL, holdingPLPC, validity): self.shareTradingFrame.update_portfolio_balances(cash, holdingsValue, totalValue, pl, pl_perc, holdingPL, holdingPLPC, validity) def update_share_trading_holding(self, symbol, quantity, openPrice, lastPrice, cost, value, pl, plPc, validity): self.shareTradingFrame.update_share_trading_holding(symbol, quantity, openPrice, lastPrice, cost, value, pl, plPc, validity) def set_auto_refresh_event(self, value): self.callbacks[Callbacks.ON_SET_AUTO_REFRESH_EVENT](value) def on_open_portfolio_event(self): try: filename = filedialog.askopenfilename(initialdir=Utils.get_home_path( ), title="Select file", filetypes=(("json files", "*.json"), ("all files", "*.*"))) if filename is not None and len(filename) > 0: self.callbacks[Callbacks.ON_OPEN_LOG_FILE_EVENT](filename) except RuntimeError as e: WarningWindow(self.parent, "Warning", e) def on_save_portfolio_event(self): try: filename = filedialog.asksaveasfilename(initialdir=Utils.get_home_path( ),title="Select file",filetypes=(("json files","*.json"),("all files","*.*"))) if filename is not None and len(filename) > 0: self.callbacks[Callbacks.ON_SAVE_LOG_FILE_EVENT](filename) except RuntimeError as e: WarningWindow(self.parent, "Warning", e) def on_delete_last_trade_event(self): try: self.callbacks[Callbacks.ON_DELETE_LAST_TRADE_EVENT]() return {'success': True, 'message': 'ok'} except RuntimeError as e: return {'success': False, 'message': e} def on_show_settings(self): config = self.callbacks[Callbacks.ON_SHOW_SETTINGS_EVENT]() SettingsWindow(self.mainWindow, config, self.callbacks[Callbacks.ON_SAVE_SETTINGS_EVENT])