Интеграция с графическим интерфейсом и скриптами

#python #selenium #tkinter

#python #selenium #tkinter

Вопрос:

Я хочу создать исполняемый файл с помощью pyinstaller, и для этого у меня есть скрипт с графическим интерфейсом, который должен запускаться при выполнении. Он получает входные данные пользователей и выполняет скрипт бота. Я запустил скрипт бота и скрипт GUI отдельно, и они работают так, как я хочу, однако при попытке интегрировать их так, чтобы ввод графического интерфейса отправлялся боту, я столкнулся с проблемами. Функция бота вызывается сразу же, как только я запускаю скрипт, даже не показывая пользовательский интерфейс.

 from instabot import Bot
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from datetime import datetime
import re
import os
from PIL import Image, ImageTk
import shutil
import tkinter as tk

# GUI
window = tk.Tk()
window.title("Confessions Bot")
window.geometry("600x300")
window.grid_columnconfigure((0,2), weight = 1)

label_tell_account = tk.Label(window, text = "Tellonym Account")
label_tell_password = tk.Label(window, text = "Tellonym Password")
label_ig_account = tk.Label(window, text = "Instagram Account")
label_ig_password = tk.Label(window, text = "Instagram Password")

tell_account = tk.Entry(window)
tell_password = tk.Entry(window)
ig_account = tk.Entry(window)
ig_password = tk.Entry(window)
run = tk.Button(text = "Run!", command = bot(tell_account.get(), tell_password.get(), ig_account.get(), ig_password.get()))

image = ImageTk.PhotoImage(Image.open("logo.png"))
tk.Label(window, image = image).grid(row = 0, column = 1, padx = 10, pady = 10)
label_tell_account.grid(row = 1, column = 0)
tell_account.grid(row = 1, column = 2, padx = 10, pady = 10)
label_tell_password.grid(row = 2, column = 0, padx = 10, pady = 10)
tell_password.grid(row = 2, column = 2, padx = 10, pady = 10)
label_ig_account.grid(row = 3, column = 0, padx = 10, pady = 10)
ig_account.grid(row = 3, column = 2, padx = 10, pady = 10)
label_ig_password.grid(row = 4, column = 0, padx = 10, pady = 10)
ig_password.grid(row = 4, column = 2, padx = 10, pady = 10)
run.grid(row = 5, column = 1, padx = 10, pady = 10)

window.mainloop()
def bot(tell_account_input, tell_password_input, ig_account_input, ig_password_input):
    # Getting Tells to Post
    driver = webdriver.Chrome(ChromeDriverManager().install())
    driver.get("https://tellonym.me/login?redirect=/tells")

    username = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.NAME, "email")))
    username.clear()
    username.send_keys(tell_account_input)

    password = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.NAME, "password")))
    password.clear()
    password.send_keys(tell_password_input)

    driver.find_element_by_tag_name("button").click()

    for element in WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "rmq-f5f56a03"))):
         unclean_name = re.findall("elements*=s*([Ss] )", str(element))
         name = re.sub('[^w]', '', str(unclean_name))
         element.screenshot("to_post/"   datetime.now().strftime("%Y_%m_%d-%I_%M_%S_%p")   str(name)   ".png")

    for i in range(len(driver.find_elements_by_class_name("rmq-f5f56a03"))):
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "rmq-f5f56a03"))).click()
        WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "answer"))).send_keys("posted")
        driver.find_element_by_tag_name("button").click()

    driver.quit()

    # Pic Formating
    for pics in os.listdir("to_post/"):
        image = Image.open("to_post/"   pics, 'r')
        image = image.convert('RGB')
        image = image.crop(((1, 1, 600, 50)))
        template = Image.open("template.jpg")
        template.paste(image, (85,380))
        template.save(re.sub(".png", ".jpg", str("to_post/"   pics)))

    for item in os.listdir("to_post/"):
         if item.endswith(".png"):
             os.remove(os.path.join("to_post/", item))

    # Posting Tells to Instagram
    bot = Bot()

    bot.login(username = ig_account_input,
            password = ig_password_input)

    for pics in os.listdir("to_post/"):
        bot.upload_photo("to_post/"   str(pics), caption = "test")

    # Movig pics from to_post folder -> posted
    for pics in os.listdir("to_post/"):
        shutil.move("to_post/"   pics, "posted")
        os.rename("posted/"   pics, "posted/"   re.sub(".REMOVE_ME", "", str(pics)))
  

Ответ №1:

Здесь вы вызываете функцию бота, передавая ее в аргумент command .

 run = tk.Button(text = "Run!", command = bot(tell_account.get(), tell_password.get(), ig_account.get(), ig_password.get()))
  

Это функция бота, вызывающая строку. Вы должны использовать лямбда-выражение
когда вам нужно вызвать функцию с аргументами.

Попробуйте это:

 run = tk.Button(text = "Run!", command = lambda : bot(tell_account.get(), tell_password.get(), ig_account.get(), ig_password.get()))