Sie können eine Qt IDLE „Timer“ verwenden gevent
zur Verarbeitung seiner Microthreads zu ermöglichen, während keine Qt Ereignisse für einen kurzen Zeitraum behandelt, für Beispiel 10 Millisekunden. Es ist immer noch nicht perfekt, da es nicht die "glatteste" mögliche Integration gibt. Das liegt daran, dass wir für Qt und Gevent keine einzige Ereignisschleife verwenden, sondern sie nur zeitlich verschachteln.
Die richtige Lösung wäre es, Libevent zu erlauben, auf neue Qt-Ereignisse irgendwie zu hören, aber ich bin noch nicht in der Lage, herauszufinden, wie man das in der Praxis macht. Vielleicht würde es hilfreich sein, wenn Qt über einen Socket etwas an gevent sendet, wenn ein GUI-Ereignis in der Ereigniswarteschlange eintrifft. Hat jemand das gelöst?
Arbeitsbeispiel:
""" Qt - gevent event loop integration using a Qt IDLE timer
"""
import sys, itertools
import PySide
from PySide import QtCore, QtGui
import gevent
# Limit the IDLE handler's frequency while still allow for gevent
# to trigger a microthread anytime
IDLE_PERIOD = 0.01
class MainWindow(QtGui.QMainWindow):
def __init__(self, application):
QtGui.QMainWindow.__init__(self)
self.application = application
self.counter = itertools.count()
self.resize(400, 100)
self.setWindowTitle(u'Counting: -')
self.button = QtGui.QPushButton(self)
self.button.setText(u'Reset')
self.button.clicked.connect(self.reset_counter)
self.show()
def counter_loop(self):
while self.isVisible():
self.setWindowTitle(u'Counting: %d' % self.counter.next())
gevent.sleep(0.1)
def reset_counter(self):
self.counter = itertools.count()
def run_application(self):
# IDLE timer: on_idle is called whenever no Qt events left for processing
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.on_idle)
self.timer.start(0)
# Start counter
gevent.spawn(self.counter_loop)
# Start you application normally, but ensure that you stop the timer
try:
self.application.exec_()
finally:
self.timer.stop()
def on_idle(self):
# Cooperative yield, allow gevent to monitor file handles via libevent
gevent.sleep(IDLE_PERIOD)
def main():
application = QtGui.QApplication(sys.argv)
main_window = MainWindow(application)
main_window.run_application()
if __name__ == '__main__':
main()
Was ist "gevent"? Bitte fügen Sie Links zu Ihrer Frage hinzu. –
http://www.gevent.org/ - Coroutine-basierte Python-Netzwerkbibliothek, die Greenlet verwendet, um eine High-Level-synchrone API zusätzlich zur Libevent-Ereignisschleife bereitzustellen. –
sehr interessant .. was machst du wenn pyqt + gevent funktioniert? – linjunhalida