Paepoi

Paepoi » PyGObject Tips » 仮想端末エミュレーター

仮想端末エミュレーター

# 最終更新日 2019.09.08

Gedit 標準プラグインの Python コンソールとは全然違う。
gnome-terminal そのものが Widget として使えるレベルの代物である。
ただし。。。。。

参照

GNOME wiki の VTE Terminal Widget Library ページ。
Apps/Terminal/VTE - GNOME Wiki!

バージョンがややこいけど 2.91 は Gir のバージョンのようだ。
GNOME 3.32 の Vte 自体のバージョンは 0.56 に上がっているんだが。
0.39 の時からバインドは変わっていないということなので新しい API が使えない。

VTE Reference Manual - GNOME 開発センター
ヘルプも 0.50 以降は存在しない、あぁ Linux だなぁとしか。

参考になりそうなところをいくつか。
c - gtk+ vte scrollback not working - Stack Overflow
python - How to add vte terminal widget in GTK3? - Ask Ubuntu

サンプルコード

#!/usr/bin/env python3

import sys, gi
gi.require_version('Gtk', '3.0')
gi.require_version('Vte', '2.91')
from gi.repository import Gtk, Vte, GLib

class Win(Gtk.ApplicationWindow):
    '''
        Vte Sample (v2.91, v0.56)
    '''
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app, title='俺の端末')
        # Create a virtual terminal 
        terminal = Vte.Terminal()
        d = dir(terminal)
        for s in d: 
            if 'sync' in s: print(s)
        # Exit of Ctrl+D
        terminal.connect('child-exited', self.on_terminal_child_exited)
        # Sync
        terminal.spawn_sync(
            Vte.PtyFlags.DEFAULT,
            GLib.get_home_dir(),
            ['/bin/sh'],  #['/usr/bin/python3'],
            None,
            GLib.SpawnFlags.DO_NOT_REAP_CHILD)
        self.add(terminal)
        self.show_all()

    def on_terminal_child_exited(self, vteterminal, status):
        self.close()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)

    def do_startup(self):
        Gtk.Application.do_startup(self)
        Win(self)

    def do_activate(self):
        self.props.active_window.present()

app = App()
app.run(sys.argv)

動かせば解るけどマジで普通の端末、Ctrl+D で gnome-terminal 同様に終了する。
Python3 を起動し Ctrl+D でセッションの終了すると sh に戻る、マジで普通の端末。

ただ上記コードは下記「非推奨ですよ」という stderr を吐く。
Vte.Terminal.spawn_sync is deprecated
spawn_async が代替えなんだけどバインドされていないので使えない状態。
いやまあ Linux ですから。
Copyright(C) sasakima-nao All rights reserved 2002 --- 2020.