0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 11:41:49 +02:00

fix: terminal output as QThread

This commit is contained in:
wyzula-jan
2023-11-16 14:07:59 +01:00
parent 94878448c8
commit a0d172e3dc

View File

@ -3,7 +3,7 @@ import subprocess
import threading
import qdarktheme
from PyQt6.QtCore import QFile, QTextStream, pyqtSignal
from PyQt6.QtCore import QFile, QTextStream, pyqtSignal, QThread
from PyQt6.QtGui import QColor, QFont, QAction
from PyQt6.QtWidgets import (
QApplication,
@ -17,6 +17,34 @@ from PyQt6.QtWidgets import (
from PyQt6.Qsci import QsciScintilla, QsciLexerPython
class ScriptRunnerThread(QThread):
outputSignal = pyqtSignal(str)
def __init__(self, script):
super().__init__()
self.script = script
def run(self):
process = subprocess.Popen(
["python", "-u", "-c", self.script],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
bufsize=1,
universal_newlines=True,
text=True,
)
while True:
output = process.stdout.readline()
if output == "" and process.poll() is not None:
break
if output:
self.outputSignal.emit(output)
error = process.communicate()[1]
if error:
self.outputSignal.emit(error)
class PythonEditor(QMainWindow):
# outputSignal = pyqtSignal(str)
@ -104,27 +132,36 @@ class PythonEditor(QMainWindow):
lexer.setColor(classFunctionColor, QsciLexerPython.FunctionMethodName)
def runScript(self):
script = self.editor.text()
self.scriptRunnerThread = ScriptRunnerThread(script)
self.scriptRunnerThread.outputSignal.connect(self.updateTerminal)
self.scriptRunnerThread.start()
def updateTerminal(self, text):
self.terminal.append(text)
# Use threading to run the script
# thread = threading.Thread(target=self.executeScript)
# thread.start()
# Save the current script to a temporary file or use the existing file
script = self.editor.text()
with open("temp_script.py", "w") as file:
file.write(script)
# Run the script and capture output
process = subprocess.Popen(
["python", "temp_script.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
)
output, error = process.communicate()
# Display output and error in the terminal
self.terminal.clear()
if output:
self.terminal.append(output)
if error:
self.terminal.append(error)
# # Save the current script to a temporary file or use the existing file
# script = self.editor.text()
# with open("temp_script.py", "w") as file:
# file.write(script)
#
# # Run the script and capture output
# process = subprocess.Popen(
# ["python", "temp_script.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True
# )
# output, error = process.communicate()
#
# # Display output and error in the terminal
# self.terminal.clear()
# if output:
# self.terminal.append(output)
# if error:
# self.terminal.append(error)
#
# def executeScript(self):
# # Save the current script to a temporary file or use the existing file