How to send commands to pygobject virtual terminal?

前端 未结 1 1687
盖世英雄少女心
盖世英雄少女心 2021-01-16 19:58

Right now I can make a terminal but the output is not used as a command. It just prints a string to the virtual terminal.

from gi.repository import Gtk, GObj         


        
相关标签:
1条回答
  • 2021-01-16 20:39

    Here's the answer. :) The important parts are fork_command_full and feed_child.

    from gi.repository import Gtk, GObject, Vte
    #GObject is not required. I just import it everywhere just in case.
    #Gtk, Vte, and GLib are required.
    from gi.repository import GLib
    import os
    #os.environ['HOME'] helps to keep from hard coding the home string.
    #os is not required unless you want that functionality.
    
    class TheWindow(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="inherited cell renderer")
            self.set_default_size(600, 300)
            self.terminal     = Vte.Terminal()
            self.terminal.fork_command_full(
                    Vte.PtyFlags.DEFAULT, #default is fine
                    os.environ['HOME'], #where to start the command?
                    ["/bin/sh"], #where is the emulator?
                    [], #it's ok to leave this list empty
                    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
                    None, #at least None is required
                    None,
                    )
            #Set up a button to click and run a demo command
            self.button = Gtk.Button("Do The Command")
            #To get the command to automatically run
            #a newline(\n) character is used at the end of the
            #command string.
            self.command = "echo \"Sending this command to a virtual terminal.\"\n"
            command = Gtk.Label("The command: "+self.command)
            self.button.connect("clicked", self.InputToTerm)
            #end demo command code
    
            #set up the interface
            box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
            box.pack_start(self.button, False, True, 0)
            box.pack_start(command, False, True, 1)
            #a scroll window is required for the terminal
            scroller = Gtk.ScrolledWindow()
            scroller.set_hexpand(True)
            scroller.set_vexpand(True)
            scroller.add(self.terminal)
            box.pack_start(scroller, False, True, 2)
            self.add(box)
    
        def InputToTerm(self, clicker):
            #get the command when the button is clicked
            length = len(self.command)
            #A length is not required but is the easiest mechanism.
            #Otherwise the command must be null terminated.
            #Feed the command to the terminal.
            self.terminal.feed_child(self.command, length)
    
    
    win = TheWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()
    
    0 讨论(0)
提交回复
热议问题