python - 图形用户界面和脚本集成
问题描述
我想用 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)))
解决方案
在这里,您在将 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()))
推荐阅读
- hibernate - 在 HQL/JPQL 中比较 LocalDate 和 LocalDateTime
- javascript - 如何进行实用的 DD-MM 表单输入?
- javascript - 如何将多个 blob 文件添加到文件列表(以附加到表单数据中)
- python - 使用 urllib 和 json 读取 Python google api
- java - 如何在 android 状态栏中添加自定义视图?
- r - 如何跟踪过去 6 个月从账户发送的总交易金额?
- amazon-web-services - 为 Fluentbit 的 Amazon ElasticSearch 服务配置 AWS Sigv4 身份验证
- authentication - Xamarin:使用移动数据时通过 Gmail 发送邮件
- mysql - 比较不同时间戳的值并确定它们是否已更改
- javascript - 从脚本创建一个数组,然后提醒内容