Как получить обновление метки мгновенно, а не ждать еще одного события обратного вызова? - PullRequest
1 голос
/ 05 апреля 2020
import tkinter as tk
import smtplib
from word_length import find_word_length

class Email_app(tk.Frame):
    def __init__(self, master = None):
        tk.Frame.__init__(self, master)
        self.create_widget()

    def create_widget(self):

        self.myLabel = tk.Label(root, text = "Email app", width = 50).grid()
        self.myUsername = tk.Label(root, text = "Username").place(x = 10, y = 30, width = 70, height = 20)
        self.myUserEntry = tk.Entry(root)
        self.myUserEntry.place(x = 90, y = 30, width = 200, height = 20)
        self.myPassword = tk.Label(root, text = "Password").place(x = 10, y = 60, width = 70, height = 20)
        self.myPasswordEntry = tk.Entry(root)
        self.myPasswordEntry.place(x = 90, y = 60, width = 200, height = 20)
        self.To = tk.Label(root, text = "Destination").place( x = 10, y = 90, width = 70, height = 20)
        self.To_entry = tk.Entry(root)
        self.To_entry.place(x = 90, y = 90, width = 200, height = 20)


        #from here is about the entry box
        self.myEntry = tk.Text(root)
        self.myEntry.bind('<Key>',lambda x: self.callback())
        self.myEntry.place(x = 10, y = 120, width = 430, height = 460)

        self.strVal = tk.StringVar() 
        self.strVal.set("Word: 0 word")
        self.Textlength = tk.Label(root, textvariable = self.strVal, width = 70)
        self.Textlength.place(x = 320, y = 50, width = 120, height = 30)

        self.myBtn = tk.Button(root,text = "Submit email", command = self.on_release)
        self.myBtn.place(x = 350, y = 600)

    def on_release(self):
        Username = self.myUserEntry.get()
        Password = self.myPasswordEntry.get()
        Destination = self.To_entry.get()
        text = self.myEntry.get('1.0',tk.END)
        self.myEntry.delete('1.0', tk.END)
        self.strVal.set("Word: 0 word")
        try:
            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.ehlo()
            server.starttls()
            server.login(Username,Password)
            server.sendmail(Username,Destination,text)
        except:
            print('Something went wrong')

    def callback(self):
        length = find_word_length(self.myEntry.get('1.0',tk.END))
        if length == 1 or length == 0:
            self.strVal.set(f"Word: {length} word")
        elif length > 1:
            self.strVal.set(f"Word: {length} words")


root = tk.Tk()
root.geometry("450x650")
root.resizable(width=False, height=False)
Email_app_main = Email_app(root)
Email_app_main.mainloop()

Я создаю простое почтовое приложение, в котором пользователи могут использовать модуль smtplib, чтобы войти в систему, а затем отправить электронное письмо. Я реализовал функцию обратного вызова, которая постоянно проверяет пользователя, сколько слов было введено пользователем в поле ввода текста, затем я обновляю его в метке self.Textlength. Все работает нормально, но я заметил, что метка не обновляется в том же событии обратного вызова, мне нужно снова вызвать событие обратного вызова, чтобы обновить текст метки. Есть ли способ мгновенно обновить метку для того же события обратного вызова и не ждать другого?

1 Ответ

1 голос
/ 05 апреля 2020

Проблема в том, что <Key> привязка выполняется до обновления текста ввода, в отличие от <KeyRelease>. Вместо этого используйте self.myEntry.bind('<KeyRelease>',lambda x: self.callback()) в своем коде. Надеюсь, что это полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...