Tkinter python 中的电子邮件检查难题及其解决方案

59 阅读2分钟

在使用 Tkinter 编写了一个 python 程序,该程序需要不断检查新的电子邮件。如果用户没有正确输入用户名和密码,就希望程序在用户按下按钮时才更新电子邮件,而一旦用户输入了数据,就希望程序能够持续检查新电子邮件。

2 解决方案

要解决这个问题,我们需要使用一个循环来不断检查新电子邮件,但我们也需要一种方法来确保程序只在用户正确输入数据后才开始检查。

这里提供一种解决方案:

  1. 在程序中,我们使用了一个 printer 方法来更新电子邮件。我们会在用户按下按钮时调用该方法。在 printer 方法中,我们首先会获取用户名和密码,然后使用 feedparser 库来检查电子邮件数量,并将结果存储在变量 self.unread 中。最后,我们使用 self.mail_label 将电子邮件数量显示在 GUI 中。

  2. showGUI 方法中,我们有一个循环,该循环每 100 毫秒执行一次。在循环中,我们将更新时间、日期和电子邮件数量。

  3. 我们使用一个 flag 变量来控制电子邮件检查是否开始。当用户按下按钮后,我们将 flag 变量设置为 True,这样才能在每次循环中检查电子邮件数量。

import feedparser
from tkinter import *
import datetime
import dhtreader

class GUI:
    def __init__(self, master):
        self.flag = False  # Flag to control email checking
        self.frame = Frame(master)

        self.userinput = Entry(self.frame)
        self.userinput.grid(row=0, column=0)
        self.password = Entry(self.frame)
        self.password.grid(row=0, column=1)

        self.button = Button(self.frame, text="Check Emails", command=self.printer)
        self.button.grid(row=0, column=2)

        self.mail = StringVar()
        self.mail_label = Label(self.frame, textvariable=self.mail)
        self.mail_label.grid(row=2, column=0, sticky=W)

        self.temp = StringVar()
        self.temp_label = Label(self.frame, textvariable=self.temp)
        self.temp_label.grid(row=1, column=0, sticky=W)

        self.humidity = StringVar()
        self.humidity_label = Label(self.frame, textvariable=self.humidity)
        self.humidity_label.grid(row=1, column=1, sticky=W)

        self.time1 = StringVar()
        self.time_label = Label(self.frame, textvariable=self.time1)
        self.time_label.grid(row=3, column=0, sticky=W)

        self.date = StringVar()
        self.date_label = Label(self.frame, textvariable=self.date)
        self.date_label.grid(row=3, column=1, sticky=W)

        self.frame.pack()

    def printer(self):  
        self.mail=StringVar()
        self.username=self.userinput.get()
        self.MailPass=self.password.get()
        self.flag = True   # Set the flag to True to start checking emails
        self.unread = int(feedparser.parse("https://" + self.username + ":" + self.MailPass +"@mail.google.com/gmail/feed/atom")["feed"]["fullcount"])    #gmail command
        self.mail.set("Unread Emails:"+str(self.unread))
        self.mail_label=Label(self.frame,textvariable=self.mail)
        self.mail_label.grid(row=2,column=0,sticky=W)


    def showGUI(self):
        now = datetime.datetime.now()
        dhtreader.init()
        s = dhtreader.read(11, 18)
        if s == None:
           s = (1, 1)

        self.temp.set("Temperature:" + str(s[0]) + " C")
        self.humidity.set("Humidity:" + str((s[1])) + "%")

        current_time = str(now.hour) + ':' + str(now.minute) + ':' + str(now.second)
        current_date = (str(now.month) + ':' + str(now.day) + ':' + str(now.year))
        self.time1.set("Time:" + current_time)
        self.date.set("Date:" + current_date)

        if self.flag:  # Check if the flag is set to True
            self.unread = int(
                feedparser.parse(
                    "https://" + self.username + ":" + self.MailPass + "@mail.google.com/gmail/feed/atom")["feed"][
                    "fullcount"])  # gmail command
            self.mail.set("Unread Emails:" + str(self.unread))

        self.frame.after(100, self.showGUI)


def main():
    root = Tk()
    app = GUI(master=root)
    app.showGUI()   
    root.title('Controller GUI')
    root.mainloop()



if __name__ == '__main__':
    main()

在上面的代码中,我们使用了 flag 变量来控制电子邮件检查是否开始。当用户按下按钮后,我们将 flag 变量设置为 True,这样才能在每次循环中检查电子邮件数量。