在tkinter中按下“浏览”按钮时,如何填充条目窗口小部件?

时间:2018-09-19 08:13:45

标签: python tkinter web-scraping

我有以下代码,其目的是打开一个GUI,该GUI允许我从指定的路径浏览文件,然后单击“提交”按钮,然后从xlsx文件和该文件的输出在线填充网页。网页再次存储在输出xlsx文件中。 我的代码实现了所有目标。但是有一个问题-我在编辑小部件旁边有一个浏览按钮,它使我可以浏览文件路径以在GUI中获取输入文件。现在,我按下浏览按钮的那一刻,虽然它获取文件,但是将文件路径放在浏览按钮旁边,如下所示: enter image description here

代码是这样的:

from tkinter import *
from tkinter import messagebox as msg
from tkinter import filedialog as fd
from tkinter import ttk

class GUI: 

    def __init__(self,master):


        master.title("Webscrapper")

        self.LabelFrame=ttk.Labelframe(master)
        self.LabelFrame.grid(row=0,column=3)

    self.ip_word  = Label(master,text="File Path")
    self.ip_word.grid(row=0,sticky=E) 

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

    self.browse_file=Button(master,text="Browse",command=self.file_found)
    self.browse_file.grid(row=0,column=2,sticky=E)
    #self.path_field=self.path_browse.get()

    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.printMessage )
    self.Submit.grid(row=5,column=1)

    self.quit_button=Button(master,text="Quit",command= master.destroy)
    self.quit_button.grid(row=5,column=2)

def file_found(self):

    self.path_browse=fd.askopenfilename(initialdir="/",title="Select A file",filetype=(("Excel Workbook","*.xlsx"),("All Files","*.*")))
    self.label=ttk.Label(self.LabelFrame,text="")
    self.label.grid(row=1,column=1)
    self.label.configure(text=self.path_browse)
    self.path_field.bind("<Return>",self.path_browse)


def printMessage(self):

    str1=self.path_field.get()
    str2=self.filename.get()
    self.Scrapper(str1,str2)



def Scrapper(self,path_field,filename):
    import pandas as pd
    import os
    # "C:/Users/chowdhuryr/Desktop/first automation/MAIN RESEARCH DATA.xlsx"
    user_path =path_field #input file path of your file

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

    head, tail = os.path.split(user_path)
    path=head+"/"
    output=filename
    #"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]
        image_name=path+str+".png"  #Taking the circuit id name 
        driver.get_screenshot_as_file(image_name)

        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 
    user_output=path+output+".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()


    #-------------------------------------------------------------------------------------------------------------------------------------------
    self.popup()
    #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 """

def popup(self):
   msg.showinfo("your process is completed.")



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

部分代码:

self.browse_file=Button(master,text="Browse",command=self.file_found)
self.browse_file.grid(row=0,column=2,sticky=E)

调用file_found(),它会浏览路径以获取文件,但这不会填充

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

其中self.path_field是条目小部件,应由浏览按钮获得的文件路径填充。

1 个答案:

答案 0 :(得分:1)

好吧;据我了解,您希望文件路径位于条目中,而不是在单独的Label中。但是在您的代码中,您将其放在单独的标签中,而不是在条目中...

这是一个如何在条目中放置路径的示例:

def file_found(self):
    self.path_browse=fd.askopenfilename(initialdir="/",title="Select A file",
        filetype=(("Excel Workbook","*.xlsx"),("All Files","*.*")))
    self.path_field.delete(0,END)    # Remove any previous content
    self.path_field.insert(0,self.path_browse)  # Insert new content

我不太清楚您要达到的目标:

self.path_field.bind("<Return>",self.path_browse)

它将path_field条目中的Return绑定到变量...