Как настроить ярлык в ткинтере - PullRequest
0 голосов
/ 03 октября 2018

У меня есть несколько строк кода для отправки почты в tkinter, я хочу настроить метку на sending in progress..., когда почта отправляется, но метка не настраивается и до тех пор, пока ошибка не будет выведена доярлык настроен.

Я хочу, чтобы ярлык настраивал отправку почты, когда она будет завершена. configure 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 голосов
/ 03 октября 2018

Добавить 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()
...