Lag din egen "Nettleser" og "Desktop Recorder"-applikasjoner ved å bruke PyGobject - Del 3


Dette er den tredje delen av serien om å lage GUI-applikasjoner under Linux-skrivebordet ved å bruke PyGObject. I dag skal vi snakke om bruk av noen avanserte Python-moduler og -biblioteker i programmene våre som "os", "WebKit", "requests" og andre, i tillegg til annen nyttig informasjon for programmering.

Krav

Du må gå gjennom alle disse tidligere delene av serien herfra, for å fortsette videre instruksjoner om å lage mer avanserte applikasjoner:

  1. Lag GUI-applikasjoner under Linux Desktop ved å bruke PyGObject – Del 1
  2. Opprette Advance PyGobject-applikasjoner på Linux – Del 2

Moduler og biblioteker i Python er veldig nyttige, i stedet for å skrive mange underprogrammer for å gjøre noen kompliserte jobber som vil ta mye tid og arbeid, kan du bare importere dem! Ja, bare importer modulene og bibliotekene du trenger til programmet ditt, og du vil kunne spare mye tid og krefter på å fullføre programmet.

Det er mange kjente moduler for Python, som du kan finne på Python Module Index.

Du kan også importere biblioteker for Python-programmet ditt, fra «gi.repository import Gtk» importerer denne linjen GTK-biblioteket til Python-programmet, det er mange andre biblioteker som Gdk, WebKit.. etc.

Opprette Advance GUI-applikasjoner

I dag lager vi 2 programmer:

  1. En enkel nettleser; som vil bruke WebKit-biblioteket.
  2. En skrivebordsopptaker som bruker 'avconv'-kommandoen; som vil bruke 'os'-modulen fra Python.

Jeg vil ikke forklare hvordan du drar og slipper widgets i Glade-designeren fra nå av, jeg vil bare fortelle deg navnet på widgetene du må lage, i tillegg vil jeg gi deg .glade-filen for hvert program, og Python-filen helt sikkert.

Opprette en enkel nettleser

For å lage en nettleser, må vi bruke «WebKit»-motoren, som er en åpen kildekode-gjengivelsesmotor for nettet, det er den samme som brukes i Chrome/Chromium, for mer informasjon om det kan du se det offisielle Webkit.org-nettstedet.

Først må vi lage GUI, åpne Glade-designeren og legge til følgende widgets. For mer informasjon om hvordan du lager widgets, følg Del 1 og Del 2 av denne serien (lenker gitt ovenfor).

  1. Lag 'vindu1'-widget.
  2. Opprett "boks1" og "boks2" widget.
  3. Opprett "knapp1" og "knapp2" widget.
  4. Opprett «entry1»-widget.
  5. Opprett "scrolledwindow1"-widget.

Etter å ha opprettet widgets, vil du få følgende grensesnitt.

Det er ingenting nytt, bortsett fra «Rullet vindu»-widgeten; denne widgeten er viktig for å tillate WebKit-motoren å bli implantert inne i den, ved å bruke "Scrolled Window "-widgeten vil du også kunne rulle horisontalt og vertikalt mens du bla gjennom nettsidene.

Du må nå legge til "backbutton_clicked "-behandler til Tilbake-knappen "clicked "-signalet, "refreshbutton_clicked " handler til Oppdater-knappen «klikket signal» og «enterkey_clicked » handler til «aktivert»-signalet for oppføringen.

Den komplette .glade-filen for grensesnittet er her.

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

Kopier nå koden ovenfor og lim den inn i «ui.glade»-filen i hjemmemappen din. Opprett nå en ny fil kalt "mywebbrowser.py " og skriv inn følgende kode i den, all forklaring er i kommentarene.

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

Lagre filen og kjør den.

chmod 755 mywebbrowser.py
./mywebbrowser.py

Og dette er hva du vil få.

Du kan se den offisielle WebKitGtk-dokumentasjonen for å finne flere alternativer.

Opprette en enkel skrivebordsopptaker

I denne delen lærer vi hvordan du kjører lokale systemkommandoer eller shell-skript fra Python-filen ved å bruke 'os'-modulen, som vil hjelpe oss å lage en enkel skjermopptaker for skrivebordet ved å bruke 'avconv' kommando.

Åpne Glade-designeren, og lag følgende widgets:

  1. Lag 'vindu1'-widget.
  2. Opprett "boks1"-widget.
  3. Lag "knapp1", "knapp2" og "knapp3" widgeter.
  4. Opprett «entry1»-widget.

Etter å ha opprettet ovenfor nevnte widgets, vil du komme under grensesnittet.

Her er den komplette ui.glade-filen.

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

Som vanlig kopierer du koden ovenfor og limer den inn i filen «ui.glade» i hjemmekatalogen din, oppretter en ny «myrecorder.py»-fil og skriver inn følgende kode inne i den (Hver nye linje er forklart i kommentarfeltet).

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

Kjør nå filen ved å bruke følgende kommandoer i terminalen.

chmod 755 myrecorder.py
./myrecorder.py

Og du fikk din første skrivebordsopptaker.

Du kan finne mer informasjon om 'os'-modulen på Python OS Library.

Og det er det, å lage applikasjoner for Linux-skrivebordet er ikke vanskelig å bruke PyGObject, du må bare lage GUI, importere noen moduler og koble Python-filen med GUI, hverken mer eller mindre. Det er mange nyttige veiledninger om å gjøre dette på PyGObject-nettstedet:

Har du prøvd å lage applikasjoner med PyGObject? Hva tenker du om å gjøre det? Hvilke applikasjoner har du utviklet før?