Break a loop by pressing a button Tkinter

Viewed 85

My program has lots of tasks inside a while loop to do I need to make a button to break the loop it's an example :

from tkinter import *
from selenium import webdriver
from time import sleep

class screen():
    def __init__(self):
        self.no = 1

    def close(self):
        #what should i do?

    def go(self,a,b,c,d):
        self.close = Button(self.window, text=f"{d}close", width=10, height=2, command=self.close)
            self.close.grid(row=4+d,column=1,columnspan=3,padx=5, pady=5)
        driver = webdriver.Chrome(executable_path="webdriver")
        while True:
            driver.get(a)
            sleep(11)
            print("1 done")
            driver.get(b)
            sleep(5)
            print("2 done")
            driver.get(c)
            sleep(5)
            print("3 done")
            print(f"we will go to your {d}th 3 website again")
        driver.close()

    def start(self):
        a = self.Entry1.get()
        b = self.Entry2.get()
        c = self.Entry3.get()
        self.no = self.no + 1
        thread = threading.Thread(target=self.go, args=[a,b,c,self.no], daemon=True).start()

    def tkin(self):
        self.window = Tk()
        self.window.title("selenium task")
        self.label1 = Label(self.window, text="enter your 1 website")
        self.Entry1 = Entry(self.window)
        self.label2 = Label(self.window, text="enter your 2 website")
        self.Entry2 = Entry(self.window)
        self.label3 = Label(self.window, text="enter your 3 website")
        self.Entry3 = Entry(self.window)
        self.button = Button(self.window, text="start", width = 10 , height = 2 , command = self.start)
        self.label1.grid(row=1,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry1.grid(row=1,column=2, columnspan = 3, padx=5, pady=5)
        self.label2.grid(row=2,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry2.grid(row=2,column=2, columnspan = 3, padx=5, pady=5)
        self.label3.grid(row=3,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry4.grid(row=3,column=2, columnspan = 3, padx=5, pady=5)
        self.button.grid(row=4,column=1, columnspan = 3, padx=5, pady=5)

I need to click on the close button to break this loop at any website (1 or 2 or 3 I don't know when the user will click) or a way to close the selenium which I clicked its close number

1 Answers

You can have the screen.close() method set a variable to True if the loop needs to be broken. The loop should run only if the variable is True. Here is the code, with the added and edited lines marked accordingly:

from tkinter import *
from selenium import webdriver
from time import sleep

class screen():
    def __init__(self):
        self.no = 1
        self.break_loop = False ### ADDED LINE

    def close(self):
        self.break_loop = True ### ADDED LINE

    def go(self,a,b,c,d):
        self.close_button = Button(self.window, text=f"{d}close", width=10, height=2, command=self.close) ### EDITED LINE
        self.close_button.grid(row=4+d,column=1,columnspan=3,padx=5, pady=5) ### EDITED LINE
        driver = webdriver.Chrome(executable_path="webdriver")
        while not self.break_loop: ### EDITED LINE
            driver.get(a)
            sleep(11)
            print("1 done")
            driver.get(b)
            sleep(5)
            print("2 done")
            driver.get(c)
            sleep(5)
            print("3 done")
            print(f"we will go to your {d}th 3 website again")
        self.break_loop = False ### ADDED LINE
        driver.close()

    def start(self):
        a = self.Entry1.get()
        b = self.Entry2.get()
        c = self.Entry3.get()
        self.no = self.no + 1
        thread = threading.Thread(target=self.go, args=[a,b,c,self.no], daemon=True).start()

    def tkin(self):
        self.window = Tk()
        self.window.title("selenium task")
        self.label1 = Label(self.window, text="enter your 1 website")
        self.Entry1 = Entry(self.window)
        self.label2 = Label(self.window, text="enter your 2 website")
        self.Entry2 = Entry(self.window)
        self.label3 = Label(self.window, text="enter your 3 website")
        self.Entry3 = Entry(self.window)
        self.button = Button(self.window, text="start", width = 10 , height = 2 , command = self.start)
        self.label1.grid(row=1,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry1.grid(row=1,column=2, columnspan = 3, padx=5, pady=5)
        self.label2.grid(row=2,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry2.grid(row=2,column=2, columnspan = 3, padx=5, pady=5)
        self.label3.grid(row=3,column=1, columnspan = 3, padx=5, pady=5)
        self.Entry4.grid(row=3,column=2, columnspan = 3, padx=5, pady=5)
        self.button.grid(row=4,column=1, columnspan = 3, padx=5, pady=5)

I renamed the close button to close_button, so that it doesn't overwrite the close() method, which had the same name.

When close_button is pressed, self.break_loop is set to True. The loop runs for only as long as self.break_loop is True. After the loop runs, self.break_loop is set back to False again so that the go() method can be called again.

Related