Comment ajouter un widget de terminal vte dans GTK3?

8

J'essaie d'ajouter un vtewidget dans mon application et les exemples que j'ai trouvés .fork_command()pour exécuter une commande dans ce widget. Mais selon

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

il est obsolète et il est recommandé de l'utiliser fork_command_full(). Ce qui nécessite huit arguments obligatoires. N'ont-ils pas entendu le mot «par défaut »? J'ai pu construire des lignes qui fonctionnent d'une manière ou d'une autre:

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

Oui, je connais les énumérations, j'espère juste que je fais ça complètement mal et il y a un moyen beaucoup plus facile. En connaissez-vous?

PS J'utilise quicklyavec le ubuntu-applicationmodèle par défaut .

PPS La ligne d'importation est from gi.repository import Vte as vte

int_ua
la source
vous avez cette longue file plusieurs fois ou juste une fois?
RobotHumans
1
juste une fois maintenant mais je veux les ajouter dynamiquement à l'avenir.
int_ua

Réponses:

14

Voici un exemple de 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()
ADcomp
la source
Comment puis-je attraper / gérer / récupérer un utilisateur soumettant une «sortie» dans le terminal? A la sortie, aurais-je besoin de faire apparaître un nouveau terminal vte? ou peut-être simplement faire apparaître un nouveau shell à l'intérieur du terminal? De plus, pouvez-vous lier à la documentation sur la façon de manipuler le terminal vte, par exemple en ouvrant bash en cliquant sur une pression de bouton gtk?
ThorSummoner
5

S'appuyant sur la réponse d'ADcomp pour répondre à vouloir les ajouter dynamiquement à l'avenir, je pense que vous voudrez peut-être sous-classer 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()
RobotHumains
la source
Merci :) __init__(self, command)serait encore plus agréable, je vais essayer ça plus tard.
int_ua
@int_ua - plus ce que vous vouliez? je pensais que vous cherchiez simplement à intégrer un terme du contexte de la question
RobotHumans
4

Depuis VTE 0.38, vte_terminal_fork_command_full ()a été renommé en vte_terminal_spawn_sync (). Donc, si vous utilisez des versions plus récentes, vous devez modifier la réponse de @ ADcomp comme suit:

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