0

How would I go about printing out the results in my tkinter text window? Right now the "information fetching" part from selenium is working and printing into cmd, however, the TKinter window freezes and then proceeds to crash. I was considering a updating loop for the textwindow so that TKinter would see if there was an update to be made. But Im unsure if this will work, as I believe the problem is running the code and window simultaneously.

from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
from tkinter import *
import sys

def Program():
#Giving search a value through Entry
    search = entrySearch.get()

#Initializing Webdriver
    driver = webdriver.Chrome('C:/Users/Oliver/Desktop/chromedriver', chrome_options=chrome_options)
    driver.create_options()
    driver.get("http://www.allabolag.se/what/"+search)
    print("Accessing Database...")

#Selecting 'Href' Company Link in search and clicking
    try:
        select = driver.find_element_by_partial_link_text(search).click()
        print("Element Found...")
    except:
        driver.refresh()
        select = driver.find_element_by_xpath('/html/body/div[4]/div[4]/div/div[2]/div[1]/article/div/div/div[1]/h2/a').click()
        print("Backup Element Found...")

#Collecting company information
    try:
        company = driver.find_element_by_xpath('/html/body/div[4]/div[5]/div/div[1]/div[1]/div/div/div/h1').get_attribute("innerHTML")
        revenue = driver.find_element_by_xpath('/html/body/div[4]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[1]/td[1]').get_attribute("innerHTML")
        profit = driver.find_element_by_xpath('/html/body/div[4]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[3]/td[1]').get_attribute("innerHTML")
        assets = driver.find_element_by_xpath('/html/body/div[4]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[4]/td[1]').get_attribute("innerHTML")
        print("Got Results...")
    except:
        company = driver.find_element_by_xpath('/html/body/div[7]/div[5]/div/div[1]/div[1]/div/div/div/h1').get_attribute("innerHTML")
        revenue = driver.find_element_by_xpath('/html/body/div[7]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[1]/td[1]').get_attribute("innerHTML")
        profit = driver.find_element_by_xpath('/html/body/div[7]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[3]/td[1]').get_attribute("innerHTML")
        assets = driver.find_element_by_xpath('/html/body/div[7]/div[5]/div/div[1]/div[3]/div/div[1]/div[1]/div[1]/div[2]/div[1]/table/tbody/tr[4]/td[1]').get_attribute("innerHTML")
        print("Got Backup Results...")

        resultOutput.insert(END, company)

#Printing spaces in cmd for easy reading
    i=0
    while i < 25:
        print(" ")
        i+=1

#Printing result
    print("Företag: " +company.strip())
    print("Omsättning: " + revenue.strip() + " 000"+" kr")
    print("Vinst: " + profit.strip() + " 000"+" kr")
    print("Tillgångar: " + assets.strip() + " 000"+" kr")

    restart = input("Tryck 'R' för att start om eller 'S' för att avsluta: ")
    if restart == "s":
        sys.exit()
    else:
        Program()


#Running chromedriver borderless and avoiding annoying log spams
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--log-level=3")

#Initializing TKinter window
root = Tk()

frame = Frame(root, bg='#86c5da')
frame.place(relwidth=1, relheight=1)

entrySearch = Entry(frame, bg='white')
entrySearch.place(relwidth=0.4, relheight=0.05, relx=0.3, rely=0.05)

entryButton = Button(entrySearch, text='Search', bg='#143641', fg='white', command = Program)
entryButton.place(relwidth=0.1, relheight=1, relx=0.9)

resultScroll = Scrollbar(frame)
resultOutput = Text(frame, bg='white', fg='black')
resultScroll.pack(side=RIGHT, fill=Y)
resultOutput.place(relwidth=0.5, relheight=0.6, relx=0.25, rely=0.2)
resultScroll.config(command=resultOutput.yview)
resultOutput.config(yscrollcommand=resultScroll.set)

root.mainloop()
  • First you have to understand [Event-driven programming](https://stackoverflow.com/a/9343402/7414759), [How do you run your own code alongside Tkinter's event loop?](https://stackoverflow.com/questions/459083/how-do-you-run-your-own-code-alongside-tkinters-event-loop) – stovfl Dec 15 '19 at 18:55

1 Answers1

0

Use the .after() method to run code and loops alongside the mainloop. Very good explanation for the method can be found here: https://www.geeksforgeeks.org/python-after-method-in-tkinter/

Simo Todorov
  • 26
  • 1
  • 6