Reputation: 99
I've written a Python script that cycles through a folder structure and looks inside the files for a given value. The script works well, but now I'm trying to add a GUI and can't get passed this error. The error occurs when clicking 'search' in the gui, triggering the event.
File "C:\Users\xxxxx\Documents\Python Scripts\FileContentsSearcherwWithFileWrite_GUIv02.py", line 66, in event, values = window().read AttributeError: 'tuple' object has no attribute 'read'
I think I understand that there is a tuple somewhere in the script that the window is trying to read/display, but I can't figure out what it could be. Is anyone able to help?
Thanks
import os, PySimpleGUI as sg
document_ext = ['.SVG', '.txt', '.XML']
layout = [
[
sg.Text("This program can be used to search for a particular \nterm in all files under the folder location provided.")
],
[
sg.Listbox(document_ext, size=(10,5), key="-File_Ext-")
],
[
sg.Text('What would you like to search for?')
],
[
sg.InputText(size=(30,5), key="-Search_Term-")
],
[
sg.Text("Choose Folder to Search:")
],
[
sg.In(size=(30,5), key="-FOLDER-"),
sg.FolderBrowse()
],
[
sg.Text("Where Should Report Be Saved?")
],
[
sg.In(size=(30,5), key="-FOLDER2-"),
sg.FolderBrowse()
],
[
sg.Button(button_text="Search")
],
[
sg.Text(key="-Output-", size=(30,5))
]
]
window = sg.Window("File Contents Searcher", layout)#, margins=(200,200))
def main(svalue, location, ext):
number_found = 0
search_results = ""
os.chdir(location)
for dpath, dname, fname in os.walk(os.getcwd()):
for name in fname:
pat = os.path.join(dpath,name)
if name.endswith(ext):
with open(pat) as f:
if svalue in f.read():
number_found += 1
search_results += "--- \nFilename: {} \nFilepath: {} \n".format(name, pat)
search_results_head = "\"{}\" was found in {} files. \n \n".format(svalue, number_found)
output = "RESULTS \n \n" + search_results_head + search_results
return output, search_results_head
def create_log(sl, s_res):
os.chdir(sl)
print(os.getcwd())
with open("FileSearchResults.txt", "w") as f:
f.write(s_res)
return "Report Saved"
while True:
event, values = window().read
if event == sg.WIN_CLOSED:
break
if event == "Search":
m = main("-Search_Term-", r"-FOLDER-", "-File_Ext-")
c = create_log(r"-FOLDER2-", m[0])
window("-Output-").update(print(m[1] + " " + c))
window.close()
Upvotes: 0
Views: 659
Reputation: 28
You might try this.
import os, PySimpleGUI as sg
document_ext = ['.SVG', '.txt', '.XML']
layout = [
[
sg.Text("This program can be used to search for a particular \nterm in all files under the folder location provided.")
],
[
sg.Listbox(document_ext, size=(10,5), key="-File_Ext-")
],
[
sg.Text('What would you like to search for?')
],
[
sg.InputText(size=(30,5), key="-Search_Term-")
],
[
sg.Text("Choose Folder to Search:")
],
[
sg.In(size=(30,5), key="-FOLDER-"),
sg.FolderBrowse()
],
[
sg.Text("Where Should Report Be Saved?")
],
[
sg.In(size=(30,5), key="-FOLDER2-"),
sg.FolderBrowse()
],
[
sg.Button(button_text="Search")
],
[
sg.Multiline(key="-Output-", size=(30,5))
]
]
window = sg.Window("File Contents Searcher", layout)#, margins=(200,200))
def main(svalue, location, ext):
number_found = 0
search_results = ""
location = (values["-FOLDER-"]) # Set values to window.read() values
svalue= (values["-Search_Term-"]) # Ditto for this
ext = str(values["-File_Ext-"][0].lower()) # Needs this to choose value and make it case insensitive
#os.chdir(location) # Don't need
for dpath, dname, fname in os.walk(location): #Hardcoded to value above
for name in fname:
pat = os.path.join(dpath,name)
if name.endswith(ext):
with open(pat) as f:
if svalue in f.read():
number_found += 1
search_results += "--- \nFilename: {} \nFilepath: {} \n".format(name, pat)
search_results_head = "\"{}\" was found in {} files. \n \n".format(svalue, number_found)
output = "RESULTS \n \n" + search_results_head + search_results
return output, search_results_head
def create_log(sl, s_res):
s1 = (values["-FOLDER2-"]) # Hardcoded again
print(os.getcwd())
with open("FileSearchResults.txt", "w") as f:
f.write(s_res)
return "Report Saved"
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
if event == "Search":
m = main("-Search_Term-", "-FOLDER-", "-File_Ext-")
print(m)
c = create_log(r"-FOLDER2-", m[0])
window["-Output-"].update(m[1] + " " + c)
window.close()
Upvotes: 1