我目前正在使用python的tkinter库来开发电子邮件发件人和接收程序。我正在使用线程模块使程序每60秒刷新一次未读的电子邮件,而您仍然可以继续在程序中执行操作。仅在执行print(“ something”)命令时,线程模块即可工作,我仍然可以继续在程序中进行操作。但是,当我使线程登录gmail并获取未读电子邮件计数时,整个程序将冻结并崩溃。以下是我的代码片段。我不会发布完整的代码,我做了一个简短的版本来展示它的外观。在功能上的小故障。get_credentials()被删除。import tkinter, re, threading, time, imaplib, too many to list here.class Application(Frame):def __init__(self, parent): ... Start some functions ... Create some widgets ... Create some global stringvars for entry fieldsdef threadrefresh(self):#I want to start this function when a button is clicked def multithreading(): usernamevar = "Username" passwordvar = "Password" obj = imaplib.IMAP4_SSL('imap.gmail.com', '993') #connect to gmail obj.login(usernamevar, passwordvar) #log in obj.select() #select the inbox unread = str(len(obj.search(None, 'UnSeen')[1][0].split())) #get the total unread print(unread) obj.close() time.sleep(3) multi = threading.Thread(target=multithreading) multi.start() multi = threading.Thread(target=multithreading) multi.start()def other_functions_that_do_not_matter_in_this_case(): ... Creating GUI ... Sending mail ... Etc. ... Create a button with function call self.threadrefreshdef main(): root = Tk() app = Application(root) root.mainloop()if __name__ == '__main__': main()
2 回答
萧十郎
TA贡献1815条经验 获得超13个赞
这段代码实际上正确吗?
您在多线程中称其为:
time.sleep(3)
multi = threading.Thread(target=multithreading)
multi.start()
您基本上是在告诉每个线程3秒后创建自己的副本...我认为您缺少线程的要点。您可能应该在while循环中运行一个(单个)线程,该线程从Queue获取数据。
每当您希望线程作用于某些对象时,就将其添加到队列中。
示例代码
import threading
import Queue
import time
def f(q):
while True:
print q.get() #block thread until something shows up
q = Queue.Queue()
t = threading.Thread(target=f,args=[q])
t.daemon = True #if parent dies, kill thread
t.start()
for x in range(0,1000):
q.put(x)
time.sleep(1)
www说
TA贡献1775条经验 获得超8个赞
这绝对是要走的路(队列)。您只有一个while循环,顶部有queue.get()。它将阻塞(线程)直到获取数据。一旦获得数据,请执行任何操作。完成后,它将循环返回并等待更多数据。
添加回答
举报
0/150
提交
取消