[英]Python TKinter, Selenium and threading throwing driver not defined error
我的程序正在運行,但是每當我從按鈕 (minknapp2) 運行腳本時,TKinter 都會停止響應,直到腳本完成。 我做了一些研究,發現這是因為我需要使用線程,並且我可以在腳本運行時與 TKinter 進行交互。
我已將我的程序分成 2 個文件,我認為這是問題所在。 一個文件運行 TKinter,第二個文件運行我的 Selenium 腳本。 文件名 1 是 NyceGui.py 文件名 2 是 webreader.py
Tkinter 文件如下所示。
from tkinter import *
import webreader as wr
root = Tk()
#Skapa labels
minLabel1 = Label(root, text = "Nyce automation Gui")
minLabel2 = Label(root, text = "Automatisera processer")
minLabel3 = Label(root, text = "Flytta artikel")
minLabel4 = Label(root, text = "Artikelnummer: ")
minLabel5 = Label(root, text = "Från: ")
minLabel6 = Label(root, text = "Till: ")
#Skapa knappar
minKnapp1 = Button(root, text = "Öppna Nyce", command=wr.startaNyce)
minKnapp2 = Button(root, text = "Bekräfta aktiv order", command=wr.bekräfta
minKnapp3 = Button(root, text = "Bekräfta småplock aktiv order", command=wr.bekräftaSmå)
minKnapp4 = Button(root, text = "AVBRYT SCRIPT", command=wr.stopp, bg ="red")
#Skapa textfält
mittText1 = Entry(root)
mittText2 = Entry(root)
mittText3 = Entry(root)
#Visa på skärm
minLabel1.grid(row=0, column=0)
minLabel2.grid(row=1, column=0)
minKnapp1.grid(row=2, column=0)
minKnapp2.grid(row=3, column=0)
minKnapp3.grid(row=4, column=0)
minKnapp4.grid(row=1, column=3)
minLabel3.grid(row=6, column=1)
minLabel4.grid(row=7, column=0)
mittText1.grid(row=7, column=1)
minLabel5.grid(row=8, column=0)
mittText2.grid(row=8, column=1)
minLabel6.grid(row=8, column=2)
mittText3.grid(row=8, column=3)
root.mainloop()
Selenium 文件看起來像這樣。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import sys
def startaNyce():
global driver
driver = webdriver.Chrome(executable_path=r'./chromedriver.exe')
driver.get("http://awebpage.com")
def bekräfta():
orange = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange')]")))
try:
while orange:
text = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'form-control nl-forms-wp-orange id-requisiteinfo-input-riLocation')]"))).get_attribute("value")
search = driver.find_element_by_xpath("//input[contains(@value, 'Skanna lagerplats')]")
search.send_keys(text)
search.send_keys(Keys.RETURN)
search2 = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange id-requisiteinfo-input-riQuantity')]")))
search.send_keys(Keys.RETURN)
except KeyboardInterrupt:
sys.exit()
def bekräftaSmå():
orange = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange')]")))
try:
while orange:
text = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange id-requisiteinfo-input-riLocation')]"))).get_attribute("value")
search = driver.find_element_by_xpath("//input[contains(@value, 'Skanna lagerplats')]")
search.send_keys(text)
search.send_keys(Keys.RETURN)
search.send_keys(Keys.RETURN)
text = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange')]"))).get_attribute("value")
search2 = driver.find_element_by_xpath("//input[contains(@value, 'Skanna fack')]")
search2.send_keys(text)
search.send_keys(Keys.RETURN)
except KeyboardInterrupt:
sys.exit()
def stopp():
sys.exit()
所以我嘗試在我的第一個代碼中添加導入線程
和這個塊來測試它(minknapp2)
from tkinter import *
import webreader as wr
import threading
root = Tk()
#Skapa labels
minLabel1 = Label(root, text = "Nyce automation Gui")
minLabel2 = Label(root, text = "Automatisera processer")
minLabel3 = Label(root, text = "Flytta artikel")
minLabel4 = Label(root, text = "Artikelnummer: ")
minLabel5 = Label(root, text = "Från: ")
minLabel6 = Label(root, text = "Till: ")
#Skapa knappar
minKnapp1 = Button(root, text = "Öppna Nyce", command=wr.startaNyce)
minKnapp2 = Button(root, text = "Bekräfta aktiv order", command=threading.Thread(target=wr.bekräfta).start())
但它會拋出這個錯誤。
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Users\Python38-32\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Users\Python38-32\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "\webreader.py", line 17, in bekräfta
orange = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//input[contains(@class, 'nl-forms-wp-orange')]")))
NameError: name 'driver' is not defined
現在我在某處讀到這是因為我在主程序之外啟動了一個線程。 我對這部分有點一無所知,所以任何幫助將不勝感激。
非常簡單的修復,只需從命令中刪除 ()。
minKnapp2 = Button(root, text = "Bekräfta aktiv order", command=threading.Thread(target=wr.bekräfta).start)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.