Kreirajte svoj vlastiti 'Web pretraživač' i 'Desktop Recorder' aplikacije koristeći PyGobject - 3. dio


Ovo je 3. dio serije o kreiranju GUI aplikacija pod Linux desktopom koristeći PyGObject. Danas ćemo govoriti o korištenju nekih naprednih Python modula i biblioteka u našim programima kao što su 'os', 'WebKit', 'zahtjevi' i druge, pored nekih drugih korisnih informacija za programiranje.

Zahtjevi

Odavde morate proći kroz sve ove prethodne dijelove serije da biste nastavili dalje upute o kreiranju naprednijih aplikacija:

  1. Kreirajte GUI aplikacije pod Linux radnom površinom koristeći PyGObject – 1. dio
  2. Kreiranje naprednih PyGobject aplikacija na Linuxu – 2. dio

Moduli i biblioteke u Pythonu su vrlo korisni, umjesto da pišete mnogo potprograma za obavljanje nekih komplikovanih poslova koji će oduzeti mnogo vremena i posla, možete ih jednostavno uvesti! Da, samo uvezite module i biblioteke koje su vam potrebne u svoj program i moći ćete uštedjeti mnogo vremena i truda da dovršite svoj program.

Postoji mnogo poznatih modula za Python, koje možete pronaći na Python Module Index.

Možete uvesti i biblioteke za svoj Python program, iz “gi.repository import Gtk” ova linija uvozi GTK biblioteku u Python program, postoje mnoge druge biblioteke poput Gdk, WebKit... itd.

Kreiranje naprednih GUI aplikacija

Danas ćemo kreirati 2 programa:

  1. Jednostavan web pretraživač; koji će koristiti WebKit biblioteku.
  2. Stoni snimač koji koristi naredbu 'avconv'; koji će koristiti 'os' modul iz Pythona.

Od sada neću objašnjavati kako prevući i ispustiti widgete u dizajneru Glade, samo ću vam reći naziv widgeta koje trebate kreirati, dodatno ću vam dati .glade fajl za svaki program, a Python fajl svakako.

Kreiranje jednostavnog web pretraživača

Da bismo kreirali web preglednik, morat ćemo koristiti “WebKit” motor, koji je open-source mehanizam za renderiranje za web, isti je onaj koji se koristi u Chrome/Chromium, za više informacija o tome možete pogledati službenu web stranicu Webkit.org.

Prvo ćemo morati kreirati GUI, otvoriti Glade dizajner i dodati sljedeće widgete. Za više informacija o tome kako kreirati widgete, pratite 1. dio i 2. dio ove serije (veze navedene iznad).

  1. Kreirajte widget 'window1'.
  2. Kreirajte 'box1' i 'box2' widget.
  3. Kreirajte 'button1' i 'button2' widget.
  4. Kreirajte widget ‘entry1’.
  5. Kreirajte widget ‘scrolledwindow1’.

Nakon kreiranja widgeta, dobit ćete sljedeće sučelje.

Nema ništa novo, osim widgeta “Scrolled Window”; ovaj widget je važan kako bi omogućio da se WebKit motor implantira unutar njega, koristeći vidžet “Scrolled Window ” također ćete moći horizontalno i vertikalno pomicati dok ste pretražujte web stranice.

Sada ćete morati dodati “backbutton_clicked ” rukovalac na Nazad tipku “kliknuto ” signalu, “refreshbutton_clicked ” rukovalac na dugme Osvježi “kliknuti signal” i “enterkey_clicked ” rukovalac na “aktiviran” signal za unos.

Kompletna datoteka .glade za interfejs je ovdje.

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

Sada kopirajte gornji kod i zalijepite ga u datoteku “ui.glade” u vašem početnom folderu. Sada kreirajte novu datoteku pod nazivom “mywebbrowser.py” i unesite sljedeći kod unutar nje, svo objašnjenje je u komentarima.

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

Sačuvajte datoteku i pokrenite je.

chmod 755 mywebbrowser.py
./mywebbrowser.py

I ovo je ono što ćete dobiti.

Možete pogledati zvaničnu dokumentaciju WebKitGtk kako biste otkrili više opcija.

Kreiranje jednostavnog Desktop snimača

U ovom odeljku ćemo naučiti kako da pokrenemo lokalne sistemske komande ili shell skripte iz Python fajla koristeći 'os' modul, koji će nam pomoći da kreiramo jednostavan snimač ekrana za desktop koristeći 'avconv' komanda.

Otvorite Glade dizajner i kreirajte sljedeće widgete:

  1. Kreirajte widget 'window1'.
  2. Kreirajte widget ‘box1’.
  3. Kreirajte 'button1', 'button2' i 'button3' widgete.
  4. Kreirajte widget ‘entry1’.

Nakon kreiranja gore navedenih widgeta, dobićete interfejs ispod.

Evo kompletnog fajla ui.glade.

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

Kao i obično, kopirajte gornji kod i zalijepite ga u datoteku “ui.glade” u svom kućnom direktoriju, kreirajte novu datoteku “myrecorder.py” i unesite sljedeće kod unutar njega (Svaka nova linija je objašnjena u komentarima).

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

Sada pokrenite datoteku primjenom sljedećih naredbi u terminalu.

chmod 755 myrecorder.py
./myrecorder.py

I dobili ste svoj prvi desktop diktafon.

Više informacija o modulu „os“ možete pronaći u Python OS biblioteci.

I to je to, kreiranje aplikacija za Linux desktop nije teško pomoću PyGObjecta, samo morate kreirati GUI, uvesti neke module i povezati Python fajl sa GUI, ništa više, ništa manje. Postoji mnogo korisnih tutorijala o tome na web stranici PyGObject:

Jeste li pokušali kreirati aplikacije koristeći PyGObject? Šta mislite o tome? Koje ste aplikacije ranije razvijali?