Ich arbeite in einer Menü-Taskleiste mit PyQt5. Ich bin sehr neu mit PyQt5, und was ich tun möchte, ist eine Aktion ohne das Menü zu blockieren (Multithreading). Nachdem ich an vielen Stellen gelesen habe, bin ich zu dem Schluss gekommen, dass die Verwendung von Qthread
der Weg sein sollte (aber wenn ich nur verstehen könnte, wie diese Klasse funktioniert ...). Allerdings wäre die Verwendung von threading
nicht so schlecht, da meine Anwendung sehr einfach ist. So habe ich den folgenden Code versucht import threading
mit:PyQt5 QObject: Ich kann keine untergeordneten Elemente für ein übergeordnetes Objekt in einem anderen Thread erstellen
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()
Wenn ich mein Menü starten, ist alles an Ort und Stelle, wie ich es erwartet. Wenn ich dann auf das Menü Search
klicke, löst die Aktion die Methode self.search_cast
aus, und mein Menü wird mit der Liste gefüllt, die es findet. Ich kann auch ohne meine Anwendung macht die Suche sehen blockiert zu werden, aber wenn es fertig ist ich folgende Fehlermeldungen erhalten:
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.
Danach ist das Menü noch „funktional“ in dem Sinne, dass es reagiert aber nicht mehr Aktion kann ausgelöst werden. Darüber hinaus scheint es, dass keine weiteren Threads erstellt werden. Ich wäre froh, wenn mir jemand erklären könnte, warum das so ist? Ich sehe nicht, das Licht ...
aktualisieren:
ich geschaffen habe jetzt ein worker.py
das enthält:
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()
Dann habe ich in den class menubar
folgenden hinzugefügt:
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.
Und jetzt bekomme ich den folgenden Fehler:
AttributeError: 'casting' object has no attribute 'availablecc'
Ich stelle sicher, dass tatsächlich die worker
availablecc
von einer externen Klasse erholt, dass ich cc
genannt. Aber aus irgendeinem Grund wird nicht von der menubar
Klasse empfangen. Ich arbeite basierend auf diesem https://stackoverflow.com/a/33453124/1995261
Hey vielen Dank für die Freigabe des Codes. Ich habe versucht, das zu tun, was du gesagt hast, aber jetzt reagiert meine GUI nicht mehr, während meine verbundene Methode (in deinem Fall onIntReady) auf der Konsole funktioniert (weil ich sie für die Konsole geschrieben habe) Hast du eine Idee? – Hilal