首页 > 解决方案 > 图形用户界面和脚本集成

问题描述

我想用 pyinstaller 创建一个可执行文件,为此我有一个带有 GUI 的脚本,它应该在执行时启动。它获取用户输入并执行机器人脚本。我已经分别运行了机器人脚本和 GUI 脚本,它们按照我的意愿工作,但是当试图将两者集成以便将 GUI 的输入发送到机器人时,我遇到了问题。bot 函数在我运行脚本时立即被调用,甚至没有显示用户界面。

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("element\s*=\s*([\S\s]+)", 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)))

标签: pythonseleniumtkinter

解决方案


在这里,您在将 bot 函数传递给 argument 时调用它command

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

这是调用 bot 函数的行。当您需要调用带参数的函数时,您应该使用 lambda 表达式。

试试这个:

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

推荐阅读