私は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