Como adicionar um widget de terminal vte no GTK3?

8

Estou tentando adicionar um vtewidget ao meu aplicativo e os exemplos que encontrei .fork_command()para executar um comando nesse widget. Mas de acordo com

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

foi preterido e é recomendado o uso fork_command_full(). O que precisa de oito argumentos obrigatórios. Eles não ouviram a palavra " padrão "? Consegui construir linhas que funcionam de alguma forma:

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

Sim, eu sei sobre as enumerações, só espero que eu esteja fazendo isso completamente errado e que haja uma maneira muito mais fácil. Você conhece algum?

PS estou usando quicklycom o ubuntu-applicationmodelo padrão .

PPS A linha de importação é from gi.repository import Vte as vte

int_ua
fonte
você tem essa longa fila várias vezes ou apenas uma vez?
RobotHumans
1
apenas uma vez agora, mas quero adicioná-los dinamicamente no futuro.
int_ua

Respostas:

14

Aqui está um exemplo básico:

#!/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
fonte
Como posso capturar / manipular / recuperar de um usuário que está enviando 'exit' no terminal? Na saída, eu precisaria gerar um novo terminal vte? ou talvez apenas gerar uma nova concha dentro do terminal? Além disso, você pode acessar a documentação sobre como manipular o terminal vte, por exemplo, abrir o bash ao clicar em um botão gtk?
ThorSummoner
5

Com base na resposta do ADcomp para resolver querer adicioná-los dinamicamente no futuro, acho que você pode querer subclassificar 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
fonte
Obrigado :) __init__(self, command)seria ainda melhor, vou tentar isso mais tarde.
int_ua
@int_ua - mais o que você queria? Pensei que você estivesse olhando apenas para incorporar um prazo a partir do contexto da pergunta
RobotHumans
4

Desde o VTE 0,38, vte_terminal_fork_command_full ()foi renomeado para vte_terminal_spawn_sync (). Portanto, se você estiver usando versões mais recentes, precisará alterar a resposta do @ ADcomp para o seguinte:

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