【问题标题】:How to make Tkinter and Selenium work together如何让 Tkinter 和 Selenium 一起工作
【发布时间】:2020-11-18 12:32:14
【问题描述】:

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

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()

【问题讨论】:

  • 这很混乱,更多细节会有所帮助
  • @coderoftheday 这是所有代码,当您尝试运行它时,您需要插入视频的链接,当您按下第一个按钮时,链接会打开并每 5 秒刷新一次页面(这是tkinter 窗口冻结时的部分),我需要让它能够解冻并正常工作以处理多个请求
  • 使用线程模块?
  • @coderoftheday 你能发个例子吗?

标签: python multithreading tkinter


【解决方案1】:

这是线程运行的地方,要调用这个线程,你可以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 类。

我还在函数b 中加入了driver1.close(),以便在您退出应用程序时也关闭浏览器。

完整代码:

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 移动到class a 中,这样当按下buttonOne 时,就会定义driver1,然后就会打开浏览器。

我还将driver1 设为全局变量,以便在调用函数时访问它:

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

【讨论】:

  • 感谢您对一切的帮助,但我该如何做到这一点,以便在应用程序开始运行时浏览器不会打开
  • 我已经编辑了答案,浏览器不应该再这样做了
  • 你到底改了哪一行,让我明白它是如何工作的?
  • @dumicodes 我已经编辑了这个问题来解释它是如何工作的
  • 没问题,如果我的回答回答了你的问题,你可以勾选我的回答
猜你喜欢
  • 2019-04-17
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2012-06-03
  • 1970-01-01
相关资源
最近更新 更多