-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsignalvisualizer.py
153 lines (133 loc) · 7.54 KB
/
signalvisualizer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib import backend_bases
from controlMenu import ControlMenu
from inputLoad import Load
from inputRecord import Record
from generateNoise import Noise
from generatePureTone import PureTone
from generateFreeAdd import FreeAdditionPureTones
from generateSquareWave import SquareWave
from generateSawtoothWave import SawtoothWave
# from generateRosenbergPulse import RosenbergPulse
from optionsSpectrogram import Spectrogram
# To avoid blurry fonts
from ctypes import windll
windll.shcore.SetProcessDpiAwareness(1)
class Start(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.container = tk.Frame(self)
self.container.pack(side="top", fill="both", expand=True)
self.container.grid_rowconfigure(0, weight=1)
self.container.grid_columnconfigure(0, weight=1)
# Delete two options of the toolbar of the figures. This must be done before the figures are created
backend_bases.NavigationToolbar2.toolitems = (
('Home', 'Reset original view', 'home', 'home'),
('Back', 'Back to previous view', 'back', 'back'),
('Forward', 'Forward to next view', 'forward', 'forward'),
(None, None, None, None),
('Zoom', 'Zoom to rectangle', 'zoom_to_rect', 'zoom'),
(None, None, None, None),
('Save', 'Save the figure', 'filesave', 'save_figure'),
)
self.frames = {}
self.initialize_frame('SignalVisualizer')
def initialize_frame(self, page_name):
if page_name == 'SignalVisualizer':
self.frames['SignalVisualizer'] = SignalVisualizer(master=self.container, controller=self)
self.frames['SignalVisualizer'].grid(row=0, column=0, sticky="nsew")
self.show_frame('SignalVisualizer')
elif page_name == 'Load':
self.frames['Load'] = Load(master=self.container, controller=self)
self.frames['Load'].grid(row=0, column=0, sticky="nsew")
self.show_frame('Load')
elif page_name == 'Record':
self.frames['Record'] = Record(master=self.container, controller=self)
self.frames['Record'].grid(row=0, column=0, sticky="nsew")
self.show_frame('Record')
elif page_name == 'Noise':
self.frames['Noise'] = Noise(master=self.container, controller=self)
self.frames['Noise'].grid(row=0, column=0, sticky="nsew")
self.show_frame('Noise')
elif page_name == 'PureTone':
self.frames['PureTone'] = PureTone(master=self.container, controller=self)
self.frames['PureTone'].grid(row=0, column=0, sticky="nsew")
self.show_frame('PureTone')
elif page_name == 'FreeAdditionPureTones':
self.frames['FreeAdditionPureTones'] = FreeAdditionPureTones(master=self.container, controller=self)
self.frames['FreeAdditionPureTones'].grid(row=0, column=0, sticky="nsew")
self.show_frame('FreeAdditionPureTones')
elif page_name == 'SquareWave':
self.frames['SquareWave'] = SquareWave(master=self.container, controller=self)
self.frames['SquareWave'].grid(row=0, column=0, sticky="nsew")
self.show_frame('SquareWave')
elif page_name == 'SawtoothWave':
self.frames['SawtoothWave'] = SawtoothWave(master=self.container, controller=self)
self.frames['SawtoothWave'].grid(row=0, column=0, sticky="nsew")
self.show_frame('SawtoothWave')
# elif page_name == 'RosenbergPulse':
# self.frames['RosenbergPulse'] = RosenbergPulse(master=self.container, controller=self)
# self.frames['RosenbergPulse'].grid(row=0, column=0, sticky="nsew")
# self.show_frame('RosenbergPulse')
elif page_name == 'Spectrogram':
self.frames['Spectrogram'] = Spectrogram(master=self.container, controller=self)
self.frames['Spectrogram'].grid(row=0, column=0, sticky="nsew")
self.show_frame('Spectrogram')
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
if page_name == 'SignalVisualizer':
menubar = frame.menubar(self)
self.configure(menu=menubar)
class SignalVisualizer(tk.Frame):
def __init__(self, master, controller):
tk.Frame.__init__(self, master)
self.controller = controller
self.master = master
self.controller.title('Signal Visualizer')
# self.controller.iconbitmap('icon.ico')
self.cm = ControlMenu()
self.cm.windowGeometry(self.controller, 750, 450)
def on_closing():
if tk.messagebox.askokcancel("Quit", "Do you want to quit?"):
plt.close('all') # closes all matplotlib figures
self.controller.destroy()
self.controller.protocol("WM_DELETE_WINDOW", on_closing)
def menubar(self, root):
# the menu bar will be at the top of the window
menubar = tk.Menu(root)
# creation of the options in the menu bar
signalmenu = tk.Menu(menubar, tearoff=0) # tearoff=0 to avoid useless lines
signalmenu.add_command(label="Info")
signalmenu.add_command(label="Exit", command=self.quit)
generatemenu = tk.Menu(menubar, tearoff=0)
generatemenu.add_command(label="Pure tone", command=lambda: self.controller.initialize_frame('PureTone'))
generatemenu.add_command(label="Free addition of pure tones", command=lambda: self.controller.initialize_frame('FreeAdditionPureTones'))
generatemenu.add_command(label="Noise", command=lambda: self.controller.initialize_frame('Noise'))
knownmenu = tk.Menu(generatemenu, tearoff=0)
knownmenu.add_command(label="Square wave", command=lambda: self.controller.initialize_frame('SquareWave'))
knownmenu.add_command(label="Sawtooth wave", command=lambda: self.controller.initialize_frame('SawtoothWave'))
# knownmenu.add_command(label="Rosenberg pulse", command=lambda: self.controller.initialize_frame('RosenbergPulse'))
inputmenu = tk.Menu(menubar, tearoff=0)
inputmenu.add_command(label="Load", command=lambda: self.controller.initialize_frame('Load'))
inputmenu.add_command(label="Record", command=lambda: self.controller.initialize_frame('Record'))
optionsmenu = tk.Menu(menubar, tearoff=0)
# optionsmenu.add_command(label="General")
# optionsmenu.add_command(label="Signal")
optionsmenu.add_command(label="Spectrogram", command=lambda: self.controller.initialize_frame('Spectrogram'))
# adding the options created to the menu bar
menubar.add_cascade(label="Signal Visualizer", menu=signalmenu)
menubar.add_cascade(label="Generate", menu=generatemenu)
generatemenu.add_cascade(label="Known periodic signals", menu=knownmenu)
menubar.add_cascade(label="Input", menu=inputmenu)
menubar.add_cascade(label="Options", menu=optionsmenu)
return menubar
# def createWindowButtons(self):
# w1Button = tk.Button(self, text="Window1", command=lambda: self.controller.show_frame('LoadApp')) # with lambda, the action is only made when the button is pressed
# w1Button.configure(state="disabled")
# w1Button.grid()
if __name__ == "__main__":
app = Start()
app.mainloop()