
from tkinter import *
from tkinter import ttk
import tkinter as tk
from tkinter import Menu
from tkinter import messagebox
import webbrowser
from numpy import *

#To create an UI in Python using TKinter
window = Tk()
window.tk.call('tk', 'scaling', 1.6)
window.title("Microphone signal analysis application")
tab_control = ttk.Notebook(window)
tab9 = ttk.Frame(tab_control)
tab_control.add(tab9, text='Signal Analysis')
lbl9 = Label(tab9, text= 'label9')
lbl9.grid(column=0, row=0)
tab_control.pack(expand=1, fill='both')   

#To create an UI in Python using TKinter
def _click_mee20():
        import numpy as np
        import pyaudio as pa 
        import struct 
        import matplotlib.pyplot as plt 

        CHUNK = 1024 * 1
        FORMAT = pa.paInt16
        CHANNELS = 1
        Fs=round(namecol10.get())  # The Sampling frequency (Hz.)
        RATE = Fs
        p = pa.PyAudio()
        stream = p.open(
        format = FORMAT,
        channels = CHANNELS,
        rate = RATE,
        input=True,
        output=True,
        frames_per_buffer=CHUNK
        )
        fig, (ax,ax1) = plt.subplots(2)
        x_fft = np.linspace(0, RATE, CHUNK)
        x = np.arange(0,2*CHUNK,2)
        line, = ax.plot(x, 0.01*np.random.rand(CHUNK),'r')
        line_fft, = ax1.semilogx(x_fft, 0.01*np.random.rand(CHUNK), 'b')
        ax.set_ylim(-1,1)
        ax.ser_xlim = (0,CHUNK)
        ax.set_xlabel('Time(Sec)')
        ax.set_ylabel('Magnitude')
        ax1.set_xlim(1,RATE/2)
        ax1.set_xlabel('Frequency(Hz)')
        ax1.set_ylabel('Magnitude (dB)')
        ax1.set_ylim(0,3)
        fig.show()
        A1=np.zeros(50)
        B1=np.zeros(50)

        while 1:
                fig.canvas.draw()
                fig.canvas.flush_events()
                blankmax1.delete(0,10)
                blankf1.delete(0,10)
                for x in range(1, 40):  #Performing averaging to show the amplitude and frequency of the received signal more stable
                        data = stream.read(CHUNK)
                        dataInt = struct.unpack(str(CHUNK) + 'h', data)
                        line.set_ydata(np.round(dataInt,5)/32767)
                        line_fft.set_ydata(np.abs(np.fft.fft(dataInt))*2/(11000*CHUNK))
                        X_m=np.abs(np.fft.fft(dataInt))*2/(11000*CHUNK)
                        A1[x]=round(max(np.round(dataInt,5)/32767),3)
                        B1[x]=round(x_fft[X_m.argmax()],3)
                A2=round(mean(A1),4)
                B2=round(x_fft[X_m.argmax()],4)
                blankmax1.insert(0, A2)
                blankf1.insert(0, B2)

mightyyt9 = ttk.LabelFrame(tab9, text=' Signal Analysis ')
mightyyt9.grid(column=0, row=0, padx=8, pady=4)
action1 = ttk.Button(mightyyt9, text='Start', command=_click_mee20)
action1.grid(column=1, row=9 , padx=10, pady=10)    
a_labelts1a7b10 = ttk.Label(mightyyt9, text='The Sampling Frequency (Hz):')
a_labelts1a7b10.grid(column=0, row=3, sticky='W' , padx=10, pady=10)
namecol10 = tk.DoubleVar()
name_entered10 = ttk.Entry(mightyyt9, width=15, textvariable=namecol10)
namecol10.set(44100)
name_entered10.grid(column=1, row=3, sticky='W' , padx=10, pady=10)

a_labelts1e6 = ttk.Label(mightyyt9, text='Results:     ')
a_labelts1e6.grid(column=0, row=6, sticky='W')
a_labelts1e6 = ttk.Label(mightyyt9, text='  Max signal amplitude (dB):     ')
a_labelts1e6.grid(column=0, row=7, sticky='W')
a_labelts1e7 = ttk.Label(mightyyt9, text='  Frequency (Hz):     ')
a_labelts1e7.grid(column=0, row=8, sticky='W')

blankmax1 = Entry(mightyyt9)
blankmax1.grid(row=7, column=1 , padx=5, pady=5)
blankf1= Entry(mightyyt9)
blankf1.grid(row=8, column=1 , padx=10, pady=10)
def _quit():
	window.quit()
	window.destroy()
	exit()
menu_bar = Menu(window)
window.configure(menu=menu_bar)
file_menu = Menu(menu_bar, tearoff=0)
file_menu.add_separator()
file_menu.add_command(label='Exit', command=_quit)
menu_bar.add_cascade(label='File', menu=file_menu)
def _msgBox():
        webbrowser.open_new('Mahdi.pdf')
def _loadf2():
        msg = messagebox.showinfo( "About", "SDU, Mahdi")
help_menu = Menu(menu_bar, tearoff=0)
help_menu.add_command(label='Help', command=_msgBox)
help_menu.add_separator()
help_menu.add_command(label='About', command=_loadf2)
menu_bar.add_cascade(label='Help', menu=help_menu)
window.mainloop()