繁体   English   中英

Python Tkinter多线程函数

[英]Python Tkinter Multithreading functions

我目前正在使用python的tkinter库处理电子邮件发件人和接收程序。 我正在使用线程模块让程序每隔60秒刷新未读的电子邮件,同时您仍然可以继续在程序中执行操作。

线程模块只在执行打印(“某事”)命令时工作,我仍然可以继续在程序中执行操作。 但是,当我让线程登录到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() 

这段代码实际上是否正确?

你在多线程中调用它:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM