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


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()

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()

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.