Виртуальная оболочка Python с Vte.Pty.spawn_async () - PullRequest
0 голосов
/ 11 марта 2019

Я хотел бы добавить виртуальную оболочку Python с Vte в мое приложение Python3 для GTK3.0 и Я могу сделать это с помощью метода spawn_sync () , но этот метод устарел, поэтому я хотел бы сделать это с предпочтительным способом с Vte.Pty.spawn_async (), но я не понимаю, как ... Я пробовал некоторые части кода, но безуспешно. Пожалуйста, дайте мне кто-нибудь какой-нибудь рабочий код на python. Например, я попробовал такой вариант:

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

    class TheWindow(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, title="GTK3 IDE")
            self.set_default_size(600, 300)

            self.terminal = Vte.Terminal()
            self.pty = self.terminal.pty_new_sync(Vte.PtyFlags.DEFAULT)
            #self.pty.child_setup()
            #self.pty = Vte.Pty(fd=-1)
            #self.pty.new_sync(Vte.PtyFlags.DEFAULT, None)

            self.pty.spawn_async(
                None,
                ["/bin/python"],
                None,
                GLib.SpawnFlags.DO_NOT_REAP_CHILD,
                None,
                None,
                -1,
                None,
                self.ready
                )

        def ready(self, pty, task):
            print('pty ', pty)

            self.terminal.set_pty(self.pty)

            box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

            scroller = Gtk.ScrolledWindow()
            scroller.set_hexpand(True)
            scroller.set_vexpand(True)
            scroller.add(self.terminal)
            box.pack_start(scroller, False, True, 2)
            self.add(box)

    win=TheWindow()
    win.connect('destroy', Gtk.main_quit)
    win.show_all()
    Gtk.main()

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Есть окончательное рабочее решение, я допустил ошибки, теперь оно работает отлично :). Спасибо @ elya5 за ответ:).

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

    class TheWindow(Gtk.Window):
        def __init__(self):
            Gtk.Window.__init__(self, title="GTK3 IDE")
            self.set_default_size(600, 300)

            terminal = Vte.Terminal()
            #pty = terminal.pty_new_sync(Vte.PtyFlags.DEFAULT)
            pty = Vte.Pty.new_sync(Vte.PtyFlags.DEFAULT)
            terminal.set_pty(pty)

            pty.spawn_async(
                None,
                ["/bin/python"],
                None,
                GLib.SpawnFlags.DO_NOT_REAP_CHILD,
                None,
                None,
                -1,
                None,
                self.ready
                )

            #self.terminal.get_pty(self.pty)

            box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)

            scroller = Gtk.ScrolledWindow()
            scroller.set_hexpand(True)
            scroller.set_vexpand(True)
            scroller.add(terminal)
            box.pack_start(scroller, False, True, 2)
            self.add(box)

        def ready(self, pty, task):
            print('pty ', pty)


    win=TheWindow()
    win.connect('destroy', Gtk.main_quit)
    win.show_all()
    Gtk.main()
0 голосов
/ 12 марта 2019

Похоже, вы пропустили 2 аргумента: Gio.Cancellable и Gio.AsyncReadyCallback. Они упомянуты в документации .

Вам необходим обратный вызов, чтобы знать, когда асинхронный вызов завершен.

class TheWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="GTK3 IDE")

        self.box = Gtk.HBox(spacing=6)
        self.add(self.box)

        self.terminal = Vte.Terminal()
        self.terminal.pty_new_sync(Vte.PtyFlags.DEFAULT)

        self.pty = Vte.Pty()
        self.pty.new_sync(Vte.PtyFlags.DEFAULT, None)
        self.pty.spawn_async(
            None,
            ["/bin/python"],
            None,
            GLib.SpawnFlags.DO_NOT_REAP_CHILD,
            None,
            None,
            -1,
            None,
            self.ready
            )

    def ready(self, pty, task):
        print('pty ', pty)
...