我有一段使用Python编写的GUI和程序逻辑。我经常通过调用
-- 代码 --
在我的情况下,
urllib.requests
(等等)从Web请求信息,但这会导致GUI不响应。虽然这些调用被包装在QThread
中,但我认为这是由于GIL
引起的。但是,当我无法使代码异步工作时,我该如何在PyQt应用程序中使用QThread
?在PyQt
中,它的用途是什么?-- 代码 --
qtthreaddecorator.py:
from PyQt4 import QtCore
class Worker(QtCore.QThread):
def __init__(self, thread_name, finished_slot, function, *args, **kwargs):
QtCore.QThread.__init__(self)
self._thread_name = thread_name
self._function = function
self._args = args
self._kwargs = kwargs
self._finished_slot = finished_slot
def run(self):
self._function(*self._args, **self._kwargs)
self._finished_slot()
return
def qt_thread_decorator(slot):
def decorator(function):
def wrapper(*args, **kwargs):
worker = Worker(function.__name__, slot, function, *args, **kwargs)
worker.start()
return
return wrapper
return decorator
我正在使用它的地方:
这个地方与IT技术有关。
import qtthreaddecorator
class MainWindow(QtGui.QMainWindow, form_class):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.init()
def init(self):
@qtthreaddecorator.qt_thread_decorator(self._fill_servers)
def _get_servers():
self._get_my_servers()
@qtthreaddecorator.qt_thread_decorator(self._fill_user_info)
def _get_user_info():
self._get_user_info()
_get_servers()
_get_user_info()
在我的情况下,
_get_servers()
和 _get_user_info()
是按顺序调用的,但我希望它们可以并发执行。
worker_thread.start()
?因为如果你使用worker_thread.run()
,它会运行,但不会在另一个线程中运行。 - Feniksowrapper
函数没有返回worker,因此它在该函数之外不存在。 - user3419537wrapper
中返回是不够的。最终,你需要让worker存在于你装饰的函数之外,否则当这些函数返回时,你会遇到同样的问题。我认为你使用装饰器使事情变得过于复杂了。 - user3419537