Я пытаюсь добавить виджет 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)
Да, я знаю о перечислениях, я просто надеюсь, что я делаю это совершенно неправильно, и есть гораздо более простой способ. Вы знаете кого-нибудь?
П.С. Я использую quickly
с шаблоном по умолчанию ubuntu-application
.
P.P.S. Строка импорта - from gi.repository import Vte as vte
Основываясь на ответе 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()
Вот основной пример:
#!/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()
Начиная с VTE 0.38, vte_terminal_fork_command_full ()
был переименован в vte_terminal_spawn_sync ()
. Поэтому, если вы используете более новые версии, вы должны изменить @ ADcomp's answer на следующее:
terminal.spawn_sync(
Vte.PtyFlags.DEFAULT,
os.environ['HOME'],
["/bin/sh"],
[],
GLib.SpawnFlags.DO_NOT_REAP_CHILD,
None,
None,
)
Vte.Terminal.spawn_sync устарел. Поэтому, если вы используете Vte версии 0.48 или выше, используйте вместо этого Vte.Terminal.spawn_async. Вот пример Vte.Terminal.spawn_async:
terminal.spawn_async(
Vte.PtyFlags.DEFAULT, # Pty Flags
os.environ['HOME'], # Working DIR
["/bin/bash"], # Command/BIN (argv)
None, # Environmental Variables (envv)
GLib.SpawnFlags.DEFAULT, # Spawn Flags
None, None, # Child Setup
-1, # Timeout (-1 for indefinitely)
None, # Cancellable
None, # Callback
None # User Data
)