2012-04-20 14 views
4

私は以下のPythonコードを使用して、Tkinterウィンドウに端末ウィンドウ(Ubuntu Linuxから)を埋め込みます。ターミナルウィンドウが起動したとき、私は自動的にウィンドウでコマンド「SHのkBegin」を与えたいと思います:組み込み端末でコマンドを実行する

from Tkinter import * 
from os import system as cmd 

root = Tk() 
termf = Frame(root, height=800, width=1000) 

termf.pack(fill=BOTH, expand=YES) 
wid = termf.winfo_id() 
cmd('xterm -into %d -geometry 160x50 -sb &' % wid) 

root.mainloop() 

疑似:

cmd('xterm -into %d -geometry 160x50 -sb &' % wid) 
embedded_terminal('sh kBegin') 
# EMBEDDED TERMINAL DISPLAYS OUTPUT OF sh kBegin## 

がどのように私はこの作業になるだろうか?

+0

あなたがすべてで対話する必要がない場合は、あなたが使用することができます 'xtermの-into ... -sb -hold -e SH kBegin' – mgilson

+0

@ mgilsonありがとう、でもoターミナルと対話する必要があり、-fontタグも使用してエラーを返しました: "xterm -font -adobe-courier-medium-r-normal-18-180-75-75-m-110-iso8859- 1-in%d -geometry 88x37 -sb -hold -e sh kBegin」となる。 Tkinterのボタンを押すと、 "Hello World && "という文字列が端末に入力されます。ご協力いただきありがとうございます! :) – abkai

+0

これを行うことができれば、私は解決策にもかなり興味があります!私はしばしば、tkinterウィジェットの中に任意のx11ウィンドウを埋め込むことが可能かどうか疑問に思っています...私はそれもかなり気が利いていると思います... – mgilson

答えて

5

擬似端末のスレーブの子に書き込むことで、シェルとやり取りできます。ここでそれがうまくいく方法のデモがあります。この回答は、Linux pseudo-terminals: executing string sent from one terminal in anotherの回答に基づいています。

xtermが使用する擬似端末を(ttyコマンドによって)取得し、この擬似端末ファイルにメソッドの出力と入力をリダイレクトすることがポイントです。例えばls </dev/pts/1> /dev/pts/1 2> /dev/pts/1について

処理さ

  1. のxterm子がリークしていることに注意してください(特に&手順については、os.systemの使用は推奨されません。suprocess moduleを参照してください)。状態変更コマンドなどcdコンテキストと同様に、影響を及ぼさないよう
  2. は、
  3. 各コマンドが(表示されている唯一の入力および出力)新しいsuprocessで実行され使用されるTTYプログラムで見つけることが可能ではないかもしれません(xtermの中cd)のxtermの

from Tkinter import * 
from os import system as cmd 

root = Tk() 
termf = Frame(root, height=700, width=1000) 
termf.pack(fill=BOTH, expand=YES) 
wid = termf.winfo_id() 

f=Frame(root) 
Label(f,text="/dev/pts/").pack(side=LEFT) 
tty_index = Entry(f, width=3) 
tty_index.insert(0, "1") 
tty_index.pack(side=LEFT) 
Label(f,text="Command:").pack(side=LEFT) 
e = Entry(f) 
e.insert(0, "ls -l") 
e.pack(side=LEFT,fill=X,expand=1) 

def send_entry_to_terminal(*args): 
    """*args needed since callback may be called from no arg (button) 
    or one arg (entry) 
    """ 
    command=e.get() 
    tty="/dev/pts/%s" % tty_index.get() 
    cmd("%s <%s >%s 2> %s" % (command,tty,tty,tty)) 

e.bind("<Return>",send_entry_to_terminal) 
b = Button(f,text="Send", command=send_entry_to_terminal) 
b.pack(side=LEFT) 
f.pack(fill=X, expand=1) 

cmd('xterm -into %d -geometry 160x50 -sb -e "tty; sh" &' % wid) 

root.mainloop() 
+0

うわー!それは完璧に働いた!ありがとう!私は、あなたが提供したもので遊び、私の必要に応じてそれを明示します。しかし、その事例はうまくいった。ありがとうございました :) – abkai

関連する問題