Python Tkinter GUI应用程序除了使用队列和线程之外,还可以使用Frezes
我一直试图在GUI的后台进行一些繁重的计算,但不管我怎么努力,按下按钮后GUI仍然会冻结。我一直在寻找答案,最好的答案是在线的,但仍然没有达到预期效果 以下是我的进口清单: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
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
或不可跟踪的
内存值!