gpt4 book ai didi

wxPython:如何创建bash shell窗口?

转载 作者:行者123 更新时间:2023-12-04 04:01:32 26 4
gpt4 key购买 nike

我想使用像bash shell一样的wxPython创建一个弹出窗口。我不需要终端模拟器,不需要作业控制,我只想要基于bash进程的REPL(读取,评估,打印循环)。

使用wxPython可以做到这一点吗?我从作为tcl/tk程序员的那一天就知道了基本概念,但是我的wxPython fu很薄弱,如果不需要,我不想重新发明轮子。我已经阅读了一些有关py.shell的内容。 Shell,但看起来像它创建了一个python shell,而我想运行一个bash命令。

最佳答案

好的,这是另一种尝试,它也可以在单独的线程中读取所有输出和错误,并通过Queue进行通信。
我知道这不是完美的(例如,延迟输出的命令将不起作用,并且输出将进入下一个命令,例如tryr sleep 1; date),并且复制整个bash并不容易,但是对于我测试过的一些命令来说,它似乎可以正常工作

关于wx.py.shell的API,我刚刚实现了Shell类调用Interpreter的那些方法,如果您通过Shell的源代码,您将了解。
基本上

  • push是用户输入的命令发送到解释器
  • 的位置
  • getAutoCompleteKeys返回键
    哪个用户可以使用
    自动完成命令,例如制表键
  • getAutoCompleteList返回列表
    匹配给定文本的命令
  • getCallTip“显示参数规范和
    弹出窗口中的文档字符串。因此对于
    bash我们可能会显示手册页:)

  • 这是源代码
    import threading
    import Queue
    import time

    import wx
    import wx.py
    from subprocess import Popen, PIPE

    class BashProcessThread(threading.Thread):
    def __init__(self, readlineFunc):
    threading.Thread.__init__(self)

    self.readlineFunc = readlineFunc
    self.outputQueue = Queue.Queue()
    self.setDaemon(True)

    def run(self):
    while True:
    line = self.readlineFunc()
    self.outputQueue.put(line)

    def getOutput(self):
    """ called from other thread """
    lines = []
    while True:
    try:
    line = self.outputQueue.get_nowait()
    lines.append(line)
    except Queue.Empty:
    break
    return ''.join(lines)

    class MyInterpretor(object):
    def __init__(self, locals, rawin, stdin, stdout, stderr):
    self.introText = "Welcome to stackoverflow bash shell"
    self.locals = locals
    self.revision = 1.0
    self.rawin = rawin
    self.stdin = stdin
    self.stdout = stdout
    self.stderr = stderr

    self.more = False

    # bash process
    self.bp = Popen('bash', shell=False, stdout=PIPE, stdin=PIPE, stderr=PIPE)

    # start output grab thread
    self.outputThread = BashProcessThread(self.bp.stdout.readline)
    self.outputThread.start()

    # start err grab thread
    self.errorThread = BashProcessThread(self.bp.stderr.readline)
    self.errorThread.start()

    def getAutoCompleteKeys(self):
    return [ord('\t')]

    def getAutoCompleteList(self, *args, **kwargs):
    return []

    def getCallTip(self, command):
    return ""

    def push(self, command):
    command = command.strip()
    if not command: return

    self.bp.stdin.write(command+"\n")
    # wait a bit
    time.sleep(.1)

    # print output
    self.stdout.write(self.outputThread.getOutput())

    # print error
    self.stderr.write(self.errorThread.getOutput())

    app = wx.PySimpleApp()
    frame = wx.py.shell.ShellFrame(InterpClass=MyInterpretor)
    frame.Show()
    app.SetTopWindow(frame)
    app.MainLoop()

    关于wxPython:如何创建bash shell窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/989129/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com