I have a problem currently that makes no sense to me whatsoever. I am making a program that runs a script on a website using the selenium web driver. This is paired with a GUI I made with Tkinter. In short, I have a “Launch” button in the gui that is set to trigger this function:
def launch_script(browser, url): clear_widgets() import script script.initialize(browser, url)
“script” is an external .py file that contains the code to configure and launch the browser, and “clear_widgets” is a function that destroys all widgets on screen.
def clear_widgets(): for widget in window.winfo_children(): widget.destroy()
here is the “script.initialize” function:
def initialize(selectedBrowser, url): import selenium, os from selenium import webdriver if os.name=="nt": dir=f"{os.path.expanduser('~')}/AppData/Roaming/Gimkit Cheats" elif os.name=="posix": dir=f"{os.path.expanduser('~')}.config" else: raise Exception("Unrecognized operating system.") SystemExit() # get webdriver executable driverExecutable=f"{dir}/{selectedBrowser}driver.exe" # hide Seleneum logging opt=webdriver.chrome.options.Options() opt.add_experimental_option('excludeSwitches', ['enable-logging']) # get active webdriver match selectedBrowser: case "Chrome": driver = webdriver.Chrome(driverExecutable, options=opt) case "Firefox": driver = webdriver.Firefox(driverExecutable, options=opt) case "Edge": driver = webdriver.Edge(driverExecutable, options=opt) # open Gimkit driver.get(url)
The problem that is confusing me, is that the “clear_widgets” function isn’t running until after “script.initialize” has fully opened and loaded the chrome page. At first, I considered that it might be starting the clear function, and then not waiting for it to finish, but adding a delay between the two did nothing.
Please leave a comment if you need more information about my program
Advertisement
Answer
Nobody has posted an actual answer but I found the solution to my problem – I misunderstood how the mainloop()
function works, and how it handles other events. I won’t go into detail, but the tkinter method after()
is what I needed, because this is designed not to interfere with the mainloop’s processing. Here is the code that I ended up using:
def launch_script(browser, url): import script clear_widgets() lbl_loading=tk.Label(text="Loading...", font=("Arial", 36)) lbl_loading.pack() def init(): script.initialize(browser, url) lbl_loading.destroy() draw_page2() window.after(100, func=init)