Erstellen Sie Ihre eigenen "Webbrowser"- und "Desktop-Recorder"-Anwendungen mit PyGobject - Teil 3
Dies ist der 3. Teil der Serie über das Erstellen von GUI-Anwendungen unter dem Linux-Desktop mit PyGObject. Heute werden wir über die Verwendung einiger fortgeschrittener Python-Module und -Bibliotheken in unseren Programmen wie 'os', 'WebKit', 'requests' und anderen sprechen, neben einigen anderen nützlichen Informationen für die Programmierung.
Anforderungen
Sie müssen alle diese vorherigen Teile der Serie von hier aus durchgehen, um weitere Anweisungen zum Erstellen erweiterter Anwendungen zu erhalten:
- Erstellen von GUI-Anwendungen unter Linux-Desktop mit PyGObject – Teil 1
- Erstellen erweiterter PyGobject-Anwendungen unter Linux – Teil 2
Module und Bibliotheken in Python sind sehr nützlich, anstatt viele Unterprogramme zu schreiben, um einige komplizierte Aufgaben zu erledigen, die viel Zeit und Arbeit in Anspruch nehmen, können Sie sie einfach importieren! Ja, importieren Sie einfach die Module und Bibliotheken, die Sie in Ihr Programm benötigen, und Sie werden in der Lage sein, viel Zeit und Mühe zu sparen, um Ihr Programm zu vervollständigen.
Es gibt viele bekannte Module für Python, die Sie im Python Module Index finden können.
Sie können auch Bibliotheken für Ihr Python-Programm importieren, aus "gi.repository import Gtk" importiert diese Zeile die GTK-Bibliothek in das Python-Programm, es gibt viele andere Bibliotheken wie Gdk, WebKit.. etc.
Erstellen von erweiterten GUI-Anwendungen
Heute erstellen wir 2 Programme:
- Ein einfacher Webbrowser; , die die WebKit-Bibliothek verwendet.
- Ein Desktop-Recorder mit dem Befehl 'avconv'; , die das 'os'-Modul von Python verwendet.
Ich werde Ihnen nicht erklären, wie Sie von nun an Widgets per Drag & Drop in den Glade-Designer ziehen können, ich werde Ihnen nur die Namen der Widgets nennen, die Sie erstellen müssen, zusätzlich werde ich Ihnen die .glade-Datei für jedes Programm und auf jeden Fall die Python-Datei geben.
Erstellen eines einfachen Webbrowsers
Um einen Webbrowser zu erstellen, müssen wir die "WebKit" -Engine verwenden, die eine Open-Source-Rendering-Engine für das Web ist, es ist die gleiche, die in Chrome/Chromium verwendet wird, für weitere Informationen können Sie auf der offiziellen Webkit.org Website lesen.
Zuerst müssen wir die GUI erstellen, den Glade-Designer öffnen und die folgenden Widgets hinzufügen. Weitere Informationen zum Erstellen von Widgets finden Sie in Teil 1 und Teil 2 dieser Serie (Links oben).
- Erstellen Sie das Widget 'window1'.
- Erstellen Sie die Widgets 'box1' und 'box2'.
- Erstellen Sie die Widgets 'button1' und 'button2'.
- Erstellen Sie das Widget 'entry1'.
- Erstellen Sie das Widget 'scrolledwindow1'.
Nachdem Sie Widgets erstellt haben, erhalten Sie die folgende Oberfläche.
Es gibt nichts Neues, außer dem Widget "Scrolled Window"; Dieses Widget ist wichtig, damit die WebKit-Engine darin implantiert werden kann, mit dem Widget "Scrolled Window" können Sie auch horizontal und vertikal scrollen, während Sie auf den Websites surfen.
Sie müssen nun den "backbutton_clicked"-Handler zum "Geklickt"-Signal "Zurück"-Button, den "refreshbutton_clicked"-Handler zum "Refresh-Button-Klicksignal" und den "enterkey_clicked"-Handler zum "aktiviert"-Signal für den Eintrag hinzufügen.
Die vollständige .glade-Datei für die Schnittstelle finden Sie hier.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Our Simple Browser</property>
<property name="window_position">center</property>
<property name="default_width">1000</property>
<property name="default_height">600</property>
<property name="icon_name">applications-internet</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox" id="box2">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-go-back</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="backbutton_clicked" 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="button2">
<property name="label">gtk-refresh</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="refreshbutton_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="activate" handler="enterkey_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="hscrollbar_policy">always</property>
<property name="shadow_type">in</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Kopieren Sie nun den obigen Code und fügen Sie ihn in die Datei "ui.glade" in Ihrem Home-Ordner ein. Erstellen Sie nun eine neue Datei mit dem Namen "mywebbrowser.py " und geben Sie den folgenden Code ein, die gesamte Erklärung finden Sie in den Kommentaren.
#!/usr/bin/python
-*- coding: utf-8 -*-
## Here we imported both Gtk library and the WebKit engine.
from gi.repository import Gtk, WebKit
class Handler:
def backbutton_clicked(self, button):
## When the user clicks on the Back button, the '.go_back()' method is activated, which will send the user to the previous page automatically, this method is part from the WebKit engine.
browserholder.go_back()
def refreshbutton_clicked(self, button):
## Same thing here, the '.reload()' method is activated when the 'Refresh' button is clicked.
browserholder.reload()
def enterkey_clicked(self, button):
## To load the URL automatically when the "Enter" key is hit from the keyboard while focusing on the entry box, we have to use the '.load_uri()' method and grab the URL from the entry box.
browserholder.load_uri(urlentry.get_text())
## Nothing new here.. We just imported the 'ui.glade' file.
builder = Gtk.Builder()
builder.add_from_file("ui.glade")
builder.connect_signals(Handler())
window = builder.get_object("window1")
## Here's the new part.. We created a global object called 'browserholder' which will contain the WebKit rendering engine, and we set it to 'WebKit.WebView()' which is the default thing to do if you want to add a WebKit engine to your program.
browserholder = WebKit.WebView()
## To disallow editing the webpage.
browserholder.set_editable(False)
## The default URL to be loaded, we used the 'load_uri()' method.
browserholder.load_uri("https://linux-console.net")
urlentry = builder.get_object("entry1")
urlentry.set_text("https://linux-console.net")
## Here we imported the scrolledwindow1 object from the ui.glade file.
scrolled_window = builder.get_object("scrolledwindow1")
## We used the '.add()' method to add the 'browserholder' object to the scrolled window, which contains our WebKit browser.
scrolled_window.add(browserholder)
## And finally, we showed the 'browserholder' object using the '.show()' method.
browserholder.show()
## Give that developer a cookie !
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
Speichern Sie die Datei, und führen Sie sie aus.
$ chmod 755 mywebbrowser.py
./mywebbrowser.py
Und das ist es, was Sie bekommen werden.
Sie können sich auf die offizielle Dokumentation von WebKitGtk beziehen, um weitere Optionen zu entdecken.
Erstellen eines einfachen Desktop-Recorders
In diesem Abschnitt lernen wir, wie Sie lokale Systembefehle oder Shell-Skripte aus der Python-Datei mit dem Modul 'os' ausführen, das uns hilft, mit dem Befehl 'avconv' einen einfachen Bildschirmrekorder für den Desktop zu erstellen.
Öffnen Sie den Glade-Designer, und erstellen Sie die folgenden Widgets:
- Erstellen Sie das Widget 'window1'.
- Erstellen Sie das Widget 'box1'.
- Erstellen Sie die Widgets 'button1', 'button2' und 'button3'.
- Erstellen Sie das Widget 'entry1'.
Nachdem Sie die oben genannten Widgets erstellt haben, gelangen Sie zur folgenden Benutzeroberfläche.
Hier ist die vollständige ui.glade-Datei.
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Our Simple Recorder</property>
<property name="window_position">center</property>
<property name="default_width">300</property>
<property name="default_height">30</property>
<property name="icon_name">applications-multimedia</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkEntry" id="entry1">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-media-record</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="recordbutton" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-media-stop</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="stopbutton" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button3">
<property name="label">gtk-media-play</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="playbutton" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
Kopieren Sie wie üblich den obigen Code und fügen Sie ihn in die Datei "ui.glade" in Ihrem Home-Verzeichnis ein, erstellen Sie eine neue "myrecorder.py" -Datei und geben Sie den folgenden Code ein (Jede neue Zeile wird in den Kommentaren erklärt).
#!/usr/bin/python
-*- coding: utf-8 -*-
## Here we imported both Gtk library and the os module.
from gi.repository import Gtk
import os
class Handler:
def recordbutton(self, button):
## We defined a variable: 'filepathandname', we assigned the bash local variable '$HOME' to it + "/" + the file name from the text entry box.
filepathandname = os.environ["HOME"] + "/" + entry.get_text()
## Here exported the 'filepathandname' variable from Python to the 'filename' variable in the shell.
os.environ["filename"] = filepathandname
## Using 'os.system(COMMAND)' we can execute any shell command or shell script, here we executed the 'avconv' command to record the desktop video & audio.
os.system("avconv -f x11grab -r 25 -s `xdpyinfo | grep 'dimensions:'|awk '{print $2}'` -i :0.0 -vcodec libx264 -threads 4 $filename -y & ")
def stopbutton(self, button):
## Run the 'killall avconv' command when the stop button is clicked.
os.system("killall avconv")
def playbutton(self, button):
## Run the 'avplay' command in the shell to play the recorded file when the play button is clicked.
os.system("avplay $filename &")
## Nothing new here.. We just imported the 'ui.glade' file.
builder = Gtk.Builder()
builder.add_from_file("ui.glade")
builder.connect_signals(Handler())
window = builder.get_object("window1")
entry = builder.get_object("entry1")
entry.set_text("myrecording-file.avi")
## Give that developer a cookie !
window.connect("delete-event", Gtk.main_quit)
window.show_all()
Gtk.main()
Führen Sie nun die Datei aus, indem Sie die folgenden Befehle im Terminal anwenden.
$ chmod 755 myrecorder.py
./myrecorder.py
Und Sie haben Ihren ersten Desktop-Recorder.
Weitere Informationen zum Modul 'os' finden Sie in der Python OS Library.
Und das war's, das Erstellen von Anwendungen für den Linux-Desktop ist mit PyGObject nicht schwer, Sie müssen nur die GUI erstellen, einige Module importieren und die Python-Datei mit der GUI verknüpfen, nicht mehr und nicht weniger. Es gibt viele nützliche Tutorials dazu auf der PyGObject-Website:
Haben Sie versucht, Anwendungen mit PyGObject zu erstellen? Was halten Sie davon? Welche Anwendungen haben Sie bereits entwickelt?






