2

I have the following code :

from tkinter import *


class GUI: 
        
    def __init__(self,master):
        
        
        self.ip_word  = Label(master,text="Input Path")
        self.ip_word.grid(row=0,sticky=E)   
        
        self.ip_path_field = Entry(master)
        self.ip_path_field.grid(row=0,column=1,sticky=W)
        
        self.op_word  = Label(master,text="Output Path")
        self.op_word.grid(row=2,sticky=E)
        
        self.op_path_field = Entry(master)
        self.op_path_field.grid(row=2,column=1,sticky=W)
        
        self.filename_word=Label(master,text="Output Filename ")
        self.filename_word.grid(row=4,sticky=E)
        
        self.filename =Entry(master)
        self.filename.grid(row=4,column=1,sticky=W)
        
        self.Submit = Button(master,text="Submit",fg="black",bg="white",command=self.Scraper(ip_path_field,op_path_field,filename) )
        self.Submit.grid(row=5,columnspan=2)
    """        
    def printMessage(self):
        str1=ip_path_field
        str2=op_path_field
        str3=filename
        Scraper(str1,str2,str3)"""
     
    
    
    def Scraper(self,ip_path_field,op_path_field,filename):
        import pandas as pd
        import os
        # "C:/Users/chowdhuryr/Desktop/first automation/MAIN RESEARCH DATA.xlsx"
        user_input =ip_path_field#input("Enter the input file path of your file: ")
        
        if os.path.exists(user_input):
               df = pd.read_excel(user_input, sheetname='Sheet1')
               print("File Found and We are Processing !")
        else:  
            print ("Input Directory does not exists.")
        #"C:/Users/chowdhuryr/Desktop/first automation/OUTPUT DATA.xlsx"
        user_output =op_path_field#input("Enter the output file path of your file: ")
        
        #if os.path.exists(user_input):
               #df = pd.read_excel(user_input, sheetname='Sheet1')
        #--------------------------------------------------------------------------------------------------------------------------------------
        #setting up the path 
        import os
        os.chdir('C:/Users/chowdhuryr/Desktop/first automation')
        
        df=df[0:5]
        #--------------------------------------------------------------------------------------------------------------------------------------
        #importing necessary packages 
        from selenium import webdriver 
        #from selenium.webdriver.common.keys import Keys
        from selenium.common.exceptions import NoSuchElementException
        
        #---------------------------------------------------------------------------------------------------------------------------------------
        
        
        #Setting up Chrome webdriver 
        #chrome_options = webdriver.ChromeOptions()
        options = webdriver.ChromeOptions()
        options.add_argument("--headless") #making the window work in the background
        options.add_argument('window-size=1200x850')
        
        
        #declaring a list to store the messages 
        Message=list()
        
        Tier=list()
        
        Wirecentre=list()
        
        
        
        #---------------------------------------------------------------------------------------------------------------------------------------
        #iteration to access the url and and retriving the Tier Locations 
        
        for i in range(0,df.shape[0]): #(0,df.shape[0]):
            
            driver = webdriver.Chrome(executable_path='C:/Users/chowdhuryr/Desktop/first automation/chromedriver', chrome_options=options) #openning chrome
            #driver.maximize_window() #maximizing the window 
            
            driver.get('https://clec.att.com/facilitiescheck/facilities_chk.cfm') #openning the url 
            
            street_address=driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[2]/input') #accessing the street address field 
            street_address.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[0])  #passing the values to street_address location 
            
            city=driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/input') #accessing the city to street address field 
            city.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[1]) #passing the values to the city location 
        
            state=driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[4]/td[2]/select') #accessing the state field 
            state.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[2]) #passing the values to the state field 
        
            checkbox=driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[8]/td[1]/input') #accessing the checkbox 
            checkbox.click()  #clicking on the check box 
        
            search_button=driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[8]/td[1]/input') #accessing the submit button 
            search_button.submit() #clicking the submit button 
           
            #try-except block in case if radio button appears 
            try:
                Address=driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[1]/td[2]/b') #taking the xpath of the address block 
                if (Address):         #checking if it contains any radio button or not 
                    Radio_button=driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/td[1]/input') #getting the xpath of radio button 
                    Radio_button.click()   #clicking the radio button                                                                           
                    submit_button=driver.find_element_by_xpath('/html/body/form/table[3]/tbody/tr[2]/td/input') #getting the submit button
                    submit_button.submit()
            except NoSuchElementException:
                 print('no such element found')
                 
                
                
                
            message_body= driver.find_element_by_xpath('//*[@id="msg"]/table/tbody/tr/td').text #Extracting the Message from the message box 
            Message.append(message_body[14:]) #putting the message into a text 
            
            str = message_body.split() #splitting the message 
            
            if any ("Tier"in s for s in str):
               j=str.index('Tier')
               Tier.append(str[j+1])
            else:
               Tier.append("NULL")
               
            if any ("AT&T"in s for s in str):
               j=str.index('AT&T')
               Wirecentre.append(str[j+1])
            else:
               Wirecentre.append("NULL")
           
            #saving the screenshot 
            str=df['STRIP_EC_CIRCUIT_ID'][i]
            filename="C:\\Users\\chowdhuryr\\Desktop\\first automation\\"+str+".png"  #Taking the circuit id name 
            driver.get_screenshot_as_file(filename)
        
            driver.close() #closiing the driver 
            
        #------------------------------------------------------------------------------------------------------------------------------------------
        
        #putting the back thenew columns into the dataframe and storing it into an excel sheet 
            
        df['Tier']=Tier   #putting the Tier column back into the dataset 
        df['Wirecentre']=Wirecentre #putting the Wirecentre column back into the dataset 
        df['Message']=Message  #putting the Message column back into the dataset 
        if os.path.exists(user_output):
            user_output="user_output"+filename+".xlsx"
            writer = pd.ExcelWriter(user_output)    #writing the dataframe down into a new excel file 
            df.to_excel(writer,'sheet1',index=False)        #to_excel(writer,'Sheet1')    
            writer.save()
        else:
            print ("Output Directory does not exists.")
            
        
        #-------------------------------------------------------------------------------------------------------------------------------------------
        
        #Generating pop up window at the end of the process 
        popup_driver=webdriver.Chrome()
        popup_driver.maximize_window()
        popup_driver.execute_script(" window.alert('Process is Completed');") #generating the pop up """
        




