Как добавить виджет терминала vte в GTK3?

8

Я пытаюсь добавить vteвиджет в свое приложение и примеры, которые я нашел, используют .fork_command()для выполнения команды в этом виджете. Но согласно

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

это устарело, и его рекомендуется использовать fork_command_full(). Что требует восьми обязательных аргументов. Разве они не слышали слово "по умолчанию "? Я был в состоянии построить линии, которые работают как-то:

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

Да, я знаю о перечислениях, я просто надеюсь, что я делаю это совершенно неправильно, и есть гораздо более простой способ. Вы знаете кого-нибудь?

PS Я использую quicklyс ubuntu-applicationшаблоном по умолчанию .

PPS строка импорта from gi.repository import Vte as vte

int_ua
источник
у вас есть такая длинная очередь несколько раз или только один раз?
RobotHumans
1
только один раз прямо сейчас, но я хочу добавить их динамически в будущем.
int_ua

Ответы:

14

Вот основной пример:

#!/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
источник
Как я могу поймать / обработать / восстановить пользователя, отправившего «выход» в терминале? При выходе мне нужно будет создать новый терминал VTE? или, возможно, просто создать новую оболочку внутри терминала? Кроме того, вы можете сослаться на документацию о том, как манипулировать терминалом vte, например, открывать bash при нажатии кнопки gtk?
ThorSummoner
5

Основываясь на ответе ADcomp на адрес, желающий добавить их динамически в будущем, я думаю, что вы, возможно, захотите создать подкласс 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
источник
Спасибо :) __init__(self, command)будет еще приятнее, попробую позже.
int_ua
@int_ua - больше того, что вы хотели? я думал, что вы просто хотите вставить термин из контекста вопроса
RobotHumans
4

Начиная с VTE 0.38, vte_terminal_fork_command_full ()был переименован в vte_terminal_spawn_sync (). Поэтому, если вы используете более новые версии, вы должны изменить ответ @ ADcomp следующим образом:

terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )
user12205
источник