質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Q&A

解決済

1回答

4893閲覧

tkinterで、コンソールを操作したい。

Marusoftware

総合スコア189

Tcl

Tclは、インタープリタ型のプログラミング言語。リスト処理や連想配列といった特長を持ち、文法もシンプルです。拡張や他言語への組み込みが簡単にでき、アプリケーション拡張にための組み込み言語として用いられます。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

0グッド

2クリップ

投稿2021/01/19 22:33

編集2021/01/19 22:34

Tkinterで、あるアプリケーションを開発しているのですが、tkinterのウィンドウ、ウィジェット内にconsole, terminalを埋め込みたいと考えています。

今までにtkconを試しましたが、
nano等が動きません。固まります。

pytkconは、python shellなので目的が異なります。

そのため、pyteを使用しようと考えましたが、使い方がよくわかりません。

どの方法でもいいです。
tkinterを使うなら。
できれば、マルチプラットフォームで。
ご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

nano 等の cursesベースのプログラムを動かす為には、
単純な対話シェル環境ではなく、完全な端末のエミュレーションが必用です。

subprocessやpopen を使った簡易的な Read-Eval-Print-Loop ではなく、
pty を用いて端末とやり取りをする方法。

残念ながら tcl/tk でも端末エミュレーターを
ウィジェットとして提供されてる実装はありません。

実装面では、大まかに2通りのアプローチがあり

  • 外部アプリケーションのウィンドウを tkinter へ組み込む方法
  • 端末エミュレーターを独自に実装する方法

利点・欠点は簡潔にまとめると
前者は設置するだけなら簡単ですが拡張が難しく、
後者は最初の実装は大変だけど拡張時の自由度は高い。

マルチプラットフォーム対応にはもうひとつ課題があり、
仮想端末の扱いは標準ライブラリに pty モジュール がありますが、
対象プラットフォームが unixのみなので windowsでは代替が必要です。(winpty, yawinpty, 他)


今までにtkconを試しましたが、nano等が動きません。固まります。

tkcon は tcl/tk の、Pythonに対する IPython 的な立ち位置です。

pyteを使用しようと考えましたが、使い方がよくわかりません。

pyte を利用する場合、キー入力を端末に伝えるのと、
View に当たる部分を tkinter で実装する必要があります。


参考:

  • Qt + pyte を使った実装: qbash (pty: unix系のみ)
  • ptterm
    prompt-toolkit 向け pyte 利用の terminal-widget (pty: win対応 yawinpty)
  • pymterm (pty: unixのみ。pipe実装があるが nanoが動くかどうかは ?)
  • spyder-terminal / terminado (pty: win対応 winpty)

 Qt向け/ブラウザベースの端末ウィジェット xterm.js 利用


取り急ぎ投稿します。昔調べたことがあり、
expectを用いた実装等あったのですが、古くなっていた情報が多くて再調査してます。
後日、追記・編集するかもしれません。

投稿2021/01/23 04:31

編集2021/01/23 06:33
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Marusoftware

2021/01/23 09:19

ありがとうございます。本当に助かります。 そうですね...できる限り、xterm等の埋め込みを行いたくなくて...tkinterで独自実装しようと思うのですが、 えっと、pythonのptyって、MacOSでも動作するのでしょうか? あれも、Unixの一種なので、動作するのでしょうか? あと、本当に申し訳ないのですが、ptyで、端末に読み書きするのには、あえて、bash等のshを動かしておいて、そこに接続するって感じであってますか? pty.spawn("[sh]")で、擬似端末プロセス作って、現在のプロセスに接続されるってptyのdocmentに書いてあるのですが、例えばspawnを複数回動かした場合、何か問題はでないのでしょうか?
teamikl

2021/01/23 12:58 編集

OSX以降/Darwin であれば POSIX準拠であれば動くはずですが、細かな違いについては把握してません。 プラットフォーム別に分類するなら Linux / MacOS,BSD での実装の違いはありそう。 (モジュール自体は利用可能でも、期待通りの動作をするかは保証はない…位の認識です) 一応、実際のマルチプラットフォーム対応プロジェクトを見ると terminado が ptyprocess (※ OS tags: POSIX, OSX)と winpty を使ってます。 ptterm も ptyprocess から借用したコードを利用してます。 > bash等のshを動かしておいて、そこに接続するって感じであってますか? いいえ。端末と関連付けされるのはforkされた子プロセスです。 > 擬似端末プロセス作って、現在のプロセス (の標準入出力) に接続される... > 例えばspawnを複数回動かした場合、何か問題はでないのでしょうか? (編集追記): コメントの一部撤回。ここは状況や使い方次第の部分もある為、 実際のコードをベースに話をした方が良いと思いました。 expectを使った時の経験ですが、端末を閉じたつもりでも プロセスの後始末を忘れると、プロセスがずっと残り続ける事がありました。 (これはシステム依存な挙動だったと思います)
Marusoftware

2021/01/24 16:03

そうですね... ありがとうございます。 とりあえず、ptyprocessとwinptyを使って試してみます。 (とにかくpythonの公式ptyドキュメントは読みにくい。) >expectを使った時の経験ですが、端末を閉じたつもりでも >プロセスの後始末を忘れると、プロセスがずっと残り続ける事がありました。 >(これはシステム依存な挙動だったと思います) これは、例えばbashを立ち上げて、その中でpythonを立ち上げたときに、 ptyprocessではterminateが使用できますが、それをしても、プロセスが残り続けるということですか? だから、例えば、psutilとかで、子プロセス見つけて、killしなきゃいけないとかってことですか? それとも、terminateだけで、bashの端末も一緒に落ちて、子プロセスも道連れにする感じですか? それが、環境によって違うということですか? できれば、教えていただけると幸いです。
teamikl

2021/01/25 01:01 編集

コメント撤回した部分は、自分が expect を使った時の問題で ptyを扱う際の一般的な問題ではないかもしれないです。 実装方法次第では遭遇しなかもしれないし、後から対処可能な問題なので、 (端的に言えば、ゾンビプロセスが出来てしまったので、killすれば済む) 実装前の段階で気にする事でもないと思いました。<撤回理由 >とりあえず、ptyprocessとwinptyを使って試してみます。 それでよいと思います。事前に検討しておいた方が良いのは A. pty を扱う実装 B. subprocess popen を扱う実装 (プロセスとのpipe) 対話型のプログラムを動かすなら pty で端末エミュレーターの実装。 後者は、バッファリング等が問題になることがあり、 (nano等のプログラムを動かすにあたっては) 実装制限になる可能性があります。 pexpect のドキュメントより Q: Why not just use a pipe (popen())? https://pexpect.readthedocs.io/en/stable/FAQ.html 他の選択肢として expect の利用ですが (簡易的なまとめ) 結論から言うとほぼ全滅でした。 - pythonライブラリの pexpect は tcl の expect を利用するものではなく  代替機能をpythonで再実装されたものです。 - windows向けpythonのexpect は winexpect, wexpect 保守切れ - pexpect の windows で使える機能は popen_spawn (実装は pty ではなくsubprocess型) - tcl の expect の windows 提供は、廃止されていた。(ActiveTcl) tcl/tk のプログラムも視野に入るなら、expect を用いた tkterm が500行程度の規模のコードで vi,emacs の稼働報告有です。 ライブラリとしての利用は難しそうですが、 フロント部分(tk) のコードは参考になるかもしれません。 ---- 疑似端末については、システムプログラミング寄りですね。 システムコールを呼ぶ手段の提供のみで、使い方には深く触れられていない。 Pythonよりも Linux/C言語 の方が情報は多いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問