Vyhledávání na webu

Vytvořte si vlastní aplikace „Webový prohlížeč“ a „Desktop Recorder“ pomocí PyGobject – Část 3


Toto je 3. díl série o vytváření GUI aplikací pod Linuxem pomocí PyGObject. Dnes si povíme o používání některých pokročilých modulů a knihoven Pythonu v našich programech, jako jsou 'os', 'WebKit', 'requests' a ostatní, kromě některých dalších užitečných informací pro programování.

Požadavky

Zde musíte projít všechny tyto předchozí díly série, abyste mohli pokračovat v dalších pokynech k vytváření pokročilejších aplikací:

  1. Vytváření aplikací GUI pod Linuxem pomocí PyGObject – část 1
  2. Vytváření aplikací Advance PyGobject v systému Linux – část 2

Moduly a knihovny v Pythonu jsou velmi užitečné, místo psaní mnoha podprogramů pro provádění složitých úloh, které zaberou spoustu času a práce, je můžete jednoduše importovat! Ano, stačí importovat moduly a knihovny, které potřebujete, do svého programu a budete moci ušetřit spoustu času a úsilí k dokončení vašeho programu.

Existuje mnoho slavných modulů pro Python, které můžete najít v Python Module Index.

Můžete také importovat knihovny pro váš program Python, z „gi.repository import Gtk“ tento řádek importuje knihovnu GTK do programu Python, existuje mnoho dalších knihoven jako Gdk, WebKit.. atd.

Vytváření Advance GUI aplikací

Dnes vytvoříme 2 programy:

  1. Jednoduchý webový prohlížeč; který bude používat knihovnu WebKit.
  2. Stolní rekordér používající příkaz „avconv“; který bude používat modul ‚os‘ z Pythonu.

Od této chvíle nebudu vysvětlovat, jak přetahovat widgety v návrháři Glade, řeknu vám pouze názvy widgetů, které potřebujete vytvořit, navíc vám dám .glade pro každý program a soubor Python určitě.

Vytvoření jednoduchého webového prohlížeče

Abychom mohli vytvořit webový prohlížeč, budeme muset použít engine „WebKit“, což je open-source vykreslovací engine pro web, je to stejný, jaký se používá v Chrome/Chromium, další informace o něm najdete na oficiálních stránkách Webkit.org.

Nejprve budeme muset vytvořit GUI, otevřít návrhář Glade a přidat následující widgety. Další informace o vytváření widgetů naleznete v části 1 a části 2 této série (odkazy uvedené výše).

  1. Vytvořte widget „window1“.
  2. Vytvořte widget „box1“ a „box2“.
  3. Vytvořte widget „button1“ a „button2“.
  4. Vytvořte widget „entry1“.
  5. Vytvořte widget „scrolledwindow1“.

Po vytvoření widgetů získáte následující rozhraní.

Není tu nic nového, kromě widgetu „Posouvané okno“; tento widget je důležitý k tomu, aby do něj mohl být implantován engine WebKit. Pomocí widgetu „Posouvané okno“ budete také moci posouvat vodorovně a svisle procházet webové stránky.

Nyní budete muset přidat obslužný program „backbutton_clicked “ k signálu „clicked“ tlačítka Zpět, „refreshbutton_clicked “ handler na tlačítko Obnovit „kliknutý signál“ a handler „enterkey_clicked“ na signál „aktivováno“ pro daný záznam.

Kompletní soubor .glade pro rozhraní je zde.

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

Nyní zkopírujte výše uvedený kód a vložte jej do souboru „ui.glade“ ve vaší domovské složce. Nyní vytvořte nový soubor s názvem „mywebbrowser.py “ a zadejte do něj následující kód, veškeré vysvětlení je v komentářích.

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

Uložte soubor a spusťte jej.

chmod 755 mywebbrowser.py
./mywebbrowser.py

A to je to, co získáte.

Další možnosti naleznete v oficiální dokumentaci WebKitGtk.

Vytvoření jednoduchého stolního rekordéru

V této části se naučíme, jak spouštět místní systémové příkazy nebo skripty shellu ze souboru Python pomocí modulu 'os', což nám pomůže vytvořit jednoduchý záznam obrazovky pro plochu pomocí příkaz 'avconv'.

Otevřete návrhář Glade a vytvořte následující widgety:

  1. Vytvořte widget „window1“.
  2. Vytvořte widget „box1“.
  3. Vytvořte widgety „button1“, „button2“ a „button3“.
  4. Vytvořte widget „entry1“.

Po vytvoření výše uvedených widgetů se dostanete pod rozhraní.

Zde je úplný soubor 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>

Jako obvykle zkopírujte výše uvedený kód a vložte jej do souboru „ui.glade“ ve svém domovském adresáři, vytvořte nový soubor „myrecorder.py“ a zadejte následující kód v něm (Každý nový řádek je vysvětlen v komentářích).

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

Nyní spusťte soubor použitím následujících příkazů v terminálu.

chmod 755 myrecorder.py
./myrecorder.py

A máte svůj první stolní rekordér.

Další informace o modulu ‚os‘ najdete v knihovně OS Python.

A je to, vytváření aplikací pro linuxový desktop není těžké pomocí PyGObject, stačí vytvořit GUI, importovat nějaké moduly a propojit Python soubor s GUI, nic víc, nic míň. Na webu PyGObject je mnoho užitečných návodů, jak to udělat:

Zkoušeli jste vytvářet aplikace pomocí PyGObject? Co si o tom myslíte? Jaké aplikace jste již vyvinuli?