4

次のPythonコードを使用して、Tkinterウィンドウに(Ubuntu Linuxの)ターミナルウィンドウを埋め込みます。ターミナルウィンドウが起動したときに、ウィンドウにコマンド'shkBegin'を自動的に与えたいと思います。

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##

これをどのように機能させるのですか?

4

1 に答える 1

7

疑似端末スレーブの子に書き込むことで、シェルと対話できます。これがどのように機能するかのデモです。この回答は、 Linux疑似端末への回答に多少基づいています。ある端末から送信された文字列を別の端末で実行します。

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

ご了承ください

  1. 処理された xterm の子がリークされています (特に手順については、 の使用os.systemはお勧めしません。モジュールを参照してください)。&suprocess
  2. どのttyが使用されているかをプログラムで見つけることができない場合があります
  3. 各コマンドは新しい suprocess で実行されます (入力と出力のみが表示されます)。したがって、状態変更コマンドなどcdは効果がなく、xterm のコンテキスト ( cdxterm 内)

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()
于 2012-04-20T15:51:09.257 に答える