簡體   English   中英

錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM