First of All, I have to say that I am a beginner in Python, so my code might appears redundant or muddled.
I made this code which consists of two classes that are both tkinter frame. The class ExportGUI
inherits from Hdf5GUI
and is called by the function export
. The thing is I am trying to access the parent variable datasetsfilter
through a child function but it doesnt work :
# Parent class
class Hdf5GUI(GUI):
def __init__(self,hdf5w,master):
# Frame definition
self.master = master # parent root
self.hdf5w = hdf5w #root
self.hdf5w.title('Hdf5 Reader')
self.hdf5w.rowconfigure(0,weight=1)
self.hdf5w.columnconfigure(0,weight=1)
self.hdf5w.columnconfigure(1,weight=1)
self.frameDataset = Frame(self.hdf5w,padx=5,pady=5)
self.frameDataset.grid(row=0,column=0,sticky='wesn')
self.frameDataset.rowconfigure(1,weight=1)
self.frameDataset.columnconfigure(0,weight=1)
self.datasetpath_button = Button(self.frameDataset,text="Export dataset path",command = self.exportDatasetPath)
self.datasetpath_button.grid(row=0,column=0,columnspan=2,pady=5,sticky='nwe')
self.dataset_scrollbar = Scrollbar(self.frameDataset)
self.dataset_scrollbar.grid(row=1,column=1,sticky='esn')
self.dataset_listbox = Listbox(self.frameDataset,exportselection=0)
self.dataset_listbox.grid(row=1,column=0,sticky='wesn')
self.dataset_listbox.bind('<<ListboxSelect>>', self.onSelectDataset)
self.dataset_listbox.config(yscrollcommand=self.dataset_scrollbar.set)
self.dataset_scrollbar.config(command=self.dataset_listbox.yview)
self.datatype_scrollbar = Scrollbar(self.frameDataset)
self.datatype_scrollbar.grid(row=2,column=1,sticky='esn')
self.datatype_listbox = Listbox(self.frameDataset,selectmode='extended',exportselection=0)
self.datatype_listbox.grid(row=2,column=0,sticky='wesn')
# self.dataset_listbox.bind('<<ListboxSelect>>', self.onSelectDataset)
#
self.datatype_listbox.config(yscrollcommand=self.datatype_scrollbar.set)
self.datatype_scrollbar.config(command=self.datatype_listbox.yview)
self.frameFilter = Frame(self.frameDataset)
self.frameFilter.grid(row=3,column=0,sticky='wen')
self.frameFilter.columnconfigure(0,weight=1)
self.frameFilter.columnconfigure(1,weight=1)
self.frameFilter.columnconfigure(2,weight=1)
self.frameFilter.columnconfigure(3,weight=1)
self.filter_label = Label(self.frameFilter,text="Dataset filter")
self.filter_label.grid(row=0,column=0,columnspan=4,sticky='wen')
self.filter0 = Listbox(self.frameFilter,exportselection=0)
self.filter0.grid(row=1,column=0,sticky='wen')
self.filter0.bind('<<ListboxSelect>>', self.onSelectFilter0)
self.filter1 = Listbox(self.frameFilter,exportselection=0)
self.filter1.grid(row=1,column=1,sticky='wen')
self.filter1.bind('<<ListboxSelect>>', self.onSelectFilter1)
self.filter2 = Listbox(self.frameFilter,exportselection=0)
self.filter2.grid(row=1,column=2,sticky='wen')
self.filter2.bind('<<ListboxSelect>>', self.onSelectFilter2)
self.filter3 = Listbox(self.frameFilter,exportselection=0)
self.filter3.grid(row=1,column=3,sticky='wen')
self.frameFile = Frame(self.hdf5w,padx=5,pady=5)
self.frameFile.grid(row=0,column=1,sticky='wesn')
self.frameFile.rowconfigure(1,weight=1)
self.frameFile.columnconfigure(0,weight=1)
self.folderPath_button = Button(self.frameFile,text="Open files in directory",command=self.exportFiles)
self.folderPath_button.grid(row=0,column=0,columnspan=2,pady=5,sticky='wen')
self.files_listbox = Listbox(self.frameFile,selectmode='extended',exportselection=0)
self.files_listbox.grid(row=1,column=0,sticky='wesn')
self.files_scrollbar = Scrollbar(self.frameFile)
self.files_scrollbar.grid(row=1,column=1,sticky='esn')
self.files_listbox.config(yscrollcommand=self.files_scrollbar.set)
self.files_scrollbar.config(command=self.files_listbox.yview)
self.displayData_button = Button(self.frameFile, text="display dataset", command=self.displayData)
self.displayData_button.grid(row=2,column=0,columnspan=2,padx=10,pady=5,sticky='wen')
self.displayTxt_button = Button(self.frameFile, text="Export", command=self.export)
self.displayTxt_button.grid(row=2,column=1,columnspan=2,padx=10,pady=5,sticky='wen')
# self.lblFrame = LabelFrame()
self.hdf5w.protocol("WM_DELETE_WINDOW", self.onClosing)
self.hdf5w.mainloop()
def exportDatasetPath(self):
self.dataset_listbox.delete(0,'end')
self.filter0.delete(0,'end')
self.filter1.delete(0,'end')
self.filter2.delete(0,'end')
self.filter3.delete(0,'end')
self.ohdf5 = Hdf5()
print(self.ohdf5.loadcase_label_list)
i = 0
for dataset in self.ohdf5.datasets:
self.dataset_listbox.insert(i,dataset)
i+=1
i = 0
for item in self.ohdf5.filter0:
self.filter0.insert(i,item)
i+=1
def onSelectDataset(self,evt):
self.datatype_listbox.delete(0,'end')
index = self.dataset_listbox.curselection()[0]
datasetPath = self.dataset_listbox.get(index)
self.odataset = self.ohdf5.getDataset(datasetPath)
i=0
for col in self.odataset.columns:
self.datatype_listbox.insert(i,col)
i+=1
def onSelectFilter0(self,evt):
self.dataset_listbox.delete(0,'end')
self.filter1.delete(0,'end')
self.filter2.delete(0,'end')
self.filter3.delete(0,'end')
index = self.filter0.curselection()[0]
item0 = self.filter0.get(index)
if item0 == 'NASTRAN':
i = 0
for dataset in self.ohdf5.datasets:
self.dataset_listbox.insert(i,dataset)
i+=1
else:
self.ohdf5.setFilterGroupPath(item0)
self.ohdf5.setFilterGroup(self.ohdf5.filterGroupPath)
i = 0
self.datasetsfilter = self.ohdf5.getDatasets(self.ohdf5.filterGroupPath)
for dataset in self.datasetsfilter:
self.dataset_listbox.insert(i,dataset)
i+=1
i = 0
for item in self.ohdf5.filter1:
self.filter1.insert(i,item)
i+=1
def onSelectFilter1(self,evt):
self.dataset_listbox.delete(0,'end')
self.filter2.delete(0,'end')
self.filter3.delete(0,'end')
index = self.filter0.curselection()[0]
item0 = self.filter0.get(index)
index = self.filter1.curselection()[0]
item1 = self.filter1.get(index)
self.ohdf5.setFilterGroupPath(item0,item1)
self.ohdf5.setFilterGroup(self.ohdf5.filterGroupPath)
i = 0
self.datasetsfilter = self.ohdf5.getDatasets(self.ohdf5.filterGroupPath)
print(self.datasetsfilter)
for dataset in self.datasetsfilter:
self.dataset_listbox.insert(i,dataset)
i+=1
i = 0
for item in self.ohdf5.filter2:
self.filter2.insert(i,item)
i+=1
def onSelectFilter2(self,evt):
self.dataset_listbox.delete(0,'end')
self.filter3.delete(0,'end')
index = self.filter0.curselection()[0]
item0 = self.filter0.get(index)
index = self.filter1.curselection()[0]
item1 = self.filter1.get(index)
index = self.filter2.curselection()[0]
item2 = self.filter2.get(index)
self.ohdf5.setFilterGroupPath(item0,item1,item2)
self.ohdf5.setFilterGroup(self.ohdf5.filterGroupPath)
i = 0
self.datasetsfilter = self.ohdf5.getDatasets(self.ohdf5.filterGroupPath)
print(self.datasetsfilter)
for dataset in self.datasetsfilter:
self.dataset_listbox.insert(i,dataset)
i+=1
i = 0
for item in self.ohdf5.filter3:
self.filter3.insert(i,item)
i+=1
def exportFiles(self):
self.files_listbox.delete(0,'end')
title = 'Choose the working HDF5 directory where there are *.h5 files :'
Tk().withdraw()
dirname_root = askdirectory(initialdir=os.getcwd(), title = title)
self.filePath_list = []
for folders, subfolders,files in os.walk(dirname_root):
for f in files:
ext = os.path.splitext(f)[1]
if ext == '.h5': self.filePath_list.append(os.path.join(folders,f))
i = 0
for path in self.filePath_list:
self.files_listbox.insert(i,os.path.basename(path))
i+=1
def onClosing(self):
# if tkMessageBox.askokcancel("Quit", "Do you want to quit?"):
self.hdf5w.destroy()
self.show(self.master)
def displayData(self):
print('function dislaying datas')
datas = self.datatype_listbox.curselection()
print(datas)
new_window = Toplevel(self.frameFile)
w = DisplayDataGUI(new_window, self.odataset, datas)
def get_datasetsfilter(self):
return self.datasetsfilter
def export(self):
new_window2 = Toplevel(self.frameFile)
w = ExportGUI(self.hdf5w,new_window2)
So until now my code perfectly works but I had to complete my program with some other functions that I call in ExportGUI
. For example export_filter
.
#==============================================================================
# Child class
#==============================================================================
class ExportGUI(Hdf5GUI):
def __init__(self,hdf5w, master):
self.master = master
self.master.title("Export")
self.master.geometry('200x200')
label = Label(self.master, text="Choose the kind of export")
label.place(x=20, y=0)
export_selected = Button(self.master, text = 'Export filters',command=self.export_filter)
export_selected.place(x=20, y=50)
self.master.mainloop()
def export_filter(self):
print(self.ohdf5.datatsetsfilter)
But I got the following error :
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\ProgramData\Anaconda2\lib\lib-tk\Tkinter.py", line 1542, in __call__
return self.func(*args)
File "GUI\GUI.py", line 397, in export_filter
print(self.ohdf5.datatsetsfilter)
AttributeError: 'ExportGUI' object has no attribute 'ohdf5'
Neither ohdf5
or datatsetsfilter
is known by ExportGUI
(I had the same error with self.datatsetsfilter
).
Considering this code didnt work I tried to use the super
function. I created a function get_datasetsfilter
in Hdf5GUI
:
def get_datasetsfilter(self):
return self.datasetsfilter
and then called it in ExportGUI
(I added __metaclass__ = type
to fix type prblm in 2.7) :
def export_filter(self):
super(ExportGUI, self).get_datasetsfilter
I admit I saw many other exemple with Super
but they all seems to be used in __init__
method. However, it still doesnt work. I am now wondering if the error results from my bad comprehension of inheritance or tkinter
.