Python Tkinter多线程功能

我目前正在使用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 fields


def 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.threadrefresh



def main():

    root = Tk()

    app = Application(root)

    root.mainloop()


if __name__ == '__main__':

    main() 


炎炎设计
浏览 327回答 2
2回答

萧十郎

这段代码实际上正确吗?您在多线程中称其为:time.sleep(3)multi = threading.Thread(target=multithreading)multi.start()您基本上是在告诉每个线程3秒后创建自己的副本...我认为您缺少线程的要点。您可能应该在while循环中运行一个(单个)线程,该线程从Queue获取数据。每当您希望线程作用于某些对象时,就将其添加到队列中。示例代码import threadingimport Queueimport timedef f(q):    while True:        print q.get() #block thread until something shows upq = Queue.Queue()t = threading.Thread(target=f,args=[q])t.daemon = True #if parent dies, kill threadt.start()for x in range(0,1000):    q.put(x)    time.sleep(1)

www说

这绝对是要走的路(队列)。您只有一个while循环,顶部有queue.get()。它将阻塞(线程)直到获取数据。一旦获得数据,请执行任何操作。完成后,它将循环返回并等待更多数据。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python