【问题标题】:Break a loop by pressing a button Tkinter通过按下按钮 Tkinter 打破循环
【发布时间】:2021-11-11 12:30:17
【问题描述】:

我的程序在 while 循环中有很多任务要做我需要制作一个按钮来打破循环 这是一个例子:

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)

我需要在任何网站上点击关闭按钮来打破这个循环(1 或 2 或 3 我不知道用户何时会点击)或关闭我点击关闭编号的 selenium 的方法

【问题讨论】:

    标签: python multithreading selenium tkinter


    【解决方案1】:

    如果需要中断循环,您可以让screen.close() 方法将变量设置为True。仅当变量为True 时,循环才应运行。这是代码,添加和编辑的行相应标记:

    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)
    

    我将关闭按钮重命名为close_button,这样它就不会覆盖同名的close() 方法。

    按下close_button 时,self.break_loop 设置为True。只要self.break_loopTrue,循环就会运行。循环运行后,self.break_loop 再次设置回False,以便再次调用go() 方法。

    【讨论】:

    • 感谢您的帮助,但我需要随时中断循环,就像我键入第 3 个网站并且程序转到第 2 个网站一样,但我不希望程序转到第 3 个网站所以当我点击停止时,我需要打破循环,这将使程序转到第三个网站,然后打破循环
    • @HeshamIbrahim:我在答案中编辑了代码。这应该只在self.break_loopFalse 时运行循环。我测试过了。
    • 不要从模块中导入所有内容,您也可以使用循环来创建标签和条目
    • @Matiiss:对不起。我复制并粘贴了 OP 的代码,只是更改了我需要更改的内容以使循环断路器工作。
    • @HeshamIbrahim:Exception in thread Thread-1: Traceback (most recent call last): Fatal Python error: could not acquire lock for <_io.BufferedWriter name='<stderr>'> at interpreter shutdown, possibly due to daemon threads Python runtime state: finalizing (tstate=0x1d25400) Thread 0x00007f530b58c700 (most recent call first): Current thread 0x00007f530da4a740 (most recent call first): <no Python frame> Aborted (core dumped)
    猜你喜欢
    • 2018-09-01
    • 2020-10-16
    • 2013-08-22
    • 1970-01-01
    • 2021-08-29
    • 2021-07-02
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多