在使用 Tkinter 编写了一个 python 程序,该程序需要不断检查新的电子邮件。如果用户没有正确输入用户名和密码,就希望程序在用户按下按钮时才更新电子邮件,而一旦用户输入了数据,就希望程序能够持续检查新电子邮件。
2 解决方案
要解决这个问题,我们需要使用一个循环来不断检查新电子邮件,但我们也需要一种方法来确保程序只在用户正确输入数据后才开始检查。
这里提供一种解决方案:
-
在程序中,我们使用了一个
printer方法来更新电子邮件。我们会在用户按下按钮时调用该方法。在printer方法中,我们首先会获取用户名和密码,然后使用 feedparser 库来检查电子邮件数量,并将结果存储在变量self.unread中。最后,我们使用self.mail_label将电子邮件数量显示在 GUI 中。 -
在
showGUI方法中,我们有一个循环,该循环每 100 毫秒执行一次。在循环中,我们将更新时间、日期和电子邮件数量。 -
我们使用一个
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,这样才能在每次循环中检查电子邮件数量。