【发布时间】:2013-06-01 02:26:31
【问题描述】:
我目前正在使用来自 python 的 tkinter 库来开发电子邮件发件人和接收程序。 我正在使用线程模块使程序每 60 秒刷新一次未读电子邮件,而您仍然可以继续在程序中执行操作。
线程模块只在发出 print("something") 命令时工作,我仍然可以继续在程序中做事。但是,当我将线程登录到 gmail 并获取未读电子邮件计数时,整个程序会冻结并崩溃。
下面是我的代码的 sn-p。我不会发布完整的代码,我做了一个简短的版本来展示它的外观。
编辑: 在功能上犯了一个小错误。 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()
【问题讨论】:
-
也许 tkinter 不喜欢多线程。 Tkinter 带来了一个 Tk.after 方法,它在给定时间后调用一个函数。也许这已经符合您的需求。
-
@IchUndNichtDu 我更喜欢在后台运行一个线程。我在线程每隔几秒钟打印一个字符串时取得了一些成功,而我仍然可以使用我的程序。
-
Tkinter 做线程就好了。在 tk.
Var 上使用 trace 方法。将其指向一个函数,该函数将某些内容添加到另一个线程搜索的队列中(请参阅我的答案。)
标签: python multithreading tkinter imaplib