2012-04-20 2 views
4

J'utilise le code python suivant pour intégrer une fenêtre de terminal (à partir d'Ubuntu Linux) dans une fenêtre Tkinter. Je voudrais donner la commande 'sh kBegin' dans la fenêtre automatiquement lorsque la fenêtre de terminal commence:Donner une commande dans un terminal embarqué

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() 

Pseudo:

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

Comment pourrais-je obtenir ce travail?

+0

Si vous n'avez pas besoin d'interagir tout, vous pouvez utiliser: 'xterm ... -dans -sb -hold -e sh kBegin' – mgilson

+0

@mgilson merci, mais je d o besoin d'interagir avec le terminal et il a retourné une erreur en utilisant la balise -font aussi: "xterm -font -adobe-courier-moyen-r-normal - 18-180-75-75-m-110-iso8859- 1 -into% d -geometry 88x37 -sb -hold -e sh kBegin ". J'ai besoin d'être en mesure d'envoyer des commandes de dire .. Un bouton de presse dans Tkinter entre le texte "Hello World && " dans le terminal. Merci de votre aide! :) – abkai

+0

Si vous pouvez le faire, je suis également très intéressé par la solution! Je me suis souvent demandé s'il était possible d'intégrer une fenêtre x11 arbitraire à l'intérieur d'un widget tkinter ... Je pense que ce serait aussi très intéressant ... – mgilson

Répondre

5

Vous pouvez interagir avec un shell en écrivant dans l'esclave pseudo-terminal. Voici une démo de comment cela pourrait fonctionner. Cette réponse est en partie basée sur une réponse à Linux pseudo-terminals: executing string sent from one terminal in another.

Le point est d'obtenir le pseudo-terminal utilisé par xterm (via la commande tty) et de rediriger la sortie et l'entrée de votre méthode vers ce fichier pseudo-terminal. Par exemple ls </dev/pts/1> /dev/pts/1 2> /dev/pts/1

Notez que

  1. enfant xterm sont traitées fuite (l'utilisation de os.system n'est pas recommandé, en particulier pour & instructions. Voir suprocess module).
  2. il peut ne pas être possible de trouver programme qui TTY est utilisé
  3. chaque commandes sont exécutées dans une nouvelle suprocess (seule l'entrée et la sortie est affichée), de sorte que la commande de modification de l'état tels que cd n'a pas d'effet, ainsi que le contexte du xterm (cd dans le 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

Wow! Cela a fonctionné parfaitement! Merci tas! Je vais avoir un jeu avec ce que vous avez fourni, et le manifester pour travailler à mes besoins. Mais cette instance a fonctionné sur place. Je vous remercie :) – abkai

Questions connexes