为了账号安全,请及时绑定邮箱和手机立即绑定

Python Tkinter多线程功能

Python Tkinter多线程功能

炎炎设计 2021-03-10 14:12:00
我目前正在使用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)


查看完整回答
反对 回复 2021-03-29
?
www说

TA贡献1775条经验 获得超8个赞

这绝对是要走的路(队列)。您只有一个while循环,顶部有queue.get()。它将阻塞(线程)直到获取数据。一旦获得数据,请执行任何操作。完成后,它将循环返回并等待更多数据。

查看完整回答
反对 回复 2021-03-29
  • 2 回答
  • 0 关注
  • 323 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信