Zoeken op website

Creëer uw eigen 'webbrowser'- en 'Desktop Recorder'-applicaties met PyGobject - Deel 3


Dit is het 3e deel van de serie over het maken van GUI-applicaties onder het Linux-bureaublad met behulp van PyGObject. Vandaag zullen we het hebben over het gebruik van enkele geavanceerde Python-modules en -bibliotheken in onze programma's, zoals 'os', 'WebKit', 'requests' en anderen, naast enkele andere nuttige informatie voor programmeren.

Vereisten

U moet vanaf hier al deze voorgaande delen van de serie doorlopen om verdere instructies te volgen over het maken van geavanceerdere toepassingen:

  1. Creëer GUI-applicaties onder Linux Desktop met PyGObject - Deel 1
  2. Geavanceerde PyGobject-applicaties maken op Linux – Deel 2

Modules en bibliotheken in Python zijn erg handig. In plaats van veel subprogramma's te schrijven om ingewikkelde taken uit te voeren die veel tijd en werk vergen, kun je ze gewoon importeren! Ja, importeer gewoon de modules en bibliotheken die u nodig heeft in uw programma en u zult veel tijd en moeite kunnen besparen bij het voltooien van uw programma.

Er zijn veel bekende modules voor Python, die je kunt vinden op Python Module Index.

Je kunt ook bibliotheken importeren voor je Python-programma, vanuit “gi.repository import Gtk ” importeert deze regel de GTK-bibliotheek in het Python-programma, er zijn veel andere bibliotheken zoals Gdk, WebKit.. etc.

Geavanceerde GUI-applicaties maken

Vandaag maken we 2 programma's:

  1. Een eenvoudige webbrowser; die de WebKit-bibliotheek zal gebruiken.
  2. Een desktoprecorder die de opdracht ‘avconv’ gebruikt; die de ‘os’-module van Python zal gebruiken.

Ik zal vanaf nu niet meer uitleggen hoe je widgets moet slepen en neerzetten in de Glade-ontwerper, ik zal je alleen de naam vertellen van de widgets die je moet maken, daarnaast zal ik je de .glade-bestand voor elk programma, en zeker het Python-bestand.

Een eenvoudige webbrowser maken

Om een webbrowser te maken, moeten we de “WebKit”-engine gebruiken, een open-source rendering-engine voor internet, dezelfde engine die wordt gebruikt in Chrome/Chromium. Voor meer informatie hierover kunt u de officiële Webkit.org-website raadplegen.

Eerst moeten we de GUI maken, de Glade-ontwerper openen en de volgende widgets toevoegen. Voor meer informatie over het maken van widgets volgt u Deel 1 en Deel 2 van deze serie (links hierboven).

  1. Maak een ‘venster1’-widget.
  2. Maak de widget ‘box1’ en ‘box2’ aan.
  3. Maak de widget ‘button1’ en ‘button2’ aan.
  4. Maak ‘entry1’-widget.
  5. Maak een ‘scrolledwindow1’-widget.

Nadat u widgets hebt gemaakt, krijgt u de volgende interface.

Er is niets nieuws, behalve de widget “Gescrolld venster”; Deze widget is belangrijk om ervoor te zorgen dat de WebKit-engine erin kan worden geïmplanteerd. Met behulp van de widget “Scrolled Window” kunt u ook horizontaal en verticaal scrollen terwijl u blader door de websites.

U moet nu de handler “backbutton_clicked ” toevoegen aan het signaal Back knop “clicked ”, “refreshbutton_clicked ” handler naar de knop Vernieuwen “geklikt signaal” en “enterkey_clicked ” handler naar het signaal “geactiveerd ” voor de invoer.

Het volledige .glade-bestand voor de interface vindt u 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>

Kopieer nu de bovenstaande code en plak deze in het bestand “ui.glade” in uw thuismap. Maak nu een nieuw bestand met de naam “mijnwebbrowser.py ” en voer de volgende code daarin in. Alle uitleg staat in de opmerkingen.

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

Sla het bestand op en voer het uit.

chmod 755 mywebbrowser.py
./mywebbrowser.py

En dit is wat je krijgt.

U kunt de officiële documentatie van WebKitGtk raadplegen om meer opties te ontdekken.

Een eenvoudige desktoprecorder maken

In deze sectie leren we hoe we lokale systeemopdrachten of shellscripts vanuit het Python-bestand kunnen uitvoeren met behulp van de 'os'-module, die ons zal helpen een eenvoudige schermrecorder voor de desktop te maken met behulp van de 'avconv'-opdracht.

Open de Glade-ontwerper en maak de volgende widgets:

  1. Maak een ‘venster1’-widget.
  2. Maak een ‘box1’-widget.
  3. Maak ‘button1’, ‘button2’ en ‘button3’ widgets.
  4. Maak ‘entry1’-widget.

Nadat u bovengenoemde widgets heeft gemaakt, krijgt u de onderstaande interface.

Hier is het volledige ui.glade-bestand.

<?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>

Kopieer zoals gewoonlijk de bovenstaande code en plak deze in het bestand “ui.glade ” in uw thuismap, maak een nieuw bestand “myrecorder.py ” en voer het volgende in code erin (elke nieuwe regel wordt uitgelegd in de opmerkingen).

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

Voer nu het bestand uit door de volgende opdrachten in de terminal toe te passen.

chmod 755 myrecorder.py
./myrecorder.py

En je hebt je eerste desktoprecorder.

Meer informatie over de ‘os‘ module vindt u in Python OS Library.

En dat is alles, het maken van applicaties voor de Linux-desktop is niet moeilijk met PyGObject, je hoeft alleen maar de GUI te maken, enkele modules te importeren en het Python-bestand te koppelen aan de GUI, niets meer en niets minder. Er zijn veel nuttige tutorials over dit te doen op de PyGObject-website:

Heb je geprobeerd applicaties te maken met PyGObject? Wat denk je ervan om dit te doen? Welke applicaties heb je eerder ontwikkeld?