Python Tkinter, вызывающий функцию с аргументами в кнопке

#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, и это будет сделано.