Python Tkinter GUI应用程序除了使用队列和线程之外,还可以使用Frezes

Python Tkinter GUI应用程序除了使用队列和线程之外,还可以使用Frezes,python,multithreading,user-interface,queue,Python,Multithreading,User Interface,Queue,我一直试图在GUI的后台进行一些繁重的计算,但不管我怎么努力,按下按钮后GUI仍然会冻结。我一直在寻找答案,最好的答案是在线的,但仍然没有达到预期效果 以下是我的进口清单: 1 from multiprocessing import Queue 2 from Queue import Empty 3 import threading 4 import time 5 try: 6 from force import Jedi 7 except I

我一直试图在GUI的后台进行一些繁重的计算,但不管我怎么努力,按下按钮后GUI仍然会冻结。我一直在寻找答案,最好的答案是在线的,但仍然没有达到预期效果

以下是我的进口清单:

   1 from multiprocessing import Queue 
   2 from Queue import Empty
   3 import threading
   4 import time
   5 try:
   6     from force import Jedi
   7 except ImportError:
   8     print "Couldn't load force module"
   9 try:
  10     import stopwatch
  11 except ImportError:
  12     print "Couldn't load stopwatch module"
  13 try:
  14     import re
  15 except ImportError:
  16     print "Couldn't load regex module"
  17 try:
  18     from Tkinter import * 
  19 except ImportError: 
  20     from tkinter import *
  21 except:
  22     print "Couldn't load tkinter module"
这是给我带来很多麻烦的代码:

1298     def runloop(self, x):  
1299         result = sum(range(x))`                                                                                                                                                                                   
1301         self.thread_queue.put(result)
1302    
1303 
1304     def jedi_thread_func(self):
1305         self.thread_queue = Queue()
1306         threading.Thread(target=self.runloop, args = (100000000, )).start()
1307         self.after(0, self.listen_for_result)
1308    
1309 
1310     def listen_for_result(self):
1311         try:
1312             self.res = self.thread_queue.get(0)
1313             print self.res
1314         except Empty:
1315             print "Queue empty"
1316             self.after(100, self.listen_for_result)
1317   
1318 
1319     def closest_match(self, event):
1323         
1324         self.jedi_thread_func()
所有这些函数都在一个GUI类中,该类工作得非常好。当我按下链接到最近的_match()的按钮时,GUI冻结,尽管我努力从内部启动一个新线程

在终端输出中,我没有得到任何错误,但也没有得到“队列空”回调。它只是冻结2秒钟并打印输出

因为这是我在这里的第一篇帖子,大家好,提前感谢大家的快速回复:)

更新:
通过从GUI中初始化的另一个类启动线程,使它们能够通信,我最终实现了它

您的线程无法从python中
初始化
。在线程中设置局部变量(速度很慢)。不要使用局部变量(在gui类中),例如:
def check(a,b):return(a+b)
。另一点是无法恢复大大小散列(tmp)值@dsgdfg感谢您的回复。实际上,我只是举了一个例子,实际上runloop运行另一个函数,该函数从GUI内部初始化的另一个对象转换变量。效果还是一样的。所以我的主要问题是为什么我不能初始化线程?如果我得到正确的输出(从线程中执行的函数)并且没有错误,你确定线程没有初始化吗?
member\u 1=Tkinter\u Class\u Frame
member\u 2=Build\u Gui\u Class
member\u 3=Jedi\u Threat\u Answers
你能想象
RAM
HASH\u ID
?将是
OWERFLOW
不可跟踪的
内存值!您的线程无法从python中
初始化
。在线程中设置局部变量(速度很慢)。不要使用局部变量(在gui类中),例如:
def check(a,b):return(a+b)
。另一点是无法恢复大大小散列(tmp)值@dsgdfg感谢您的回复。实际上,我只是举了一个例子,实际上runloop运行另一个函数,该函数从GUI内部初始化的另一个对象转换变量。效果还是一样的。所以我的主要问题是为什么我不能初始化线程?如果我得到正确的输出(从线程中执行的函数)并且没有错误,你确定线程没有初始化吗?
member\u 1=Tkinter\u Class\u Frame
member\u 2=Build\u Gui\u Class
member\u 3=Jedi\u Threat\u Answers
你能想象
RAM
HASH\u ID
?将是
OWERFLOW
不可跟踪的
内存值!