【发布时间】:2020-03-01 02:48:57
【问题描述】:
我已经在这段代码上工作了一段时间,并且一切正常,但我希望它在按下按钮时更新得更快。我正在研究多处理,但我是 python 新手,所以我对如何将 def click() 中的 for 循环转换为多处理版本以便它们可以同时运行有点困惑。我已经删减了一些代码和 GUI 设置,以使代码更容易接受,但这就是为什么某些变量可能看起来没有必要的原因。任何建议都会很棒。谢谢。
import tkinter as tk
import time
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--mute-audio")
options.headless = True
browser = webdriver.Chrome('/Users/Matt/Downloads/chromedriver', options=options)
app = tk.Tk()
app.title("Over / Under")
#Entries for user to insert player name that will be searched
p1 = tk.StringVar()
p2 = tk.StringVar()
p3 = tk.StringVar()
Player1Name = tk.Entry(app, textvariable = p1, width=20)
Player1Name.grid(column=1, row=0, padx=10, pady=5, sticky=tk.N)
Player2Name = tk.Entry(app, textvariable = p2, width=20)
Player2Name.grid(column=1, row=1, padx=10, pady=5, sticky=tk.S)
Player3Name = tk.Entry(app, textvariable = p3, width=20)
Player3Name.grid(column=1, row=2, padx=10, pady=5, sticky=tk.S)
#Empty label that will be filled with current stats
P1CurrentStatText = tk.StringVar()
P2CurrentStatText = tk.StringVar()
P3CurrentStatText = tk.StringVar()
P1CurrentStatLabel = tk.Entry(app, width=5, textvariable = P1CurrentStatText)
P1CurrentStatLabel.grid(column=5, row=0, padx=10, pady=5)
P2CurrentStatLabel = tk.Entry(app, width=5, textvariable = P2CurrentStatText)
P2CurrentStatLabel.grid(column=5, row=1, padx=10, pady=5)
P3CurrentStatLabel = tk.Entry(app, width=5, textvariable = P3CurrentStatText)
P3CurrentStatLabel.grid(column=5, row=2, padx=10, pady=5)
def click():
for i in range(1, 6):
pID = eval(("p" + str(i) + ".get()"))
pcID = eval(("P" + str(i) + "CurrentStatText"))
PRAID = eval(("PRA" + str(i) + "opt.get()"))
OUID = eval(("OU" + str(i) + "opt.get"))
if pID == "":
continue
browser.get("https://www.espn.com/")
time.sleep(1)
srch_btn = browser.find_element_by_xpath('//*[@id="global-search-trigger"]')
srch_btn.click()
srch_bar = browser.find_element_by_xpath('//*[@id="global-search"]/input[1]')
srch_bar.send_keys(pID)
time.sleep(1)
player_page = browser.find_element_by_xpath('//*[@id="global-search"]/div/div/div[1]/ul/li/a')
player_page.click()
time.sleep(1)
points = browser.find_element_by_xpath(
'//*[@id="fittPageContainer"]/div[2]/div[5]/div/div/div[1]/section/div/div[2]/article[1]/ul/li/div/div')
rebounds = browser.find_element_by_xpath(
'//*[@id="fittPageContainer"]/div[2]/div[5]/div/div/div[1]/section/div/div[2]/article[2]/ul/li/div/div')
assists = browser.find_element_by_xpath(
'//*[@id="fittPageContainer"]/div[2]/div[5]/div/div/div[1]/section/div/div[2]/article[3]/ul/li/div/div')
pointstxt = points.get_property('textContent')
reboundstxt = rebounds.get_property('textContent')
assiststxt = assists.get_property('textContent')
if PRAID == "Rebounds":
pcID.set(reboundstxt)
elif PRAID == "Points":
pcID.set(pointstxt)
else:
pcID.set(assiststxt)
def quit():
app.destroy()
browser.close()
UpdateButton = tk.Button(app, text = 'Update', command = click)
UpdateButton.grid(column=2, row=5, pady=10, padx = 10)
ExitButton = tk.Button(app, text = 'Exit', command = quit)
ExitButton.grid(column=4, row=5, pady=10, padx = 10)
app.mainloop()
【问题讨论】:
-
首先您应该将循环中的代码放入函数中,因为线程/多处理需要函数的名称作为参数。
-
顺便说一句:主题/多处理将需要
queue将结果发送回主进程 - 其他进程无权访问 GUI - 主进程将更新 GUI。但它可能需要root.after(milliseconds, function)定期检查队列中是否有新消息。 -
无论如何你可以展示一个例子,也许可以使用我的一些代码来展示它?我对此很陌生,所以我的代码或变量的任何可视化都会对我有很大帮助。
-
顺便说一句:您可以将元素保留在列表中,然后您可以使用
p[i].get()而不是使用eval() -
当您单击按钮时,每个线程/进程都必须启动自己的 selenium,并且可能需要一些时间 - 因此它可能会在一个线程中运行得更慢。
标签: python selenium loops tkinter multiprocessing