繁体   English   中英

编辑Python Gui

[英]Edit Python Gui

我有一段代码可以帮助我向客户发送电子邮件。 这段代码非常基础,是用Python3编写的,并利用Selenium + Chromedriver代表我发送电子邮件。 (我不是程序员,请耐心等待凌乱的代码)

问题是当我需要访问大量电子邮件地址时。 每次我需要通过Sublime文本手动编辑代码中的subject / bcc / cc字段以确保能够找到合适的客户时,这需要一两分钟的时间。

同样重要的是,在我使用CRM时,应分别向每个客户发送电子邮件,并希望将其密送到每封电子邮件中,以跟踪公司中正在发生的事情。 这意味着不能将所有客户抄送到一封特定的电子邮件中。

因此,如果我需要发送500封电子邮件,则需要花费相当多的时间使用正确的电子邮件地址将代码编辑500次。

有什么方法可以简化此代码编辑? 例如:打开一个窗口,询问我要发送到的电子邮件地址>插入电子邮件地址> program.py代码进行相应的编辑>运行代码>给所有指定的客户端发送电子邮件

我没有做太多尝试,因为说实话我什至不知道从哪里开始寻找解决方案,我也不知道这样的事情是否可行。

import selenium
from selenium import webdriver
from time import sleep
import time

driver = webdriver.Chrome()
driver.get('WEBSITE URL')
time.sleep(5)

emailelement = driver.find_element_by_id("identifierId")
time.sleep(3)
emailelement.send_keys('XXXXXXXX')
time.sleep(1)
Logginelement = driver.find_element_by_xpath("//span[@class='RveJvd snByac']")
Logginelement.click()
time.sleep(3)
passelement = driver.find_element_by_name('password')
passelement.send_keys('XXXXXXXX')
time.sleep(1)
Logginelement = driver.find_element_by_xpath("//span[@class='RveJvd snByac']")
Logginelement.click()
time.sleep(3)

Compose = driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']")
Compose.click()
time.sleep(1)

BCC = driver.find_element_by_xpath("//span[@class='aB  gQ pB']")
BCC.click()
time.sleep(0.5)

bcc = driver.find_element_by_xpath("//textarea[@name='bcc']")
bcc.send_keys('EMAIL ADDRESS')
time.sleep(0.5)

Receipient = driver.find_element_by_xpath("//textarea[@name='to']")
Receipient.send_keys('EMAIL ADDRESS')
time.sleep(0.5)

Subject = driver.find_element_by_xpath("//input[@name='subjectbox']")
Subject.send_keys('SUBJECT')
time.sleep(0.5)

Message = driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']")
Message.send_keys('MESSAGE')
time.sleep(0.5)

#Attach not utilized, just for experimentation.
#Attach = driver.find_element_by_xpath("//div[@class='a1 aaA aMZ']")
#Attach.click()
#time.sleep(15)

Send = driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']")
Send.click()
time.sleep(3)

我的问题与代码无关。 我想知道是否可以使用Gui编辑代码中的某些行。 例如:“ bcc.send_keys('EMAIL ADDRESS')”通过使用带有Tkinter之类的外部窗口来编辑EMAIL ADDRESS?

请任何建议或指向正确的库/文档的指针将不胜感激! :)

因此,您要的内容称为for循环。 它用于多次执行任务,通常与列表等一起使用。

我注意到的其他三件事:

  1. 您正在使用大量sleep()调用并查看您的代码,我认为这不是必需的。

  2. 您永远不会调用已分配的变量,因此为了减少代码,我摆脱了所有变量调用。

  3. 我认为您误解了导入的工作方式和导入睡眠和时间的方式。 import time适合您的time.sleep()调用,而无需from time import sleep 如果您只想从time上使用sleep()方法,则可以from time import sleep并在代码中直接调用sleep() 您将不需要time. 在这种情况下的前缀。

我已经对您的代码进行了编辑,以包括for循环和可以放入您自己的电子邮件的示例列表。 以及密件抄送电子邮件的变量。

看一下这个例子,让我知道你的想法:

import selenium
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('WEBSITE URL')

# use a list object to store all your emails.
emails = ['someone@someplace.com', 'someone_else@someplace.com']
bcc_email = 'email_to_bcc@someplace.com'

# use a for loop to send all your emails.
for email in emails:
    driver.find_element_by_id("identifierId").send_keys('XXXXXXXX')
    driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
    driver.find_element_by_name('password').send_keys('XXXXXXXX')
    driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
    driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']").click()
    driver.find_element_by_xpath("//span[@class='aB  gQ pB']").click()
    # notice the variable in the email section
    driver.find_element_by_xpath("//textarea[@name='bcc']").send_keys(bcc_email)
    driver.find_element_by_xpath("//textarea[@name='to']").send_keys(email)
    driver.find_element_by_xpath("//input[@name='subjectbox']").send_keys('SUBJECT')
    driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']").send_keys('MESSAGE')
    driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']").click()

对于一个简单的GUI选项,该选项允许您使用要提供的任何电子邮件进行发送,请看以下示例:

请注意,此示例没有任何错误检查,因此您可能需要首先添加某种电子邮件验证。

import tkinter as tk
import selenium
from selenium import webdriver

driver = webdriver.Chrome()
driver.get('WEBSITE URL')
bcc_email = 'email_to_bcc@someplace.com'


root = tk.Tk()

email = tk.Entry(root)
lbl1 = tk.Label(root, text='Enter single email here: ')
lbl1.grid(row=0, column=0)
email.grid(row=0, column=1)


def process_emails():
    # use a for loop to send all your emails.
    driver.find_element_by_id("identifierId").send_keys('XXXXXXXX')
    driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
    driver.find_element_by_name('password').send_keys('XXXXXXXX')
    driver.find_element_by_xpath("//span[@class='RveJvd snByac']").click()
    driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji T-I-KE L3']").click()
    driver.find_element_by_xpath("//span[@class='aB  gQ pB']").click()
    # notice the variable in the email section
    driver.find_element_by_xpath("//textarea[@name='bcc']").send_keys(bcc_email)
    driver.find_element_by_xpath("//textarea[@name='to']").send_keys(email.get())
    driver.find_element_by_xpath("//input[@name='subjectbox']").send_keys('SUBJECT')
    driver.find_element_by_xpath("//div[@class='Am Al editable LW-avf tS-tW']").send_keys('MESSAGE')
    driver.find_element_by_xpath("//div[@class='T-I J-J5-Ji aoO v7 T-I-atl L3']").click()


tk.Button(root, text='Process single email!', command=process_emails).grid(row=1, column=0, columnspan=2)
root.mainloop()

这是一个简单的GUI应用程序,您可以将其添加到代码中以获取一个窗口,该窗口要求以“;”分隔的电子邮件列表。 然后,您可以使用上面建议的for循环来处理电子邮件列表。 确实,您还需要添加错误检查,以防数据错误或电子邮件失败。

from tkinter import *

def get_emails():
    email_str = my_stringvar.get()
    email_list.append(email_str.split("; "))

email_list = []
my_window = Tk()
my_stringvar = StringVar()
my_entry = Entry(textvariable=my_stringvar)
my_button = Button(text="Done", command=get_emails)

如果您想一次做一个,可以将拆分取出。

from tkinter import *

def get_emails():
    email_str = my_stringvar.get()

email_str = ""
my_window = Tk()
my_stringvar = StringVar()
my_entry = Entry(textvariable=my_stringvar)
my_button = Button(text="Done", command=get_emails)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM