Weboldal keresés

Hozzon létre saját webböngészőt és asztali rögzítőt a PyGobject segítségével – 3. rész


Ez a sorozat 3. része a GUI-alkalmazások létrehozásáról Linux asztalon PyGObject használatával. Ma néhány fejlett Python-modul és -könyvtár programjainkban való használatáról fogunk beszélni, mint például a 'os', 'WebKit', 'requests' és egyéb hasznos információk mellett a programozáshoz.

Követelmények

Innen kell végigmennie a sorozat összes korábbi részein, hogy folytassa az előrehaladottabb alkalmazások létrehozásával kapcsolatos további utasításokat:

  1. GUI-alkalmazások létrehozása Linux Desktop alatt PyGObject segítségével – 1. rész
  2. Fejlett PyGobject alkalmazások létrehozása Linuxon – 2. rész

A Python moduljai és könyvtárai nagyon hasznosak, ahelyett, hogy sok alprogramot írna néhány bonyolult feladat elvégzéséhez, amelyek sok időt és munkát igényelnek, egyszerűen importálhatja őket! Igen, csak importálja a szükséges modulokat és könyvtárakat a programba, és sok időt és erőfeszítést takaríthat meg a program befejezéséhez.

Számos híres Python modul létezik, amelyeket a Python Module Index oldalon találhat meg.

A Python programhoz könyvtárakat is importálhat, a „gi.repository import Gtk” sorból ez a sor importálja a GTK könyvtárat a Python programba, sok más könyvtár is létezik, például Gdk, WebKit stb.

Advance GUI alkalmazások létrehozása

Ma 2 programot készítünk:

  1. Egy egyszerű webböngésző; amely a WebKit könyvtárat fogja használni.
  2. Az „avconv” parancsot használó asztali felvevő; amely a Python „os” modulját fogja használni.

Mostantól nem magyarázom el, hogyan kell widgeteket áthúzni a Glade tervezőben, csak megmondom a létrehozandó widgetek nevét, valamint megadom a >.glade fájlt minden programhoz, a Python fájlt pedig biztosan.

Egyszerű webböngésző létrehozása

Webböngésző létrehozásához a „WebKit” motort kell használnunk, amely egy nyílt forráskódú megjelenítő motor az internethez, ugyanaz, mint a Chrome/Chromium. További információért keresse fel a hivatalos Webkit.org webhelyet.

Először létre kell hoznunk a grafikus felhasználói felületet, meg kell nyitnunk a Glade tervezőt, és hozzá kell adnunk a következő widgeteket. A widgetek létrehozásával kapcsolatos további információkért kövesse a sorozat 1. részét és 2. részét (a fenti linkek).

  1. Hozzon létre „window1” widgetet.
  2. Hozzon létre „box1” és „box2” widgetet.
  3. Hozzon létre „button1” és „button2” widgetet.
  4. Hozzon létre „bejegyzés1” widgetet.
  5. Hozzon létre 'scrolledwindow1' widgetet.

A widgetek létrehozása után a következő felületet kapja.

Nincs semmi új, kivéve a „Görgetett ablak” widgetet; ez a widget azért fontos, hogy lehetővé tegye a WebKit motor beültetését, a „Görgetett ablak” widget használatával vízszintesen és függőlegesen is görgethet, miközben böngészni a weboldalakat.

Most hozzá kell adnia a „backbutton_clicked ” kezelőt a Vissza gomb „kattintott ” jeléhez, „refreshbutton_clicked ” kezelő a Frissítés gombra „kattintott jel” és az „enterkey_clicked ” kezelő a bejegyzés „aktivált” jelére.

Az interfész teljes .glade fájlja itt található.

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

Most másolja ki a fenti kódot, és illessze be a saját mappájában található „ui.glade ” fájlba. Most hozzon létre egy új fájlt „mywebbrowser.py” néven, és írja be a következő kódot, a magyarázat a megjegyzésekben található.

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

Mentse el a fájlt, és futtassa.

chmod 755 mywebbrowser.py
./mywebbrowser.py

És ezt fogod kapni.

További lehetőségek megismeréséhez tekintse meg a hivatalos WebKitGtk dokumentációt.

Egyszerű asztali rögzítő létrehozása

Ebben a részben megtudjuk, hogyan futtassunk helyi rendszerparancsokat vagy shell-szkripteket a Python fájlból az 'os' modul használatával, amely segít egy egyszerű képernyőrögzítő létrehozásában az asztalon a 'avconv' parancsot.

Nyissa meg a Glade tervezőt, és hozza létre a következő widgeteket:

  1. Hozzon létre „window1” widgetet.
  2. Hozzon létre „box1” widgetet.
  3. Hozzon létre „button1”, „button2” és „button3” widgeteket.
  4. Hozzon létre „bejegyzés1” widgetet.

A fenti widgetek létrehozása után az alábbi felület jelenik meg.

Íme a teljes ui.glade fájl.

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

A szokásos módon másolja ki a fenti kódot, és illessze be a kezdőkönyvtár „ui.glade ” fájljába, hozzon létre egy új „myrecorder.py ” fájlt, és írja be a következőt kód benne (Minden új sor magyarázata a megjegyzésekben található).

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

Most futtassa a fájlt a következő parancsok alkalmazásával a terminálban.

chmod 755 myrecorder.py
./myrecorder.py

És megvan az első asztali felvevője.

Az „os” modulról a Python OS Library oldalán talál további információt.

És ez az, nem nehéz a Linux asztali alkalmazásokat létrehozni a PyGObject segítségével, csak létre kell hoznia a grafikus felhasználói felületet, importálnia kell néhány modult, és össze kell kapcsolnia a Python fájlt a grafikus felhasználói felülettel, semmi több, nem kevesebb. A PyGObject webhelyen számos hasznos oktatóanyag található erről:

Próbáltál már alkalmazásokat létrehozni PyGObject segítségével? Mit gondolsz erről? Milyen alkalmazásokat fejlesztettél korábban?