#python #python-3.x #selenium #selenium-webdriver #tkinter
#python #python-3.x #selenium #selenium-webdriver #tkinter
Вопрос:
Проблема заключается в том, что функция кнопки Tkinter не принимает аргументы. Если я помещаю скобки в конец функции, она сначала вызывает функцию и не позволяет командному действию вызывать действие.
Я пытаюсь передать price_range
, num_of_beds
, и county
переменные (собранные через записи) и отправить их в def runBot
функцию.
Строка, о которой идет речь:
Button(window, text="Run Program!", command= run1.runBot).grid(row=7,column=2, padx= (60,5), pady=5)
Если я это сделаю, она выполнит функцию, не включая кнопку или не разрешая использовать команду:
Button(window, text="Run Program!", command= run1.runBot(price_range, num_of_beds, county)).grid(row=7,column=2, padx= (60,5), pady=5)
Вот код:
from selenium import webdriver
from getpass import getpass
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
username = *******
password = "*****"
class Bot:
def runBot(price_range, num_of_beds, county):
driver = webdriver.Chrome("C:\Users\Matt\Documents\WebDriver\chromedriver_win32\chromedriver.exe")
#profile = webdriver.Chrome("C:\Users\Matt\Documents\WebDriver\chromedriver_win32\chromedriver.exe")
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
prefs = {"profile.default_content_settings.popups": 1,
"download.default_directory":
"C:\Users\Matt\Documents\Splitt",
"directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
driver=webdriver.Chrome('C:\Users\Matt\Documents\WebDriver\chromedriver_win32\chromedriver.exe', options=options)
driver.get("https://www.stellarmls.com/")
driver.maximize_window()
username_textbox = driver.find_element_by_id("loginid")
username_textbox.send_keys(username)
password_textbox = driver.find_element_by_id("password")
password_textbox.send_keys(password)
login_button = driver.find_element_by_id("dropdownMenuButton")
login_button.submit()
tab_url = 'https://dashboard.stellarmls.com/layouts'
driver.switch_to.window(driver.window_handles[1])
driver.get(tab_url)
tab_url = 'https://stellar.mlsmatrix.com/matrix/?f='
driver.switch_to.window(driver.window_handles[1])
driver.get(tab_url)
tab_url = 'https://stellar.mlsmatrix.com/Matrix/Search/Residential/Quick'
driver.switch_to.window(driver.window_handles[1])
driver.get(tab_url)
driver.find_element_by_id('Fm23_Ctrl88_TB').send_keys(price_range)
driver.find_element_by_id('Fm23_Ctrl99_TB').send_keys(num_of_beds)
driver.find_element_by_id('Fm23_Ctrl2096_LB_TB').send_keys(county)
driver.find_element_by_xpath('//*[@id="m_ucResultsPageTabs_m_lbMapTab"]/span/i').click()
run1 = Bot()
class PropertyCalculator:
window = Tk()
window.title("MLS Property ROI Calculator")
Label(window, text="Price Range (ex: 100-400)").grid(row=1, column=1, sticky=W)
Label(window, text="Number of Bedrooms").grid(row=2, column=1, sticky=W)
#TODO: create town filter
Label(window, text="County").grid(row=3, column=1, sticky=W)
Label(window, text=None).grid(row=4,column=1) # space between inputs and outputs
#Variables to store inputs
price_range = StringVar()
num_of_beds = StringVar()
county = StringVar()
#Text boxes to hold inputs and outputs
Entry(window, textvariable = price_range,
justify=RIGHT).grid(row=1,column=2, padx=(0,5))
Entry(window, textvariable = num_of_beds,
justify=RIGHT).grid(row=2,column=2)
Entry(window, textvariable = county,
justify=RIGHT).grid(row=3,column=2)
Button(window, text="Run Program!", command= run1.runBot ).grid(row=7,column=2, padx= (60,5), pady=5)
window.mainloop()
execute(window)
WebDriverWait(driver, 6).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="m_lnkCheckAllLink"]'))).click()
WebDriverWait(driver, 6).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="m_lbExport"]/span'))).click()
WebDriverWait(driver, 6).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="m_ddExport"]'))).send_keys('m')
WebDriverWait(driver, 6).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="m_btnExport"]'))).click()
Комментарии:
1.
command= lambda : run1.runBot(price_range, num_of_beds, county)
или определите другой метод для вызоваrun.runbot
2. Чистый блеск! Спасибо @JacksonPro. Теперь просто выясним, как получить эти переменные из записей Tkinter, и это будет сделано.