Jak dodać widżet terminalu Vte w GTK3?

8

Próbuję dodać vtewidżet do mojej aplikacji i przykłady, które znalazłem, .fork_command()aby wykonać polecenie w tym widżecie. Ale zgodnie z

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

był przestarzały i zaleca się jego użycie fork_command_full(). Który wymaga ośmiu obowiązkowych argumentów. Czy nie słyszeli słowa „ domyślnie ”? Byłem w stanie zbudować linie, które jakoś działają:

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

Tak, wiem o wyliczeniach, mam tylko nadzieję, że robię to całkowicie źle i jest o wiele łatwiejszy sposób. Czy znasz jakieś?

PS Używam quicklyz domyślnym ubuntu-applicationszablonem.

PPS Linia importu to from gi.repository import Vte as vte

int_ua
źródło
masz tę długą linię kilka razy czy tylko raz?
RobotHumans
1
teraz tylko raz, ale chcę je dynamicznie dodawać w przyszłości.
int_ua

Odpowiedzi:

14

Oto podstawowy przykład:

#!/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
źródło
Jak mogę złapać / obsłużyć / odzyskać od użytkownika przesyłającego „wyjście” w terminalu? Czy przy wyjściu musiałbym utworzyć nowy terminal VTE? a może po prostu spawnujesz nową powłokę w terminalu? Dodatkowo, czy możesz połączyć się z dokumentacją dotyczącą manipulowania terminalem vte, np. Otwieranie bash po kliknięciu przycisku GTK?
ThorSummoner,
5

Opierając się na odpowiedzi ADcomp na adres, który chce dodać je dynamicznie w przyszłości, myślę, że możesz chcieć podklasować 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()
RobotHumans
źródło
Dzięki :) __init__(self, command)byłoby jeszcze ładniej, spróbuję tego później.
int_ua
@int_ua - więcej tego, czego chciałeś? myślałem, że chcesz po prostu osadzić termin z kontekstu pytania
RobotHumans
4

Od VTE 0.38 vte_terminal_fork_command_full ()został przemianowany na vte_terminal_spawn_sync (). Jeśli więc używasz nowszych wersji, musisz zmienić odpowiedź @ ADcomp na następujące:

terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )
użytkownik12205
źródło