Warum senden die Signale nicht?

8

Die Anwendung

Ich versuche eine Python-Shell für meine PyQt5-Anwendung mit der stdlib zu erstellen InteractiveConsole , damit ich den Benutzern Live-Plots erlauben kann. Ich verwende ein QTextEdit , um das stdout aus der Shell anzuzeigen.

Das Problem

Wenn ich Schleifen in der Shell mache, friert die Anwendung ein, weil die insertPlainText() für QTextEdit zu schnell ist. Also schrieb ich einen Puffer, der die Inserts um einige Millisekunden verzögern würde. Ich bemerkte jedoch, dass sobald ich irgendwelche blockierenden Funktionen wie time.sleep() in den for-Schleifen ausführen würde, es einfrieren würde. Die Ausdrucke innerhalb der for-Schleifen werden also erst angezeigt, wenn die Schleife beendet ist. Dies geschieht nicht, wenn der Puffer deaktiviert ist.

Zum Beispiel, wenn ich das in der Shell mache:

%Vor%

Dies wird nur nach 10 Sekunden gedruckt.

Code

Dies ist die minimalste Version, die ich nach MVCE Richtlinien schreiben könnte.

Hier ist die Datei main.ui :

%Vor%

Hier ist die Datei main.py :

%Vor%

Die Klasse BaseSignals wird für die Kommunikation zwischen dem Hauptthread und dem Interpreter benötigt. Hier ist eine Mitschrift , warum dies implementiert wurde.

Was ich weiß

Diese Zeile ist verantwortlich für das Einfügen des Klartextes self.output.signal_str.emit(data) . Dieser emit() passiert innerhalb eines QThread . Bis die multiple self.buffer.write() beendet ist, wird emit() nicht verarbeitet. Ich dachte, das Hinzufügen von QApplication.processEvents() in DelayedBuffer.process() würde helfen. Es tut es nicht. Ich gebe zu, ich könnte mich jedoch irren.

Jede Hilfe wird geschätzt. Vielen Dank im Voraus.

    
daegontaven 20.08.2017, 20:46
quelle

1 Antwort

3

Ihr Interpreter-Thread blockiert den Aufruf InteractiveConsole.runcode() . Es kann keine Signale verarbeiten, bis dieser Anruf beendet ist. Deshalb sehen Sie die verzögerte Ausgabe.

Sie können den gewünschten Effekt erzielen, indem Sie

ändern %Vor%

bis

%Vor%

Für einige Old-School-Debugging, trennen Sie Ihre stderr Handhabung und streuen einige print Aussagen wie ...

%Vor%     
shao.lo 10.09.2017, 16:23
quelle

Tags und Links