我是tkinter的新手,正在尝试创建电子邮件gui。到目前为止,一切正常,但添加了选择文件功能后,程序将只在用户选择文件时工作。我知道错误了
'GetInfo' object has no attribute 'fname'
我假设这意味着,由于fname(文件名)没有附加值,程序将无法继续。我试图在这里使用try/except工具:
^{pr2}$但这几乎相反,如果我提供了一个文件,就会出现错误。 所以我的问题是:我如何让用户决定是否要提供一个文件?在
以下是我的全部代码:
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter import ttk
import time
import datetime
import smtplib
from timeit import default_timer as timer
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
#colors
darkred = (139, 0, 0)
grey = (90, 90, 90)
root = Tk()
root.title("Email")
class GetInfo:
def __init__(self, master):
#window size
master.minsize(width=250, height=75)
#senders email
Label(root, text="Your email").pack(fill=X)
self.frominf = Entry(master)
self.frominf.pack(fill=X)
#sending to email
Label(root, text="Sending to").pack(fill=X)
self.toinf = Entry(root)
self.toinf.pack(fill=X)
#subject line
Label(root, text="Subject").pack(fill=X)
self.subinf = Entry(root)
self.subinf.pack(fill=X)
#add file
Label(root, text="File?").pack(fill=X)
file_button = Button(root, text="Click to browse files", command= self.Load_file, height = 1, bg="grey")
file_button.pack(fill=X)
#senders password
Label(root, text="Your password").pack(fill=X)
self.passinf = Entry(master, show="*")
self.passinf.pack(fill=X)
#body
Label(root, text="Body of email").pack(fill=X)
self.bodyinf = Text(root)
self.bodyinf.pack(fill=X)
#submit button
submit_button = Button(root, text="Submit(click when done)", command=self.send_email, height = 2, bg="darkred")
submit_button.pack(fill=X)
def Load_file(self):
self.fname = askopenfilename(filetypes=(("All Files","*.*"),
("HTML files", "*.html;*.htm"),
("Template files", "*.tplate") ))
def send_email(self):
# START TIMER
start = timer()
msg = MIMEMultipart()
msg['From'] = self.frominf.get()
msg['To'] = self.toinf.get()
msg['Subject'] = self.subinf.get()
body = self.bodyinf.get('1.0', END)
msg.attach(MIMEText(body, 'plain'))
filename = self.fname
attachment = open(self.fname, "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.ehlo()
server.login(self.frominf.get(), self.passinf.get()) #sender email, password
text = msg.as_string()
server.sendmail(self.frominf.get(), self.toinf.get(), text)
server.quit()
# STOP TIMER
elapsed_time = timer() - start # in seconds
print ("Email took " + (str(elapsed_time)) + " seconds to send, sent to " + self.toinf.get() )
time.sleep(0.5)
root.destroy()
app = GetInfo(root)
root.mainloop()
我会在程序开始时添加
self.fname
属性,并将其设置为:self.fname = ""
然后我会改变这一行:
对于这样的if语句:
^{pr2}$这样可以防止未选择文件时出现错误。在
我现在不能测试这个,但应该可以正常工作。在
使用这个
try
和catch
。如果filename
存在,try
部分代码将被执行。如果没有选择任何文件,它将转到catch
部分,什么也不做,只需继续代码而不显示任何错误。在如果我正确地理解了这个问题,您可以检查
self.fname
是否存在。一种方法:当然,如果您有附件,您需要稍后检查,以避免另一个错误。因此,进一步:
^{pr2}$相关问题 更多 >
编程相关推荐