首页 > 解决方案 > 如何将动态参数作为参数传递

问题描述

我有以下代码:

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()

现在我想做的是:

我想将变量 ip_path_field,op_path_field,filename 作为参数传递给名为scraper的函数。现在 ip_path_field,op_path_field,filename 都是用户输入,而不是硬编码字符串。现在,每当我运行以下代码时,我都会打开 GUI,每当我在所需的编辑框中提供我的输入并按下提交按钮时,我都会收到以下错误名称“ip_path_field”未定义。我使用此代码的目的是将用户定义的文件路径传递给上面代码中定义的名为scraper () 的函数。

标签: python-3.xtkinter

解决方案


您需要创建一个获取值的回调,然后将它们传递给执行该工作的函数。

例子:

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)

推荐阅读