如何在Tkinter中配置标签

时间:2018-10-03 13:40:35

标签: python tkinter smtplib

我有几行代码可以在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()

1 个答案:

答案 0 :(得分:0)

添加一个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()