मैंने एक पायथन लिपि लिखी है जो एक फ़ोल्डर संरचना के माध्यम से चक्रित होती है और किसी दिए गए मान के लिए फ़ाइलों के अंदर दिखती है। लिपि अच्छी तरह से काम करती है, लेकिन अब मैं एक जीयूआई जोड़ने की कोशिश कर रहा हूं और इस त्रुटि को पारित नहीं कर सकता। गुई में 'खोज' पर क्लिक करते समय त्रुटि उत्पन्न होती है, जिससे घटना शुरू हो जाती है।

फ़ाइल "C:\Users\xxxxx\Documents\Python Scripts\FileContentsSearcherwWithFileWrite_GUIv02.py", लाइन 66, में घटना, मान = खिड़की ()। पढ़ें विशेषता त्रुटि: 'टपल' ऑब्जेक्ट में कोई विशेषता नहीं है 'पढ़ें'

मैं सोचता हूं मैं समझता हूं कि स्क्रिप्ट में कहीं न कहीं एक टपल है जिसे विंडो पढ़ने/प्रदर्शित करने का प्रयास कर रही है, लेकिन मैं यह नहीं समझ सकता कि यह क्या हो सकता है। क्या कोई मदद कर सकता है?

धन्यवाद

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() 
0
Steve 14 फरवरी 2021, 14:17
गलत कथन, यह event, values = window.read() होना चाहिए।
 – 
Jason Yang
14 फरवरी 2021, 18:03

1 उत्तर

सबसे बढ़िया उत्तर

आप यह कोशिश कर सकते हैं।

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() 
1
jrwhit 15 फरवरी 2021, 08:26
आपकी मदद जेसन के लिए बहुत बहुत धन्यवाद, यह बहुत अच्छा काम करता है। मैंने अजगर के साथ बहुत कुछ नहीं किया है और जीयूआई मॉड्यूल के साथ भी कम नहीं किया है; आपके समाधान को देखने से मैं इसे स्थानीय चर लेता हूं हमेशा जीयूआई मूल्यों को स्पष्ट रूप से असाइन करने की आवश्यकता होती है? आपके समाधान को समझने में मेरी मदद करने के लिए दो अन्य प्रश्न: 1) "-File_Ext-" मान को एक स्थिति की आवश्यकता क्यों है - [0] - जब यह एक ही विकल्प है? 2) आपने थोड़ी देर के लिए एक 'प्रिंट (एम)' जोड़ा - क्या यह सिर्फ आउटपुट को देखने में आपकी मदद करने के लिए था जैसा आपने देखा था?
 – 
Steve
15 फरवरी 2021, 14:54
हां, आपको अपने जीयूआई कोड को अपने पायथन कोड में यह बताकर जोड़ना होगा कि प्रत्येक चर क्या संदर्भित करता है। [0] प्रश्न पर, [0] को हटा दें और मूल्य का प्रिंट आउट लें और आप देखेंगे कि यह एक शब्दकोश मान है। दस्तावेज़ों के अनुसार, सूची बॉक्स तत्व से वापसी मान परिणामों की एक सूची होगी। एक भी परिणाम नहीं। क्योंकि आप एक से अधिक परिणाम चुन सकते हैं। और हां, आखिरी प्रिंट स्टेटमेंट सिर्फ स्पष्टीकरण के लिए था। उम्मीद है ये मदद करेगा। मैं भी सीख रहा हूं।
 – 
jrwhit
15 फरवरी 2021, 23:13