Problem In calling a Function from another python file of project - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: GUI (https://python-forum.io/forum-10.html) +--- Thread: Problem In calling a Function from another python file of project (/thread-21338.html) |
Problem In calling a Function from another python file of project - vinod2810 - Sep-25-2019 Hello Everyone, I had created two different python files (EEG.py and Digital_Filter.py) in pycharm IDE under one project. And I want to call a function declared in Digital_Filter.py into EEG.py but I am receving an error (ImportError: cannot import name 'apply_filter' from 'Digital_Filter' (C:\Users\LM HealthCare\Documents\Pycharm\Projects\EEG\Digital_Filter.py)) And this is the code I am using to do this # import Tkinter from tkinter import * from Digital_Filter import apply_filterNow can any one please help me in getting out of this. RE: Problem In calling a Function from another python file of project - ichabod801 - Sep-25-2019 (Sep-25-2019, 01:07 PM)vinod2810 Wrote: Now can any one please help me in getting out of this. Not with what you've given us. We need more information about Digital_Filter. Is it small enough that you can post it here? The question is really how apply_filter is defined in the file. If it is defined conditionally or within another function or class, that could be why the import is not seeing it. Also check to make sure the path given in the error is the path to the correct file. RE: Problem In calling a Function from another python file of project - vinod2810 - Sep-26-2019 I am posting my digital filter code below: from scipy import signal from EEG import eeg_data import array as arr sample_rate = 250 nyquist_rate = sample_rate/2 gMax_Blocks = 32 gMax_Samples = 8 gMax_Channel = 4 # Cofficient for IIR filters b2 = arr.array('d',[0.965080986344733, -0.242468320175764, 1.94539149412878, -0.242468320175764, 0.965080986344733]) a2 = arr.array('d',[1, -0.246778261129785, 1.94417178469135, -0.238158379221743, 0.931381682126902]) b = arr.array('d',[0.200138725658073, 0, -0.400277451316145, 0, 0.200138725658073]) a = arr.array('d',[1, -2.35593463113158, 1.94125708865521, -0.784706375533419, 0.199907605296834]) def apply_filter(): fc = 0.5 # Cut-off frequency of the filter w = fc / (sample_rate / 2) # Normalize the frequency b, a = signal.butter(2, w, 'high') for line in eeg_data: output = arr.arry('d',[signal.filtfilt(b, a, line)]) RE: Problem In calling a Function from another python file of project - ichabod801 - Sep-26-2019 I don't know why that doesn't work. I copied your code and it works for me, although I had to comment out the EEG import as I don't have that module. RE: Problem In calling a Function from another python file of project - vinod2810 - Sep-26-2019 let me post booth of my files first file EEG.py #import os #os.chdir("C:\\Users\\LM HealthCare\\Documents\\Pycharm\\Projects\\EEG") # import Tkinter from tkinter import * from scipy import signal #from Digital_Filter import apply_filter import Digital_Filter from scipy import signal # from win32api import GetSystemMetrics import array as arr import ctypes user32 = ctypes.windll.user32 main = Tk() # Setting Main Window of the Application main.title('NeuroCare') screen_width = main.winfo_screenwidth() screen_height = main.winfo_screenheight() main_Window_width = screen_width - 8 main_Window_height = screen_height - 90 main.geometry("{}x{}+{}+{}".format(main_Window_width, main_Window_height, -5, -3)) main.resizable(0, 0) # Adding menubar and menu options menu = Menu(main) menu.bg = 'black' main.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File", menu=filemenu) filemenu.add_command(label='New') editmenu = Menu(menu) menu.add_cascade(label='Edit', menu=editmenu) # Adding Toolbar options toolbar = Frame(main.master, bd=1, relief=RAISED, bg='light blue') New_button = Button(toolbar, text='Start', activebackground='light grey' ).pack(side=LEFT, padx=2, pady=2) toolbar.pack(side=TOP, fill=X) # Add a canvas to plot eeg waves eeg_canvas = Canvas(main, bg='yellow', width=main_Window_width, height=main_Window_height - 40, relief = SUNKEN).pack(fill=X, side="top") # Reading text file in with open("C:\\Users\\LM HealthCare\\Desktop\\Desktop C drive desktop\\EEG,ECG txt Data\\eeg ch1.txt", "r") as f: eeg_data = f.read() eeg_data = eeg_data.split('\n') for line in eeg_data: #line1 = float(line) # output = arr.array('f',(line1)) output= float(line) Filtered_Data = Digital_Filter.apply_filter(output) main.mainloop()Second File Digital_Filter .py from scipy import signal # from EEG import eeg_data import EEG import array as arr sample_rate = 250 nyquist_rate = sample_rate /2 gMax_Blocks = 32 gMax_Samples = 8 gMax_Channel = 4 # Cofficient for IIR filters b2 = arr.array('d' ,[0.965080986344733, -0.242468320175764, 1.94539149412878, -0.242468320175764, 0.965080986344733]) a2 = arr.array('d' ,[1, -0.246778261129785, 1.94417178469135, -0.238158379221743, 0.931381682126902]) b = arr.array('d' ,[0.200138725658073, 0, -0.400277451316145, 0, 0.200138725658073]) a = arr.array('d' ,[1, -2.35593463113158, 1.94125708865521, -0.784706375533419, 0.199907605296834]) def apply_filter(output): fc = 0.5 # Cut-off frequency of the filter w = fc / (sample_rate / 2) # Normalize the frequency b, a = signal.butter(2, w, 'high' ,analog=False) x = [signal.filtfilt(b, a, output)] return xNow It Is Showing Error: AttributeError: module 'Digital_Filter' has no attribute 'apply_filter' RE: Problem In calling a Function from another python file of project - ichabod801 - Sep-26-2019 Oh, it's a circular import problem. If A imports B, B cannot then import A. It seems the main problem is you want eeg_data from EEG in Digital_Filter. You don't seem to be using it in EEG, so I would probably just load it in Digital_Filter. Another option is to have a third module that loads eeg_data, that both EEG and Digital_Filter can import. RE: Problem In calling a Function from another python file of project - vinod2810 - Oct-05-2019 Thanks for your valuable reply facing another problem similar like this I am posting my error and code below please provide your suggestion Error faced is described below: Backend TkAgg is interactive backend. Turning interactive mode on. Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\LM HealthCare\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__ return self.func(*args) File "C:\Users\LM HealthCare\Documents\Pycharm\Projects\EEG\EEG.py", line 47, in click Click_Listner.Start_click(line) AttributeError: module 'Click_Listner' has no attribute 'Start_click' Code for EEG.py from tkinter import * import numpy as np import Digital_Filter import array as arr import matplotlib.pyplot as plt import Click_Listner import Test # some program constants alpha_band_Hz = [8.0, 10.5] # where to look for the alpha peak noise_band_Hz = [14.0, 20.0] # was 20-40 Hz NFFT = 400 # pitck the length of the fft fs_Hz = 100.0 # assumed sample rate for the EEG data f_lim_Hz = [0, 40] # frequency limits for plotting t_lim_sec = [0, 0] # default plot time limits [0,0] will be ignored alpha_lim_sec = [0, 0] # default output = [] # Array to store float data coverted from string main = Tk() # Reading text file in def read_file(): with open("C:\\Users\\LM HealthCare\\Desktop\\Desktop C drive desktop\\EEG,ECG txt Data\\delta_Band_Power.txt", "r") as f: eeg_data = f.read() eeg_data = eeg_data.split('\n') n = 0 for line in eeg_data: line1 = float(eeg_data[n]) output.append(line1) n += 1 # Applying filters Filtered_Data = Digital_Filter.apply_filter1hz_Highpass(output) t_sec = np.array(range(0, Filtered_Data.size)) / 250 #ax[0].plot(t_sec, Filtered_Data, color='green') Filtered_Data = Digital_Filter.apply_filter60hz_Notch(Filtered_Data) #ax[1].plot(t_sec, Filtered_Data, color='red') Filtered_Data = Digital_Filter.apply_filter120hz_Notch(Filtered_Data) return Filtered_Data # Functions for click events def click(): Test.Ft_data=read_file() for line in Test.Ft_data: Click_Listner.Start_click(line) # Setting Main Window of the Application main.title('NeuroCare') screen_width = main.winfo_screenwidth() screen_height = main.winfo_screenheight() main_Window_width = screen_width - 8 main_Window_height = screen_height - 90 main.geometry("{}x{}+{}+{}".format(main_Window_width, main_Window_height, -5, -3)) main.resizable(0, 0) Filtered_Data = [] # Adding menubar and menu options menu = Menu(main) menu.bg = 'black' main.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label="File", menu=filemenu) filemenu.add_command(label='New') editmenu = Menu(menu) menu.add_cascade(label='Edit', menu=editmenu) # Adding Toolbar options toolbar = Frame(main.master, bd=1, relief=RAISED, bg='light blue') New_button = Button(toolbar, text='Start', activebackground='light grey', command=click ).pack(side=LEFT, padx=2, pady=2) toolbar.pack(side=TOP, fill=X) # Add a canvas to plot eeg waves eeg_canvas = Canvas(main, bg='yellow', width=main_Window_width, height=main_Window_height - 40, relief = SUNKEN).pack(fill=X, side="top") Raw_data = [] #plt.plot(output, 'k-', label='input') #plt.show() # fig, ax = plt.subplots(2,1) # # # ax[0].plot(t_sec, Filtered_Data, color='blue') # ax[0].set_ylim(-100, 100) # ax[0].set_xlim(0, 30) # ax[0].set_ylabel('EEG (uV)') # ax[0].set_xlabel('Time (sec)') # # plt.ylim(-100, 100) # plt.ylabel('EEG (uV)') # plt.xlabel('Time (sec)') # plt.xlim(70, 120) #Filtered_Data = Filtered_Data.__format__('%.5f') #plt.show() #plt.plot(Filtered_Data, 'b-', linewidth=1.5, label='filtered') #plt.show() #Filtered_Data = Filtered_Data.split('\n') x=10 main.mainloop() Code for click_listner: import Functions #import Test def Start_click(xvalue): # for line in Test.Ft_data: Functions.dataEnter = True Functions.Print_Canavas(xvalue) # x=True Code for functions: import EEG currentX = 0 lastX = 0 y1 = 200 y2= 200 dataEnter = False def Print_Canavas(xvalue): currentx = lastX + 0.1 if dataEnter == True : EEG.eeg_canvas.create_line(lastX, y1, currentX , (y2-xvalue), fill = 'Green') EEG.eeg_canvas.create_line(0, 50 * 2, 400, 50 * 2) y1= ( y2 - xvalue ) dataEnter = False lastX = currentX if lastX == EEG.eeg_canvas.width: lastx = 0 Code for Test: Ft_data=[] RE: Problem In calling a Function from another python file of project - ichabod801 - Oct-05-2019 It's the same problem just extended a bit. EEG imports Click_Listener, Click_Listener imports Functions, and Functions tries to import EEG, which isn't finished loading yet because it is still trying to import Click_Listener. This is highlighting why classes and object oriented programming are so useful to GUI programming. You have a function bound to an event, so you don't have control of it's parameters. But you need to access other parts of your GUI from the function. You're trying to do this with imports, so you keep getting circular imports. If the function is part of the same class as the rest of the GUI, it can access the other parts of the GUI using class attributes. I would really recommend learning OOP and classes before moving forward with GUIs. There are lots of tutorials on this site about classes. I even link to one in my signature. |