프로그램이 실행되고 있지만 버튼 (minknapp2)에서 스크립트를 실행할 때마다 TKinter는 스크립트가 완료 될 때까지 응답을 중지합니다. 몇 가지 조사를했는데 스레딩을 사용해야하기 때문에 스크립트가 실행되는 동안 TKinter와 상호 작용할 수 있다는 사실을 알게되었습니다.
내 프로그램을 문제라고 생각하는 2 개의 파일로 분리했습니다. 한 파일은 TKinter를 실행하고 두 번째 파일은 내 Selenium 스크립트를 실행합니다. filename1은 NyceGui.py입니다. filename2는 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)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다