如何使Tkinter和Selenium协同工作

2024-09-27 07:30:50 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我的问题是如何使命令a和b同时工作,我尝试了线程化,但线程立即执行命令,感谢advace的帮助 我是一个初学者程序员,所以任何关于这个问题的帮助都会有很大帮助,这个项目旨在成为一个刷新机器人,但我无法理解

import tkinter as tk
from time import sleep    
from selenium import webdriver



def a():
    driver1 = webdriver.Chrome(executable_path="/Users/user/Downloads/chromedriver")#your file 
    driver1.get(entry.get())
    while True:
        sleep(5)
        driver1.refresh()


def b():
    app.destroy()

def c():
    entry.delete(0, tk.END)



app = tk.Tk()

app.title("Youtube Bot")

app.geometry("425x350")

app.resizable(False, False)

app.configure(bg="#333436")


textOne = tk.Label(
 text = "Youtube Bot",
 font = ("Helvetica", 28),
 fg = "white",
 bg = "#333436",
 height = "1"
)
textOne.grid(pady = 10)

entry = tk.Entry(
 app,
 width = 25,
 font = ("Arial", 15),
 fg = "white",
 bg = "#6b6d75"
)
entry.focus_set()
entry.grid(padx=10, pady=18 )
entry.get()
entry.insert(0, "Paste Video Link")

buttonRefresh = tk.Button(
 text = "Delete",
 font = ("Arial", 15),
 width = 8,
 command = c

)
buttonRefresh.grid(padx = 6)

buttonOne = tk.Button(
 text = "Start process",
 font =("Helvetica", 20),
 height = "3",
 width = "20",
 command = a
)
 buttonOne.grid()

buttonTwo = tk.Button(
 text="Stop process",
 font=("Helvetica", 20),
 height="3",
 width="20",
 command = b
)
 buttonTwo.grid(pady=20)

 textOne.grid(row = 0, column = 1)
 entry.grid(row = 1, column = 1)
 buttonRefresh.grid(row = 1, column = 0)
 buttonOne.grid(row = 2, column = 1)
 buttonTwo.grid(row = 3, column = 1)

 app.mainloop()

Tags: textimportappgetdefcolumnwidthtk
1条回答
网友
1楼 · 发布于 2024-09-27 07:30:50

这是线程运行的地方,要调用此线程,您需要执行a().start()


class a(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global driver1
        driver1 = webdriver.Chrome(executable_path="/Users/user/Downloads/chromedriver")
        driver1.get(entry.get())
        while True:
            sleep(5)
            driver1.refresh()

注意,我已经定义了driver1,所以我可以在调用函数b时访问并关闭它

我改变了这一行:

buttonOne = tk.Button(text = "Start process",font =("Helvetica", 20),height = "3",width = "20",command = a)

致:

buttonOne = tk.Button(text = "Start process",font =("Helvetica", 20),height = "3",width = "20",command = lambda: a().start())

因为:

  • 由于它的a().start())不仅仅是a,您需要包含lambda,因此只有在按下buttonOne时才调用类a

我还将driver1.close()包含在函数b中,以便在退出应用程序时关闭浏览器

完整代码:

from time import sleep
from selenium import webdriver
import threading

class a(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        global driver1
        driver1 = webdriver.Chrome(executable_path="/Users/user/Downloads/chromedriver")
        driver1.get(entry.get())
        while True:
            sleep(5)
            driver1.refresh()

def b():
    app.destroy()
    driver1.close()

def c():
    entry.delete(0, tk.END)



app = tk.Tk()

app.title("Youtube Bot")

app.geometry("425x350")

app.resizable(False, False)

app.configure(bg="#333436")


textOne = tk.Label(text = "Youtube Bot",font = ("Helvetica", 28),fg = "white",bg = "#333436",height = "1")
textOne.grid(pady = 10)

entry = tk.Entry(app,width = 25,font = ("Arial", 15),fg = "white",bg = "#6b6d75")
entry.focus_set()
entry.grid(padx=10, pady=18 )
entry.get()
entry.insert(0, "Paste Video Link")

buttonRefresh = tk.Button(text = "Delete",font = ("Arial", 15),width = 8,command = c)
buttonRefresh.grid(padx = 6)

buttonOne = tk.Button(text = "Start process",font =("Helvetica", 20),height = "3",width = "20",command = lambda: a().start())

buttonOne.grid()

buttonTwo = tk.Button(text="Stop process",font=("Helvetica", 20),height="3",width="20",command = b)
buttonTwo.grid(pady=20)

textOne.grid(row = 0, column = 1)
entry.grid(row = 1, column = 1)
buttonRefresh.grid(row = 1, column = 0)
buttonOne.grid(row = 2, column = 1)
buttonTwo.grid(row = 3, column = 1)

app.mainloop()

driver1 = webdriver.Chrome(executable_path="/Users/user/Downloads/chromedriver")最初是在class a之外定义的

这意味着它看起来像这样

driver1 = webdriver.Chrome(executable_path="/Users/user/Downloads/chromedriver")

class a(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        driver1.get(entry.get())
        while True:
            sleep(5)
            driver1.refresh()

这意味着每次启动程序时driver1都会自动定义,导致浏览器打开

所以我只是在{}中移动了{},这样当按下{}时,也就是定义{}时,浏览器就会打开

我还使driver1成为一个全局变量,这样您可以在调用函数时访问它:

def b():
    app.destroy()
    driver1.close()

相关问题 更多 >

    热门问题