root =Tk()
b=GUI(root) 
#b.Scraper(ip_path_field,op_path_field,filename)   
root.mainloop()

Now what I want to do is this :

I want to pass the variables ip_path_field,op_path_field,filename as arguments to the function named scraper . Now ip_path_field,op_path_field,filename are all user inputs and not hard coded strings. Now whenever I run the following code, I get the GUI opened and whenever I provide my inputs in the required edit boxes and press the submit button I get the following error name 'ip_path_field' is not defined. My purpose of this code is to pass the user defined file paths to the function called scraper() as defined in the code above.

  • 1
    Possible duplicate of [Why is Button parameter “command” executed when declared?](https://stackoverflow.com/questions/5767228/why-is-button-parameter-command-executed-when-declared) – fhdrsdg Sep 17 '18 at 12:21
  • No I tried the option where I passed in the command an intermediate function without any parameter from which I called my Scrapper function. But that also shows the same error. – Ratul Chowdhury Sep 17 '18 at 12:25
  • And in addition to the question I linked, you try to pass `ip_path_field`, which is the Entry object itself. To get the content of the Entry widget use `ip_path_field.get()`. – fhdrsdg Sep 17 '18 at 12:25
  • File "C:/Users/chowdhuryr/Desktop/first automation/Audit_file.py", line 38, in printMessage str1=ip_path_field.get() NameError: name 'ip_path_field' is not defined This is the error I get. – Ratul Chowdhury Sep 17 '18 at 12:27
  • @fhdrsdg I have tried to pass a parameter less function from the command in Button() in __init__ which in turn calls my Scrapper(). But this shows the same old error. – Ratul Chowdhury Sep 17 '18 at 12:30
  • Oh yeah it's `self.ip_path_field`, not `ip_path_field`. – fhdrsdg Sep 17 '18 at 12:31

2 Answers2

3

You need to create a callback that gets the values, and then passes them to the function that does the work.

Example:

class GUI: 

    def __init__(self,master):
        ...
        self.Submit = Button(..., command=self.handle_submit)
        ...

    def handle_submit(self):
        ip_path = self.ip_path_field.get()
        op_path = self.op_path_field.get()
        filename = self.filename.get()

        self.Scrapper(ip_path_field,op_path_field,filename)
Bryan Oakley
  • 370,779
  • 53
  • 539
  • 685
0

The main problem you are having is related to how you built your method. Instead you should have put the get() calls inside that method. This way you can simple run the command to call scraper without needing to pass arguments. I have taken your code and re-written it to more closely follow the PEP8 standard with the method correction included.

You only need to apply the self. prefix to class attributes/methods. Things like labels/buttons that are not going to be modified later in the code should be left as normal widgets that are not assigned as attributes.

Next I moved all your imports to the top of the code. You only need to import a library one time and it should all be listed at the top of your code. On imports keep in mind it is better to import tkinter as tk instead of using * to prevent any accidental overrides occurring.

I have changed your string concatenation to use the format() method as + is deprecated.

Here is your code with some basic clean up as well.

import tkinter as tk
import pandas as pd
import os
from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException

class GUI: 
    def __init__(self,master):
        tk.Label(master, text="Input Path").grid(row=0, sticky="e")
        tk.Label(master, text="Output Path").grid(row=2, sticky="e")
        tk.Label(master, text="Output Filename").grid(row=4, sticky="e")

        self.ip_path_field = tk.Entry(master)
        self.op_path_field = tk.Entry(master)
        self.filename = tk.Entry(master)

        self.ip_path_field.grid(row=0, column=1, sticky="w")
        self.op_path_field.grid(row=2, column=1, sticky="w")
        self.filename.grid(row=4, column=1, sticky="w")

        tk.Button(master, text="Submit", fg="black", bg="white",
               command=self.scrapper).grid(row=5,columnspan=2)

    def scrapper(self): # changed function to a method.
        user_input = self.ip_path_field.get(0, "end")
        user_output = self.op_path_field.get(0, "end")
        filename = self.filename.get(0, "end")

        if os.path.exists(user_input):
            df = pd.read_excel(user_input, sheetname='Sheet1')
            print("File Found and We are Processing !")
        else:  
            print ("Input Directory does not exists.")

        os.chdir('C:/Users/chowdhuryr/Desktop/first automation')
        df = df[0:5]

        options = webdriver.ChromeOptions()
        options.add_argument("--headless")
        options.add_argument('window-size=1200x850')

        message = list()
        tier = list()
        wirecentre = list()

        for i in range(0,df.shape[0]):

            driver = webdriver.Chrome(executable_path='C:/Users/chowdhuryr/Desktop/first automation/chromedriver', chrome_options=options)
            driver.get('https://clec.att.com/facilitiescheck/facilities_chk.cfm') 
            street_address = driver.find_element_by_xpath('/html/body/form/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td[2]/input') 
            street_address.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[0]) 
            city=driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[2]/td[2]/input') 
            city.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[1]) 
            state = driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[4]/td[2]/select') 
            state.send_keys(df['CIRCUIT_LOC_ADDR'][i].split(',')[2]) 
            checkbox = driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[8]/td[1]/input') 
            checkbox.click() 
            search_button = driver.find_element_by_xpath('/html/body/form/table[1]/tbody/tr[2]/td[2]/table/tbody/tr[8]/td[1]/input') 
            search_button.submit()

            try:
                address = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[1]/td[2]/b') 
                if (address):
                    radio_button = driver.find_element_by_xpath('/html/body/form/table[2]/tbody/tr[2]/td[1]/input') 
                    radio_button.click()
                    submit_button = driver.find_element_by_xpath('/html/body/form/table[3]/tbody/tr[2]/td/input')
                    submit_button.submit()
            except NoSuchElementException:
                print('no such element found')

            message_body = driver.find_element_by_xpath('//*[@id="msg"]/table/tbody/tr/td').text 
            message.append(message_body[14:]) 
            strx = message_body.split() 

            if any ("Tier"in s for s in strx):
                j = strx.index('Tier')
                tier.append(strx[j+1])
            else:
                tier.append("NULL")

            if any ("AT&T"in s for s in strx):
                j = strx.index('AT&T')
                wirecentre.append(strx[j+1])
            else:
                wirecentre.append("NULL")

            strx = df['STRIP_EC_CIRCUIT_ID'][i]
            filename = "C:\\Users\\chowdhuryr\\Desktop\\first automation\\{}.png".format(strx)
            driver.get_screenshot_as_file(filename)
            driver.close() 

        df['Tier'] = tier
        df['Wirecentre'] = wirecentre
        df['Message'] = message
        if os.path.exists(user_output):
            user_output="user_output{}.xlsx".format(filename)
            writer = pd.ExcelWriter(user_output)
            df.to_excel(writer, 'sheet1', index=False) 
            writer.save()
        else:
            print ("Output Directory does not exists.")

        popup_driver = webdriver.Chrome()
        popup_driver.maximize_window()
        popup_driver.execute_script(" window.alert('Process is Completed');")

root = tk.Tk()
b = GUI(root) 
root.mainloop()

All that said you should try to use a minimal code next time. It is easier to fix issues when you narrow it down to exactly the problem. For example based on your question a Minimal, Complete, and Verifiable example would look something like this.

from tkinter import *
from selenium import webdriver 
from selenium.common.exceptions import NoSuchElementException

class GUI: 
    def __init__(self,master):

        self.ip_path_field = Entry(master)
        self.ip_path_field.grid(row=0,column=1,sticky=W)

        self.op_path_field = Entry(master)
        self.op_path_field.grid(row=2,column=1,sticky=W)

        self.filename =Entry(master)
        self.filename.grid(row=4,column=1,sticky=W)

        self.Submit = Button(master, text="Submit",
                         command=self.Scrapper(ip_path_field,op_path_field,filename) )
        self.Submit.grid(row=5,columnspan=2)

    def Scrapper(self,ip_path_field,op_path_field,filename):
        user_input = ip_path_field
        user_output = op_path_field
        filename = filename


root = Tk()
b = GUI(root) 
root.mainloop()
Mike - SMT
  • 14,784
  • 4
  • 35
  • 79