PyQt6实战4-Terminal

实现一个简单的终端执行器

功能:

执行命令

显示结果

效果:

代码:

from PyQt6.QtWidgets import *
from PyQt6.QtCore import *
from PyQt6.QtGui import *
import sys
import subprocess


class JTerminal(QMainWindow):
    def __init__(self, parent=None):
        super(JTerminal, self).__init__(parent)
        self.initUI()
        self.lineEdit.returnPressed.connect(self.doCommand)
        self.working_dir = "."

    def initUI(self):
        
        self.setWindowTitle('JTerminal')
        self.setGeometry(100, 100, 800, 600)


        self.central = QWidget()
        
        self.layout = QVBoxLayout()
        
        self.textBrowser = QTextBrowser()
        fontShow = QFont("DejaVu Sans Mono", 12)
        self.textBrowser.setFont(fontShow)
        
        fontInput = QFont("Monospace", 12)
        self.lineEdit = QLineEdit()
        self.lineEdit.setFont(fontInput)
        
        self.layout.addWidget(self.textBrowser)
        self.layout.addWidget(self.lineEdit)
        
        self.central.setLayout(self.layout)
        
        self.menuBar = QMenuBar()
        self.menuBar.setGeometry(QRect(0, 0, 800, 26))
        
        self.setMenuBar(self.menuBar)
        
        self.setCentralWidget(self.central)
    
    
    def doCommand(self):
        cmd = self.lineEdit.text()
        self.lineEdit.setText("")
        
        result_pwd = subprocess.check_output("pwd", shell=True, cwd=self.working_dir)
        
        self.textBrowser.setText(self.textBrowser.toPlainText() + result_pwd.decode('utf-8') + "> " + cmd + "\n")
        
        if "cd" in cmd:
            vals = cmd.split(" ")
            if vals[1][0] == "/":
                self.working_dir = vals[1]
            else:
                self.working_dir = self.working_dir + "/" + vals[1]
            
            # subprocess.call(cmd, shell=True, cwd=self.working_dir)
            #run 依赖python 3.5, 所以需要注意,call不需要
            result = subprocess.run(cmd, shell=True, cwd=self.working_dir)
            
            # self.textBrowser.setText(self.textBrowser.toPlainText() + "\n" + cmd)
            
            result_pwd = subprocess.check_output("pwd", shell=True, cwd=self.working_dir)
            self.textBrowser.setText(self.textBrowser.toPlainText() + result_pwd.decode('utf-8'))
        
        else:
            
            try:
                result = subprocess.check_output(cmd, shell=True, cwd=self.working_dir)
                
                self.textBrowser.setText(self.textBrowser.toPlainText() + result.decode('utf-8'))
                
            except:
                self.textBrowser.setText(self.textBrowser.toPlainText() + "command not found \n")
            
        self.textBrowser.verticalScrollBar().setValue(self.textBrowser.verticalScrollBar().maximum())
        
        
        
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = JTerminal()
    ex.show()
    sys.exit(app.exec())
    

代码地址:

GitHub - chunlaiqingke/Tiny-Tool

公众号

代码参考项目:

GitHub - petercour/terminal-emulator-example-pyqt: Terminal emulator in pyqt, https://pythonbasics.org/pyqt/

相关推荐

  1. PyQt6】朗读小说西游记

    2024-04-01 00:06:01       39 阅读
  2. 自学PyQt6杂记索引

    2024-04-01 00:06:01       32 阅读
  3. 0.6 V LOW VOLTAGE SWING TERMINATED LOGIC (LVSTL06)

    2024-04-01 00:06:01       46 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-01 00:06:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-01 00:06:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-01 00:06:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-01 00:06:01       20 阅读

热门阅读

  1. 每日一题 第五十七期 洛谷 统计子矩阵

    2024-04-01 00:06:01       18 阅读
  2. macbook pro 2018 T2 芯片安装 archlinux 双系统

    2024-04-01 00:06:01       29 阅读
  3. 带头循环双向链表的实现

    2024-04-01 00:06:01       21 阅读
  4. 《堕落的审判》吵架台词

    2024-04-01 00:06:01       16 阅读
  5. 算法设计-杨辉三角

    2024-04-01 00:06:01       22 阅读
  6. 记 SpringBoot 使用@RequestBody 接收不到参数

    2024-04-01 00:06:01       19 阅读