¿Cómo agregar un widget de terminal vte en GTK3?

8

Estoy tratando de agregar un vtewidget en mi aplicación y los ejemplos que he encontrado sirven .fork_command()para ejecutar un comando en ese widget. Pero según

http://developer.gnome.org/vte/0.26/VteTerminal.html#vte-terminal-fork-command

fue obsoleto y se recomienda su uso fork_command_full(). Que necesita ocho argumentos obligatorios. ¿No han escuchado la palabra " valores predeterminados "? He podido construir líneas que funcionan de alguna manera:

pty_flags = vte.PtyFlags(0)
terminal.fork_command_full(pty_flags, "/home/int", ("/bin/bash", ), "", 0, None, None)

Sí, sé sobre las enumeraciones, solo espero que esté haciendo esto completamente mal y que haya una manera mucho más fácil. ¿Conoce alguna?

PD: estoy usando quicklyla ubuntu-applicationplantilla predeterminada .

PPS La línea de importación es from gi.repository import Vte as vte

int_ua
fuente
tienes esa larga fila muchas veces o solo una vez?
RobotHumans
1
solo una vez en este momento, pero quiero agregarlos dinámicamente en el futuro.
int_ua

Respuestas:

14

Aquí un ejemplo básico:

#!/usr/bin/env python

from gi.repository import Gtk, Vte
from gi.repository import GLib
import os

terminal     = Vte.Terminal()
terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )

win = Gtk.Window()
win.connect('delete-event', Gtk.main_quit)
win.add(terminal)
win.show_all()

Gtk.main()
ADcomp
fuente
¿Cómo puedo atrapar / manejar / recuperar a un usuario que envía 'salir' en la terminal? ¿A la salida necesitaría generar una nueva terminal vte? o tal vez solo genera un nuevo shell dentro de la terminal? Además, ¿puede vincular a la documentación sobre cómo manipular el terminal vte, por ejemplo, abrir bash al hacer clic con el botón gtk?
ThorSummoner
5

Sobre la base de la respuesta de ADcomp a la dirección que desea agregarlos dinámicamente en el futuro, creo que es posible que desee subclase Vte.terminal.

#!/usr/bin/env python

from gi.repository import Gtk, Vte
from gi.repository import GLib
import os

class MyTerm(Vte.Terminal):
    def __init__(self, *args, **kwds):
        super(MyTerm, self).__init__(*args, **kwds)
        self.spawn_sync(
            Vte.PtyFlags.DEFAULT,
            os.environ['HOME'],
            ["/bin/sh"],
            [],
            GLib.SpawnFlags.DO_NOT_REAP_CHILD,
            None,
            None,
            )

win = Gtk.Window()
win.connect('delete-event', Gtk.main_quit)
bigbox = Gtk.Box()
win.add(bigbox)
bigbox.add(MyTerm())
bigbox.add(MyTerm())
win.show_all()

Gtk.main()
RobotHumanos
fuente
Gracias :) __init__(self, command)sería aún mejor, lo intentaré más tarde.
int_ua
@int_ua: ¿más de lo que querías? pensé que solo buscabas insertar un término desde el contexto de la pregunta
RobotHumans
4

Desde VTE 0.38, se vte_terminal_fork_command_full ()ha cambiado el nombre a vte_terminal_spawn_sync (). Entonces, si está utilizando versiones más nuevas, debe cambiar la respuesta de @ ADcomp a la siguiente:

terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )
usuario12205
fuente