我正在使用 PyQt5 在菜单系统托盘中工作。我对 PyQt5 非常陌生,我想做的是在不阻止菜单的情况下触发操作(多线程)。在阅读了很多地方之后,我得出的结论是,使用Qthread
应该是要走的路(但如果我能理解该类是如何工作的......)。然而,使用threading
鉴于我的应用程序非常简单,也不会那么糟糕。所以,我尝试使用以下代码import threading
:
from PyQt5 import QtCore, QtGui, QtWidgets
import threading
class menubar(object):
def __init__(self):
signal.signal(signal.SIGINT, signal.SIG_DFL)
self.systray = True
self.stopped = False
def search_menu(self):
self.SearchAction = menu.addAction("Search")
self.SearchAction.triggered.connect(self.search_cast)
def _search_cast_(self):
args.select_cc = True
self.cc.initialize_cast()
self.cast_list()
def search_cast(self):
threading.Thread(target=self._search_cast_).start()
#some more methods here...
def main():
menubar()
app = QtWidgets.QApplication(sys.argv)
tray = QtWidgets.QSystemTrayIcon(icon)
menu = QtWidgets.QMenu()
start = menubar()
start.search_menu()
start.separator_menu()
start.populating_menu()
start.separator_menu()
start.stop_menu()
start.resetaudio_menu()
start.about_menu()
start.exit_menu()
tray.setContextMenu(menu)
tray.show()
app.exec_()
if __name__ == '__main__':
main()
当我启动菜单时,一切都按照我的预期就位。然后,当我点击菜单时Search
该动作会触发self.search_cast
方法,我的菜单中就会填充它找到的列表。我还可以看到我的应用程序在执行搜索时没有被阻止,但当它完成时,我收到以下错误:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QMenu(0x7fcef497c160), parent's thread is QThread(0x7fcef2603d10), current thread is QThread(0x7fcef4a89360)
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QMenu(0x7fcef497c160), parent's thread is QThread(0x7fcef2603d10), current thread is QThread(0x7fcef4a89360)
QObject: Cannot create children for a parent that is in a different thread.
此后,菜单仍然是“功能性的”,因为它具有响应性,但无法触发更多操作。此外,似乎没有创建更多线程。如果有人能向我解释为什么会发生这种情况,我会很高兴?我看不到光...
Update:
我现在创建了一个worker.py
其中包含:
from PyQt5.QtCore import QThread, QObject, pyqtSignal, pyqtSlot
#some other imports
class Worker(QObject):
finished = pyqtSignal()
@pyqtSlot()
def _search_cast_(self):
self.cc = casting()
self.cc.initialize_cast()
self.finished.emit()
然后我添加了class menubar
下列:
class menubar(object):
def __init__(self):
self.cc = casting()
signal.signal(signal.SIGINT, signal.SIG_DFL)
self.cc.cast = None
self.systray = True
self.stopped = False
self.obj = worker.Worker() # no parent!
self.thread = QThread() # no parent!
self.obj.moveToThread(self.thread)
self.obj.finished.connect(self.thread.quit)
self.thread.started.connect(self.obj._search_cast_)
def search_menu(self):
self.SearchAction = menu.addAction("Search")
self.SearchAction.triggered.connect(self.search_cast)
def search_cast(self):
self.thread.start()
self.cast_list()
def cast_list(self):
if len(self.cc.availablecc) == 0:
# some actions here.
现在我收到以下错误:
AttributeError: 'casting' object has no attribute 'availablecc'
我确保实际上worker
正在康复availablecc
来自我调用的外部类cc
。但由于某种原因没有被接收menubar
班级。我正在基于此进行工作https://stackoverflow.com/a/33453124/1995261