我正在使用PyQt5在菜單系統托盤中工作。我對PyQt5非常新,我想要做的是觸發一個沒有阻塞菜單的操作(多線程)。在讀過很多地方之後,我得出結論認爲使用Qthread
應該是一條路(但只要我能理解該課程是如何工作的......)。但是,使用threading
不會那麼糟糕,要麼因爲我的應用程序非常簡單。所以,我曾嘗試使用import threading
下面的代碼:PyQt5 QObject:無法爲不同線程的父項創建子項
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.
在此之後,菜單仍然在這個意義上,它是響應,但沒有更多的動作「功能」可以被觸發。此外,似乎沒有更多的線程被創建。如果有人能解釋我爲什麼會發生這種情況,我會很高興。我不見天日......
更新:
我現在已經創建了一個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
正在從名爲cc
的外部類中恢復availablecc
。但由於某種原因,menubar
課程沒有收到。我在此基礎上工作https://stackoverflow.com/a/33453124/1995261
嘿感謝的共享代碼。我試圖做你說什麼,但現在我的GUI沒有響應,而我的連接方法(在你的情況onIntReady)正在控制檯。(因爲我寫的控制檯)你有什麼想法? – Hilal