Opret din egen applikation til webbrowser og desktopoptager ved hjælp af PyGobject - del 3


Dette er den 3. del af serien om oprettelse af GUI-applikationer under Linux-skrivebordet ved hjælp af PyGObject. I dag taler vi om at bruge nogle avancerede Python-moduler og biblioteker i vores programmer som ' os ', ' WebKit ', ' anmodninger ' og andre ud over nogle andre nyttige oplysninger til programmering.

Du skal gennemgå alle disse tidligere dele af serien herfra for at fortsætte yderligere instruktioner om oprettelse af flere forhåndsapplikationer:

  1. Opret GUI-applikationer under Linux Desktop ved hjælp af PyGObject - del 1
  2. Oprettelse af avancerede PyGobject-applikationer på Linux - del 2

Moduler og biblioteker i Python er meget nyttige, i stedet for at skrive mange underprogrammer for at udføre nogle komplicerede job, som vil tage meget tid og arbejde, kan du bare importere dem! Ja, bare importer de moduler og biblioteker, du har brug for, til dit program, så kan du spare meget tid og kræfter på at gennemføre dit program.

Der er mange berømte moduler til Python, som du kan finde på Python Module Index.

Du kan også importere biblioteker til dit Python-program, fra “ gi.repository import Gtk ”, denne linje importerer GTK-biblioteket til Python-programmet, der er mange andre biblioteker som Gdk, WebKit .. osv.

Oprettelse af avancerede GUI-applikationer

I dag opretter vi to programmer:

  1. En simpel webbrowser; som bruger WebKit-biblioteket.
  2. En desktopoptager, der bruger kommandoen ‘avconv’; som bruger 'os'-modulet fra Python.

Jeg forklarer ikke, hvordan man trækker og slipper widgets i Glade -designeren fra nu af, jeg vil bare fortælle dig navnet på de widgets, du skal oprette, desuden giver jeg dig .glade fil for hvert program, og Python-filen helt sikkert.

For at oprette en webbrowser bliver vi nødt til at bruge motoren “ WebKit ”, som er en open source-gengivelsesmotor til internettet, det er den samme som bruges i Chrome / Chromium . For mere information om det kan du henvise til det officielle Webkit.org-websted.

Først bliver vi nødt til at oprette GUI'en, åbne designeren Glade og tilføje følgende widgets. For mere information om, hvordan du opretter widgets, skal du følge del 1 og del 2 i denne serie (links ovenfor).

  1. Opret 'vindue1'-widget.
  2. Opret widget 'box1' og 'box2'.
  3. Opret widget 'button1' og 'button2'.
  4. Opret widget 'entry1'.
  5. Opret widget 'scrolledwindow1'.

Efter oprettelse af widgets får du følgende grænseflade.

Der er ikke noget nyt undtagen widget " Rullet vindue "; denne widget er vigtig for at tillade, at WebKit -motoren implanteres inde i den. Ved hjælp af widget " Rullet vindue " kan du også rulle vandret og lodret, mens du gennemse webstederne.

Du bliver nu nødt til at tilføje " backbutton_clicked " -handler til Back -knappen " klikket " signal, " refreshbutton_clicked " handler til knappen Opdater " klikket signal " og " enterkey_clicked " handler til " aktiveret " signalet for posten.

Den komplette .glade fil til grænsefladen 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 nu ovenstående kode og indsæt den i filen " ui.glade " i din hjemmemappe. Opret nu en ny fil kaldet “ mywebbrowser.py ” og indtast følgende kode inde i den, al forklaringen er i kommentarerne.

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

Gem filen, og kør den.

$ chmod 755 mywebbrowser.py
$ ./mywebbrowser.py

Og det er hvad du får.

Du kan se den officielle WebKitGtk dokumentation for at finde flere muligheder.

I dette afsnit lærer vi, hvordan du kører lokale systemkommandoer eller shell-scripts fra Python-filen ved hjælp af modulet ' os ', som hjælper os med at oprette en simpel skærmoptager til skrivebordet ved hjælp af kommandoen ' avconv '.

Åbn Glade-designeren, og opret følgende widgets:

  1. Opret 'vindue1'-widget.
  2. Opret 'box1' -widget.
  3. Opret widgets 'button1', 'button2' og 'button3'.
  4. Opret widget 'entry1'.

Når du har oprettet ovennævnte widgets, kommer du under grænsefladen.

Her er den komplette ui.glade fil.

<?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 normalt kopierer du ovenstående kode og indsætter den i filen " ui.glade " i din hjemmemappe, opret en ny " myrecorder.py " -fil og indtast følgende kode inde i den (Hver ny linje er forklaret i kommentarerne).

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

Kør nu filen ved at anvende følgende kommandoer i terminalen.

$ chmod 755 myrecorder.py
$ ./myrecorder.py

Og du har din første desktopoptager.

Du kan finde flere oplysninger om modulet ' os ' på Python OS Library.

Og det er det, det er ikke svært at oprette applikationer til Linux-skrivebordet ved hjælp af PyGObject , du skal bare oprette GUI, importere nogle moduler og linke Python-filen med GUI, intet mere, intet mindre. Der er mange nyttige vejledninger om at gøre dette på PyGObject-webstedet:

Har du prøvet at oprette applikationer ved hjælp af PyGObject? Hvad synes du om at gøre det? Hvilke applikationer har du udviklet før?