私は PySide でアプリケーションを作成しています。プロンプトが表示され、コマンドを入力できるコンソール/ターミナルのような画面を追加したいと考えています。どうすればこれを達成できるでしょうか。出力用の QPlainTextEdit/QTextEdit と実際のプロンプト用の QLineEdit の組み合わせを推測しています。これを行うより良い方法はありますか?
3703 次
2 に答える
1
スパイダーをチェックアウトできます。彼らは PyQt (似ています) を使用し、ターミナルを持っています。彼らの端末ウィジェットをインポートできると思いますが、私はそれで遊んでいません。
https://code.google.com/p/spyderlib/
また、これは私のお気に入りの python エディターです。
私はこのようなものを見つけようとしてかなりの時間を費やしましたが、役に立ちませんでした. 幸運を!
于 2013-03-15T17:21:10.300 に答える
1
カスタム QPlainTextEdit とカスタム QLineEdit でこれを行いました。また、ターミナルに ">>>" を表示してユーザー入力を表示するインジケーター ラベルも用意しました。もっと作業が必要です。最善の方法は、QTextEdit と独自の io ハンドラに基づいて独自のカスタム ウィジェットを作成することです。以下は、self.input が QLineEdit で、self.view が QTextEdit である私の execute メソッドの例です。それはあなたに一般的な考えを与えるはずです。
import io, subprocess, shlex, code, rlcompleter, platform
def execute(self, currentText=None):
"""Execute runs the command given based on the console type.
If the console type is "both" then execute will run python commands
unless the user give the input ::os::command or ("::(platform.syste())::command").
Otherwise the console type will determine the what the input will execute with.
Args:
currentText(str): Text to execute. None will run the text from the QLineEdit self.input.
"""
# Check for given text
if currentText is None:
currentText = self.input.text()
self.input.clear()
self.view.display(currentText, "input")
else:
cmd = re.search("^>>>", currentText) # search for start only
if cmd is None:
currentText = ">>>" + currentText
else:
self.view.display(currentText, "input")
# end
# Variables
self.completer.clear()
cmdString = re.sub("^>>>", "", currentText)
result = None
displayType = "output"
run, cmdString = self.getRunType(cmdString)
try:
# Check where the output is going
sys.stdout = self.out = io.StringIO()
sys.stderr = sys.stdout
if run == "python": # Run python command
result = self._runInterpreter(cmdString)
displayType = "python"
elif run == "os": # Run os command
result = self._runSubprocess(cmdString)
displayType = "os"
except Exception as err:
result = str(err)
displayType = "Error"
notFoundPython = "NameError:" in result and "is not defined" in result
notFoundWindows = "returned non-zero exit status" in result
if notFoundPython or notFoundWindows:
result = "Command not found"
finally:
sys.stdout = self.old_stdout
sys.stderr = self.old_stdout
self.display(result, displayType)
# end execute
def getRunType(self, cmdString):
run = self._consoleType
# Check the run type
if self._consoleType == "both":
if re.search("^::python::", cmdString) is not None:
cmdString = re.sub("^::[a-z]*::", "", cmdString)
run = "python"
elif re.search("^(::os::|::"+platform.system()+"::)", cmdString) is not None:
cmdString = re.sub("^::[a-z]*::", "", cmdString)
run = "os"
else:
run = "python"
# end
return run, cmdString
# end getRunType
def _runInterpreter(self, cmdString, outIO=None, run=None):
# Check for a proper console type
if(self._consoleType != "both" and self._consoleType != "python"):
return
# Get the IO
if outIO is None:
outIO = sys.stdout
# Run python command
self.interpreter.push(cmdString)
# Check outIO
result = "Unreadable buffer: Check python's sys.stdout"
if isinstance(outIO, io.StringIO):
result = outIO.getvalue()
else:
if outIO.readable():
result = str(outIO.readlines())
# Check for error
if re.search("^Traceback", result) or re.search("[a-zA-z]*Error:", result):
raise ValueError(result)
return result
# end _runInterpreter
def _runSubprocess(self, cmdString, run=None):
# Check for a proper console type
if(self._consoleType != "both" and self._consoleType != "os"):
return
# Run OS command
cmd = shlex.split(cmdString)
result = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT).decode("utf-8")
# Check for error
if re.search("^Traceback", result) or re.search("[a-zA-z]*Error:", result):
raise ValueError(result)
return result
# end _runSubprocess
于 2013-11-20T14:57:06.047 に答える