2014-01-16 42 views
2

我建立了一個標籤式python終端來管理多個ssh連接(就像windows上的superputty或putty manager),所以我用feed_child向終端發送命令,但是有一個小問題:寫入命令2時在終端上,時間上之前的一切..代碼更好:Gtk.Vte和feed_child:兩次發送命令

我使用它來發送命令(在這種情況下,例如命令uptime

if self.command != "": 
     self.length_command = len(self.command) + 1 
     self.hbox.term.feed_child(self.command + "\n", self.length_command) 

但在終端我得到這個結果

uptime 
[email protected] ~ $ uptime 
19:04:18 up 15 days, 14:32, 2 users, load average: 0,04, 0,07, 0,14 
[email protected] 

正如你所看到的,當我啓動程序或打開一個新標籤時,uptime會出現在正常文本的終端中,然後出現提示並正確執行命令。我想得到這個:

[email protected] ~ $ uptime 
19:04:18 up 15 days, 14:32, 2 users, load average: 0,04, 0,07, 0,14 
[email protected] 

任何想法?

更新 這裏有一個完整的代碼(應該作品):-)

#!/usr/bin/env python 
# -*- coding: utf-8; -*- 
from gi.repository import Gtk, Vte, GLib 
import os 

class Terminal(Vte.Terminal): 
    """Just create a standard terminal with some configuration 
    """ 
    def __init__(self): 
     super(Terminal, self).__init__() 
     self.configure_terminal() 

    def configure_terminal(self): 
     self.set_audible_bell(False) 
     self.set_visible_bell(False) 
     self.set_sensitive(True) 
     self.fork_command_full(Vte.PtyFlags.DEFAULT, os.environ['HOME'], ["/bin/bash"], 
        [], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None) 

class Window(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="Terminal") 

     self.box = Gtk.Box(spacing=6) 
     self.add(self.box) 

     self.term = Terminal() 
     self.box.pack_start(self.term, True, True, 0) 

     self.term.set_audible_bell(False) 
     self.term.set_visible_bell(False) 
     self.term.set_sensitive(True) 
     self.term.fork_command_full(Vte.PtyFlags.DEFAULT, os.environ['HOME'], ["/bin/bash"], 
        [], GLib.SpawnFlags.DO_NOT_REAP_CHILD, None, None) 

     self.command = 'uptime' 
     self.length_command = len(self.command) + 1 
     self.term.feed_child(self.command + "\n", self.length_command) 

     self.term.connect("child-exited", Gtk.main_quit) 


win = Window() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

如果你運行它,你會看到這個問題。 謝謝。

回答

-1

你忘了職業教育終端添加到ScrolledWindow第一:

Gtk.Window.__init__(self, title="Terminal") 
    self.set_default_size(600, 300) 

    self.box = Gtk.Box(spacing=6) 
    self.add(self.box) 

    self.term = Terminal() 
    self.sw = Gtk.ScrolledWindow() 
    self.sw.add(self.term) 
    self.box.pack_start(self.sw, True, True, 0)