Ustvarite lasten program za spletni brskalnik in namizni snemalnik s pomočjo PyGobject - 3. del


To je 3. del serije o ustvarjanju aplikacij GUI pod namizjem Linux s pomočjo PyGObject. Danes se bomo pogovarjali o uporabi nekaterih naprednih modulov in knjižnic Python v naših programih, kot so ' os ', ' WebKit ', ' prošnje ' in drugi poleg nekaterih drugih koristnih informacij za programiranje.

Za nadaljevanje nadaljnjih navodil o ustvarjanju dodatnih aplikacij morate prebrati vse te prejšnje dele serije od tu:

  1. Ustvarite aplikacije GUI v namizju Linux z uporabo PyGObject - 1. del
  2. Ustvarjanje naprednih aplikacij PyGobject v Linuxu - 2. del

Moduli in knjižnice v Pythonu so zelo koristni, namesto da bi napisali številne podprograme za zapletena dela, ki bodo vzela veliko časa in dela, jih lahko samo uvozite! Da, samo uvozite module in knjižnice, ki jih potrebujete, v svoj program in prihranili boste veliko časa in truda za dokončanje programa.

Obstaja veliko znanih modulov za Python, ki jih najdete na seznamu modulov Python.

Knjižnice lahko uvozite tudi za svoj program Python, od » gi.repository import Gtk « ta vrstica uvozi knjižnico GTK v program Python, obstaja veliko drugih knjižnic, kot so Gdk, WebKit .. itd.

Ustvarjanje vnaprejšnjih GUI aplikacij

Danes bomo ustvarili 2 programa:

  1. Preprost spletni brskalnik; ki bo uporabljal knjižnico WebKit.
  2. namizni snemalnik z ukazom „avconv“; ki bo uporabil modul ‘os’ iz Pythona.

Od zdaj naprej ne bom razlagal, kako povleci in spusti pripomočke v oblikovalniku Glade , povedal vam bom samo ime pripomočkov, ki jih morate ustvariti, poleg tega pa vam dam .glade za vsak program in datoteko Python zagotovo.

Če želite ustvariti spletni brskalnik, bomo morali uporabiti mehanizem\" WebKit ", ki je odprtokodni mehanizem upodabljanja za splet, isti je kot v Chrome / Chromium , če želite več informacij o njem, se obrnite na uradno spletno mesto Webkit.org.

Najprej bomo morali ustvariti GUI, odpreti oblikovalec Glade in dodati naslednje pripomočke. Za več informacij o ustvarjanju pripomočkov sledite 1. delu in 2. delu te serije (zgoraj navedene povezave).

  1. Ustvarite pripomoček ‘window1’.
  2. Ustvarite pripomočka ‘box1’ in ‘box2’.
  3. Ustvari pripomočka »button1« in »button2«.
  4. Ustvarite gradnik ‘entry1’.
  5. Ustvarite pripomoček »scrollwindow1«.

Po ustvarjanju pripomočkov boste dobili naslednji vmesnik.

Nič novega ni, razen pripomočka\" Pomikano okno "; ta pripomoček je pomemben za omogočanje vgradnje mehanizma WebKit v njega s pomočjo\" Pripomoček Scroll Window «, med brskanjem po spletnih mestih se boste lahko premikali tudi vodoravno in navpično.

Zdaj boste morali dodati vodnik\" backbutton_clicked " v signal gumb Nazaj\" kliknili ",\" refreshbutton_clicked »vodnik do gumba za osvežitev \" kliknjen signal "in \" enterkey_clicked "vodnik do signala \" aktiviran "za vnos .

Celotna datoteka .glade za vmesnik je tukaj.

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

Zdaj kopirajte zgornjo kodo in jo prilepite v datoteko\" ui.glade " v domači mapi. Zdaj ustvarite novo datoteko z imenom\" mywebbrowser.py " in vnesite naslednja koda v njej, vsa razlaga je v komentarjih.

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

Shranite datoteko in jo zaženite.

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

In to boste dobili.

Če želite odkriti več možnosti, se lahko obrnete na uradno dokumentacijo WebKitGtk .

V tem razdelku bomo izvedeli, kako zagnati lokalne sistemske ukaze ali skripte lupine iz datoteke Python z uporabo modula ' os ', kar nam bo pomagalo ustvariti preprost snemalnik zaslona za namizje z uporabo ukaz ' avconv '.

Odprite Glade designer in ustvarite naslednje pripomočke:

  1. Ustvarite pripomoček ‘window1’.
  2. Ustvarite pripomoček ‘box1’.
  3. Ustvarite pripomočke ‘button1’, ‘button2’ in ‘button3’.
  4. Ustvarite gradnik ‘entry1’.

Po ustvarjanju zgoraj omenjenih gradnikov boste dobili spodnji vmesnik.

Tu je celotna datoteka 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>

Kot običajno kopirajte zgornjo kodo in jo prilepite v datoteko\" ui.glade " v domačem imeniku, ustvarite novo datoteko\" myrecorder.py " in vnesite naslednja koda v njej (Vsaka nova vrstica je pojasnjena v komentarjih).

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

Zdaj zaženite datoteko tako, da v terminalu uporabite naslednje ukaze.

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

In dobili ste svoj prvi namizni snemalnik.

Več informacij o modulu os najdete v knjižnici OS Python.

In to je to, ustvarjanje aplikacij za namizje Linuxa z PyGObject ni težko, samo ustvariti morate GUI, uvoziti nekaj modulov in povezati datoteko Python z GUI, nič več, nič manj. Na spletnem mestu PyGObject obstaja veliko uporabnih vadnic o tem:

Ste že poskusili ustvarjati aplikacije z uporabo PyGObject? Kaj mislite o tem? Katere aplikacije ste že razvili?