[파이썬] PyQt 터미널 및 콘솔 애플리케이션과의 통합

PyQt는 파이썬으로 작성된 GUI 개발 프레임워크이며, 다양한 도구와 기능을 제공합니다. 이중에서 터미널 및 콘솔 애플리케이션과의 통합은 많은 개발자들이 사용하고자 하는 기능 중 하나입니다.

터미널 및 콘솔 애플리케이션과 PyQt를 통합하는 방법에는 여러 가지가 있습니다. 다음은 몇 가지 방법입니다.

1. QPlainTextEdit 위젯 및 QTextEdit 위젯 사용

PyQt에서 제공하는 QPlainTextEdit 위젯이나 QTextEdit 위젯을 사용하여 터미널 및 콘솔과 유사한 출력을 구현할 수 있습니다. 이 위젯들은 텍스트 편집기와 동일한 기능을 제공하며, 문장을 삽입, 수정 및 삭제할 수 있습니다. 사용자는 이 위젯을 통해 터미널 명령어를 입력하고 결과를 표시할 수 있습니다.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QTextEdit

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.console_output = QTextEdit(self)
        self.console_output.setReadOnly(True)
        self.console_output.setGeometry(10, 10, 380, 280)
        
        self.command_input = QTextEdit(self)
        self.command_input.setGeometry(10, 300, 380, 50)
        
        execute_button = QPushButton("Execute", self)
        execute_button.setGeometry(10, 360, 380, 30)
        execute_button.clicked.connect(self.execute_command)
        
    def execute_command(self):
        command = self.command_input.toPlainText()
        
        # Execute the command and get the output
        output = execute_terminal_command(command)
        
        self.console_output.append(output)

app = QApplication([])
window = MainWindow()
window.show()
app.exec()

2. subprocess 모듈을 사용하여 외부 명령 실행

PyQt 애플리케이션 내에서 외부 터미널 명령을 실행하고 결과를 가져오기 위해 subprocess 모듈을 사용할 수도 있습니다. 이 모듈을 사용하면 애플리케이션과 터미널 간의 통신을 통해 명령을 실행하고 출력을 받을 수 있습니다.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QTextEdit
import subprocess

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.console_output = QTextEdit(self)
        self.console_output.setReadOnly(True)
        self.console_output.setGeometry(10, 10, 380, 280)
        
        self.command_input = QTextEdit(self)
        self.command_input.setGeometry(10, 300, 380, 50)
        
        execute_button = QPushButton("Execute", self)
        execute_button.setGeometry(10, 360, 380, 30)
        execute_button.clicked.connect(self.execute_command)
        
    def execute_command(self):
        command = self.command_input.toPlainText()
        
        # Execute the command and get the output
        output = subprocess.check_output(command, shell=True)
        output = output.decode("utf-8")
        
        self.console_output.append(output)

app = QApplication([])
window = MainWindow()
window.show()
app.exec()

3. 파이썬 터미널과 통합

PyQt 애플리케이션 내에서 파이썬 대화형 터미널을 통합할 수도 있습니다. 이렇게 하면 사용자가 실시간으로 명령을 실행하고 출력을 확인할 수 있습니다.

from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from PyQt5.QtWebEngineWidgets import QWebEngineView
import sys
import code

class Console(QWebEngineView):
    def __init__(self, parent=None):
        super(Console, self).__init__(parent)
        self.page().setBackgroundColor(QtCore.Qt.white)
        
        self.console = code.InteractiveConsole()
        self.console.push("import sys")

    def execute_command(self, command):
        sys.stdout = self
        self.console.push(command)
        sys.stdout = sys.__stdout__
        
    def write(self, text):
        text = str(text)
        self.page().runJavaScript("addOutput('{}')".format(text))

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.console = Console(self)
        self.console.load(QtCore.QUrl.fromLocalFile(os.path.abspath("console.html")))
        self.console.setGeometry(10, 10, 380, 300)
        
        self.command_input = QTextEdit(self)
        self.command_input.setGeometry(10, 320, 380, 50)
        
        execute_button = QPushButton("Execute", self)
        execute_button.setGeometry(10, 380, 380, 30)
        execute_button.clicked.connect(self.execute_command)
        
    def execute_command(self):
        command = self.command_input.toPlainText()
        self.console.execute_command(command)

app = QApplication([])
window = MainWindow()
window.show()
app.exec()

이러한 방식을 사용하여 PyQt 애플리케이션과 터미널 또는 콘솔을 통합할 수 있습니다. 사용자는 터미널 명령을 실행하고 결과를 실시간으로 확인할 수 있으며, 이를 통해 애플리케이션의 유연성과 상호작용성을 높일 수 있습니다.