我使用以下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##
我将如何得到这个工作?
您可以通过在伪终端从孩子写一个shell交互。 这里是作品怎么会演示。 此答案稍微基于回答的Linux伪终端:执行在另一个从一个终端发送的字符串 。
点是让通过的xterm(通过使用的伪终端tty
命令)和重定向输出和你的方法的输入到该伪终端文件。 例如ls < /dev/pts/1 > /dev/pts/1 2> /dev/pts/1
注意
- 处理xterm的孩子被泄露(使用
os.system
不推荐,特别是对&
说明。请参阅suprocess
模块 )。 - 它可能无法以编程方式找到使用哪个TTY
- 每个命令在一个新的suprocess(仅输入和输出显示)执行,所以状态修改命令,例如
cd
有(无效果,以及在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()