【问题标题】:How to configure label in tkinter如何在 tkinter 中配置标签
【发布时间】:2019-03-08 18:19:42
【问题描述】:

我有这几行代码可以在tkinter 中发送邮件,我要做的是在发送邮件但未配置标签时使用sending in progress... 配置标签,直到在输出错误之前标签已配置。

我希望标签配置邮件正在发送,然后在完成后配置 mail sent

from tkinter import messagebox
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import socket
import tkinter as tk




def my_second_mail():
    try:

        l.config(text="sending  in progress...")


        FROMADDR = "my@gmail.com"
        PASSWORD = "22@201"

        TOADDR = ['@yahoo.com', '@gmail.com']
        CCADDR = ['fkfkf@gmail.com']

        # Create message container - the correct MIME type is multipart/alternative.
        msg = MIMEMultipart('alternative')
        msg['Subject'] = 'BACK UP FILES'
        msg['From'] = FROMADDR
        msg['To'] = ', '.join(TOADDR)
        msg['Cc'] = ', '.join(CCADDR)

        body = "mail test"
        msg.attach(MIMEText(body, 'plain'))

        filename = ['facebook.png']

        for n in filename:
          #  l.config(text="sending  in progress...")
            print(n)
            attachment = open(str(n), 'rb')


            part = MIMEBase('application', 'octet-stream')
            part.set_payload((attachment).read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', "attachment; filename= " + n)

            msg.attach(part)
            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.starttls()
            server.login(FROMADDR, PASSWORD)

            server.sendmail(FROMADDR, TOADDR + CCADDR, msg.as_string())
            server.quit()


        messagebox.showinfo("success", "mail sent", parent=root)

        l.config(text="mail sent...")


    except socket.gaierror:
        messagebox.showerror("no internet", "no internet connectivity")



root = tk.Tk()
root.geometry("600x400")

canvas = tk.Canvas(root, width=200, height=200, background="dodger blue")
canvas.pack(fill="both", expand=True)

l = tk.Label(canvas, bg="dodger blue",  fg="white")
l.place(x=250, y=20)

b= tk.Button(canvas, text="send mail", command=my_second_mail, width=25, fg='dodger blue')
b.place(x=220, y=330)

root.mainloop()

【问题讨论】:

    标签: python tkinter smtplib


    【解决方案1】:

    添加一个update 电话。

    l.config(text="sending  in progress...")
    l.update()
    

    这将满足您的要求,但在发送过程中 GUI 仍将被锁定。要做到这一点,您应该将发送过程移至新线程,并通过 StringVar 更新标签。完全未经测试的猜测:

    from tkinter import messagebox
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.mime.base import MIMEBase
    from email import encoders
    import socket
    import tkinter as tk
    from threading import Thread
    
    def my_second_mail():
        try:
    
            message.set("sending  in progress...")
    
    
            FROMADDR = "my@gmail.com"
            PASSWORD = "22@201"
    
            TOADDR = ['@yahoo.com', '@gmail.com']
            CCADDR = ['fkfkf@gmail.com']
    
            # Create message container - the correct MIME type is multipart/alternative.
            msg = MIMEMultipart('alternative')
            msg['Subject'] = 'BACK UP FILES'
            msg['From'] = FROMADDR
            msg['To'] = ', '.join(TOADDR)
            msg['Cc'] = ', '.join(CCADDR)
    
            body = "mail test"
            msg.attach(MIMEText(body, 'plain'))
    
            filename = ['facebook.png']
    
            for n in filename:
                message.set("sending  in progress...")
                print(n)
                attachment = open(str(n), 'rb')
    
    
                part = MIMEBase('application', 'octet-stream')
                part.set_payload((attachment).read())
                encoders.encode_base64(part)
                part.add_header('Content-Disposition', "attachment; filename= " + n)
    
                msg.attach(part)
                server = smtplib.SMTP('smtp.gmail.com', 587)
                server.starttls()
                server.login(FROMADDR, PASSWORD)
    
                server.sendmail(FROMADDR, TOADDR + CCADDR, msg.as_string())
                server.quit()
    
    
            messagebox.showinfo("success", "mail sent", parent=root)
    
            message.set("mail sent...")
    
    
        except socket.gaierror:
            messagebox.showerror("no internet", "no internet connectivity")
    
    def start_mail_send():
        t = Thread(target=my_second_mail)
        t.start()
    
    root = tk.Tk()
    root.geometry("600x400")
    
    canvas = tk.Canvas(root, width=200, height=200, background="dodger blue")
    canvas.pack(fill="both", expand=True)
    
    message = tk.StringVar()
    l = tk.Label(canvas, textvariable=message, bg="dodger blue",  fg="white")
    l.place(x=250, y=20)
    
    b= tk.Button(canvas, text="send mail", command=start_mail_send, width=25, fg='dodger blue')
    b.place(x=220, y=330)
    
    root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多