Bagaimana cara menambahkan widget terminal vte di GTK3?


8

Saya mencoba menambahkan vtewidget di aplikasi saya dan contoh-contoh yang saya temukan digunakan .fork_command()untuk menjalankan perintah di widget itu. Namun menurut

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

itu sudah usang dan dianjurkan untuk digunakan fork_command_full(). Yang membutuhkan delapan argumen wajib. Bukankah mereka mendengar kata " standar "? Saya dapat membuat garis yang berfungsi:

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

Ya, saya tahu tentang enum, saya hanya berharap bahwa saya melakukan ini sepenuhnya salah dan ada cara yang lebih mudah. Apakah kamu tahu?

PS Saya menggunakan quicklydengan ubuntu-applicationtemplate default .

PPS Baris impor adalah from gi.repository import Vte as vte


Anda memiliki garis panjang itu beberapa kali atau hanya sekali?
RobotHumans

1
hanya sekali sekarang tapi saya ingin menambahkannya secara dinamis di masa depan.
int_ua

Jawaban:


14

Berikut contoh dasar:

#!/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()

Bagaimana saya bisa menangkap / menangani / memulihkan dari pengguna yang mengirimkan 'keluar' di terminal? Saat keluar, apakah saya perlu menelurkan terminal vte baru? atau mungkin hanya menelurkan shell baru di dalam terminal? Selain itu, dapatkah Anda menautkan ke dokumentasi tentang cara memanipulasi terminal vte, misalnya membuka bash saat mengklik tombol gtk?
ThorSummoner

5

Membangun jawaban ADcomp ke alamat yang ingin menambahkannya secara dinamis di masa depan, saya pikir Anda mungkin ingin subkelas 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()

Terima kasih :) __init__(self, command)akan lebih baik, saya akan coba ini nanti.
int_ua

@int_ua - lebih dari yang Anda inginkan? saya pikir Anda hanya ingin menanamkan istilah dari konteks pertanyaan
RobotHumans

4

Sejak VTE 0.38, vte_terminal_fork_command_full ()telah diubah namanya menjadi vte_terminal_spawn_sync (). Jadi jika Anda menggunakan versi yang lebih baru, Anda harus mengubah jawaban @ ADcomp menjadi yang berikut:

terminal.spawn_sync(
    Vte.PtyFlags.DEFAULT,
    os.environ['HOME'],
    ["/bin/sh"],
    [],
    GLib.SpawnFlags.DO_NOT_REAP_CHILD,
    None,
    None,
    )
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.