Exterminate!
| Anke (encarsia) | Auch verfügbar in: English
Das VTE-Terminal-Widget
Glade
Das Widget findet man in der Widget-Seitenleiste ganz unten und stellt ein fertiges Terminal bereit. Um das Terminal auf exit
zu schließen, muss das Signal child-exited abgefangen werden.
Ein Klick auf den Button soll innerhalb dieses Terminals eine Python-Konsole starten, hier wird also das clicked-Signal belegt.
Python
Elemente außerhalb des Gtk-Moduls, die mit Glade verwendet werden, müssen als GObject-Typ registriert werden (dies betrifft beispielsweise auch das GtkSource.View-Widget (Modul GtkSource):
GObject.type_register(Vte.Terminal)
Das Terminal wird mit der Funktion spawn_sync
initiiert, die diverse Parameter erwartet. Die Dokumentation liefert Details, für eine einfache Bash kommt man mit viel Defaults und Nones aus:
terminal.spawn_sync( Vte.PtyFlags.DEFAULT, None, ["/bin/bash"], None, GLib.SpawnFlags.DEFAULT, )
Um eine Eingabe an die Konsole zu schicken, bedarf es der Funktion feed_child
. Als Parameter muss der auszuführende Befehl als UTF-8-kodierter String inklusive newline, also dem "Enter" übergeben werden:
command = "python\n" x.terminal.feed_child(command.encode())
Die Ausgabe ins Terminal kann mit der Funktion get_text()
abgefangen werden. Die Funktion gibt ein Tupel zurück, dessen erstes Element der Ausgabestring ist. Dieser enthält allerdings den gesamten Terminalinhalt, also auch viele Leerzeilen, die sich mit herkömmlichen String-Operationen beseitigen lassen.
widget.get_text()[0].rstrip()
Listings
Python
#!/usr/bin/python # -*- coding: utf-8 -*- import os import gi gi.require_version("Gtk", "3.0") gi.require_version("Vte", "2.91") from gi.repository import Gtk, Vte, GObject, GLib class Handler: def on_window_destroy(self, *args): Gtk.main_quit() def on_button_clicked(self, widget): command = "python\n" x.terminal.feed_child(command.encode()) class Example: def __init__(self): self.builder = Gtk.Builder() GObject.type_register(Vte.Terminal) self.builder.add_from_file("11_terminal.glade") self.builder.connect_signals(Handler()) self.terminal = self.builder.get_object("term") self.terminal.spawn_sync( Vte.PtyFlags.DEFAULT, None, ["/bin/bash"], None, GLib.SpawnFlags.DEFAULT, ) window = self.builder.get_object("window") window.show_all() def main(self): Gtk.main() x = Example() x.main()
Glade
<?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.20.0 --> <interface> <requires lib="gtk+" version="3.20"/> <requires lib="vte-2.91" version="0.46"/> <object class="GtkApplicationWindow" id="window"> <property name="can_focus">False</property> <signal name="destroy" handler="on_window_destroy" swapped="no"/> <child> <object class="GtkBox"> <property name="visible">True</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> <object class="VteTerminal" id="term"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="has_focus">True</property> <property name="hscroll_policy">natural</property> <property name="vscroll_policy">natural</property> <property name="encoding">UTF-8</property> <property name="scroll_on_keystroke">True</property> <property name="scroll_on_output">False</property> <signal name="child-exited" handler="on_window_destroy" swapped="no"/> </object> <packing> <property name="expand">False</property> <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkButton" id="button"> <property name="label" translatable="yes">start python console</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <signal name="clicked" handler="on_button_clicked" swapped="no"/> </object> <packing> <property name="expand">False</property> <property name="fill">False</property> <property name="position">2</property> </packing> </child> </object> </child> <child type="titlebar"> <placeholder/> </child> </object> </interface>
Kommentare
Comments powered by Disqus