如何在tinkin中,如果用户未选择文件,继续编码

2024-09-26 18:07:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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()

Tags: totextfromimportselfgetserveremail
3条回答

我会在程序开始时添加self.fname属性,并将其设置为:

self.fname = ""

然后我会改变这一行:

part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

对于这样的if语句:

^{pr2}$

这样可以防止未选择文件时出现错误。在

我现在不能测试这个,但应该可以正常工作。在

使用这个trycatch。如果filename存在,try部分代码将被执行。如果没有选择任何文件,它将转到catch部分,什么也不做,只需继续代码而不显示任何错误。在

    try:
        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)
    except:
        pass

如果我正确地理解了这个问题,您可以检查self.fname是否存在。一种方法:

if self.fname:
    attachment = open(self.fname, "rb")

当然,如果您有附件,您需要稍后检查,以避免另一个错误。因此,进一步:

^{pr2}$

相关问题 更多 >

    热门问题