Come aggiungere un widget terminale vte in GTK3?


8

Sto provando ad aggiungere vtewidget nella mia applicazione e gli esempi che ho trovato servono .fork_command()per eseguire un comando in quel widget. Ma secondo

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

è stato deprecato ed è consigliato l'uso fork_command_full(). Che ha bisogno di otto argomenti obbligatori. Non hanno sentito la parola " valori predefiniti "? Sono stato in grado di costruire linee che funzionano in qualche modo:

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

Sì, conosco le enumerazioni, spero solo di sbagliarmi completamente e c'è un modo molto più semplice. Conosci qualche?

PS sto usando quicklycon il ubuntu-applicationmodello predefinito .

PPS La riga di importazione è from gi.repository import Vte as vte


hai una lunga serie di volte o solo una volta?
RobotHumans,

1
solo una volta in questo momento, ma voglio aggiungerli dinamicamente in futuro.
int_ua,

Risposte:


14

Ecco un esempio di base:

#!/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()

Come posso catturare / gestire / ripristinare da un utente che invia "exit" nel terminale? All'uscita dovrei generare un nuovo terminale VTE? o forse hai appena generato una nuova shell all'interno del terminale? Inoltre, puoi collegarti alla documentazione su come manipolare il terminale vte, ad esempio aprendo bash al clic di un pulsante gtk?
ThorSummoner,

5

Basandomi sulla risposta di ADcomp per rispondere al desiderio di aggiungerli in modo dinamico in futuro, penso che potresti voler sottoclassare 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()

Grazie :) __init__(self, command)sarebbe ancora più bello, ci proverò più tardi.
int_ua,

@int_ua - più quello che volevi? pensavo che stessi solo cercando di incorporare un termine dal contesto della domanda
RobotHumans,

4

Da VTE 0.38, vte_terminal_fork_command_full ()è stato rinominato in vte_terminal_spawn_sync (). Quindi, se si utilizzano versioni più recenti, è necessario modificare la risposta di @ ADcomp in quanto segue:

terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.