Wie füge ich ein vte Terminal Widget in GTK3 hinzu?

8

Ich versuche, vtemeiner Anwendung ein Widget hinzuzufügen, und die Beispiele, die ich gefunden habe, verwenden .fork_command(), um einen Befehl in diesem Widget auszuführen. Aber laut

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

Es war veraltet und es wird empfohlen, es zu verwenden fork_command_full(). Welches braucht acht zwingende Argumente. Haben sie das Wort " Standard " nicht gehört ? Ich konnte Linien konstruieren, die irgendwie funktionieren:

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

Ja, ich kenne die Aufzählungen, ich hoffe nur, dass ich das völlig falsch mache und es einen viel einfacheren Weg gibt. Kennst du irgendwelche?

PS Ich verwende quicklymit der Standardvorlage ubuntu-application.

PPS Die Importzeile ist from gi.repository import Vte as vte

int_ua
quelle
Sie haben diese lange Schlange ein paar Mal oder nur einmal?
RobotHumans
1
im Moment nur einmal, aber ich möchte sie in Zukunft dynamisch hinzufügen.
int_ua

Antworten:

14

Hier ein einfaches Beispiel:

#!/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
quelle
Wie kann ich einen Benutzer abfangen, verarbeiten oder wiederherstellen, der im Terminal "exit" sendet? Muss ich beim Beenden ein neues vte-Terminal erzeugen? oder vielleicht einfach eine neue Shell im Terminal erzeugen? Können Sie außerdem einen Link zur Dokumentation zur Manipulation des vte-Terminals erstellen, z. B. zum Öffnen der Bash beim Klicken auf eine gtk-Taste?
ThorSummoner
5

Aufbauend auf der Antwort von ADcomp auf die Frage, ob sie in Zukunft dynamisch hinzugefügt werden sollen, möchten Sie möglicherweise Vte.terminal unterordnen.

#!/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()
RobotHumans
quelle
Danke :) __init__(self, command)wäre noch schöner, ich werde es später versuchen.
int_ua
@int_ua - mehr was du wolltest? Ich dachte, Sie
wollten
4

Seit VTE 0.38 vte_terminal_fork_command_full ()wurde in umbenannt vte_terminal_spawn_sync (). Wenn Sie also neuere Versionen verwenden, müssen Sie die Antwort von @ ADcomp wie folgt ändern :

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