Δημιουργήστε το δικό σας πρόγραμμα περιήγησης στο Web και εφαρμογές εγγραφής επιφάνειας εργασίας χρησιμοποιώντας το PyGobject - Μέρος 3


Αυτό είναι το 3ο μέρος της σειράς για τη δημιουργία εφαρμογών GUI κάτω από την επιφάνεια εργασίας Linux χρησιμοποιώντας το PyGObject. Σήμερα θα μιλήσουμε για τη χρήση ορισμένων προηγμένων λειτουργικών μονάδων και βιβλιοθηκών Python στα προγράμματά μας όπως 'os', 'WebKit', 'αιτήματα' και άλλα, εκτός από κάποιες άλλες χρήσιμες πληροφορίες για προγραμματισμό.

Απαιτήσεις

Πρέπει να διαβάσετε όλα αυτά τα προηγούμενα μέρη της σειράς από εδώ, για να συνεχίσετε περαιτέρω οδηγίες σχετικά με τη δημιουργία πιο προηγμένων εφαρμογών:

  1. Δημιουργία εφαρμογών GUI κάτω από την επιφάνεια εργασίας Linux χρησιμοποιώντας το PyGObject – Μέρος 1
  2. Δημιουργία προηγμένων εφαρμογών PyGobject στο Linux – Μέρος 2

Οι ενότητες και οι βιβλιοθήκες στην Python είναι πολύ χρήσιμες, αντί να γράφετε πολλά υποπρογράμματα για να κάνετε κάποιες περίπλοκες εργασίες που θα χρειαστούν πολύ χρόνο και δουλειά, μπορείτε απλώς να τα εισαγάγετε! Ναι, απλώς εισάγετε τις ενότητες και τις βιβλιοθήκες που χρειάζεστε στο πρόγραμμά σας και θα μπορείτε να εξοικονομήσετε πολύ χρόνο και προσπάθεια για να ολοκληρώσετε το πρόγραμμά σας.

Υπάρχουν πολλά διάσημα modules για την Python, τα οποία μπορείτε να βρείτε στο Python Module Index.

Μπορείτε να εισάγετε βιβλιοθήκες και για το πρόγραμμα Python σας, από το gi.repository import Gtk αυτή η γραμμή εισάγει τη βιβλιοθήκη GTK στο πρόγραμμα Python, υπάρχουν πολλές άλλες βιβλιοθήκες όπως Gdk, WebKit.. κ.λπ.

Δημιουργία προηγμένων εφαρμογών GUI

Σήμερα, θα δημιουργήσουμε 2 προγράμματα:

  1. Ένα απλό πρόγραμμα περιήγησης ιστού. που θα χρησιμοποιήσει τη βιβλιοθήκη WebKit.
  2. Μια συσκευή εγγραφής επιφάνειας εργασίας που χρησιμοποιεί την εντολή avconv. το οποίο θα χρησιμοποιεί τη λειτουργική μονάδα ‘os’ από την Python.

Δεν θα εξηγήσω πώς να κάνετε μεταφορά και απόθεση γραφικών στοιχείων στον σχεδιαστή Glade από εδώ και πέρα, θα σας πω απλώς το όνομα των γραφικών στοιχείων που πρέπει να δημιουργήσετε, επιπλέον θα σας δώσω το .glade για κάθε πρόγραμμα και το αρχείο Python σίγουρα.

Δημιουργία απλού προγράμματος περιήγησης στο Web

Για να δημιουργήσουμε ένα πρόγραμμα περιήγησης ιστού, θα πρέπει να χρησιμοποιήσουμε τη μηχανή \WebKit, η οποία είναι μια μηχανή απόδοσης ανοιχτού κώδικα για τον Ιστό, είναι η ίδια που χρησιμοποιείται στο Chrome/Chromium, για περισσότερες πληροφορίες σχετικά με αυτό, μπορείτε να ανατρέξετε στον επίσημο ιστότοπο Webkit.org.

Αρχικά, θα πρέπει να δημιουργήσουμε το GUI, να ανοίξουμε τον σχεδιαστή Glade και να προσθέσουμε τα ακόλουθα γραφικά στοιχεία. Για περισσότερες πληροφορίες σχετικά με τον τρόπο δημιουργίας γραφικών στοιχείων, ακολουθήστε το Μέρος 1 και το Μέρος 2 αυτής της σειράς (οι σύνδεσμοι δίνονται παραπάνω).

  1. Δημιουργήστε γραφικό στοιχείο window1.
  2. Δημιουργήστε γραφικό στοιχείο box1 και box2.
  3. Δημιουργήστε γραφικό στοιχείο button1 και button2.
  4. Δημιουργήστε γραφικό στοιχείο entry1.
  5. Δημιουργήστε γραφικό στοιχείο scrolledwindow1.

Αφού δημιουργήσετε γραφικά στοιχεία, θα λάβετε την ακόλουθη διεπαφή.

Δεν υπάρχει τίποτα νέο, εκτός από το γραφικό στοιχείο \Scrolled Window. Αυτό το γραφικό στοιχείο είναι σημαντικό προκειμένου να επιτρέπεται η εμφύτευση του κινητήρα WebKit μέσα σε αυτόν, χρησιμοποιώντας το \Scrolled Window” θα μπορείτε επίσης να κάνετε κύλιση οριζόντια και κάθετα ενώ περιηγείστε στους ιστότοπους.

Θα πρέπει τώρα να προσθέσετε το πρόγραμμα χειρισμού \backbutton_clicked στο σήμα Πίσω κουμπί \clicked, \refreshbutton_clicked” χειριστής στο κουμπί Ανανέωσης \clicked signal” and \enterkey_clicked” handler to the \activated” signal for the entry .

Το πλήρες αρχείο .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 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>

Τώρα αντιγράψτε τον παραπάνω κώδικα και επικολλήστε τον στο αρχείο \ui.glade” στον αρχικό σας φάκελο. Τώρα δημιουργήστε ένα νέο αρχείο με το όνομα \mywebbrowser.py και πληκτρολογήστε ο παρακάτω κώδικας μέσα του, όλη η εξήγηση είναι στα σχόλια.

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

Αποθηκεύστε το αρχείο και εκτελέστε το.

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

Και αυτό θα πάρετε.

Μπορείτε να ανατρέξετε στην επίσημη τεκμηρίωση WebKitGtk για να ανακαλύψετε περισσότερες επιλογές.

Δημιουργία απλής συσκευής εγγραφής επιφάνειας εργασίας

Σε αυτήν την ενότητα, θα μάθουμε πώς να εκτελούμε τοπικές εντολές συστήματος ή σενάρια φλοιού από το αρχείο Python χρησιμοποιώντας τη λειτουργική μονάδα 'os', η οποία θα μας βοηθήσει να δημιουργήσουμε μια απλή συσκευή εγγραφής οθόνης για την επιφάνεια εργασίας χρησιμοποιώντας το Εντολή avconv.

Ανοίξτε τον σχεδιαστή Glade και δημιουργήστε τα ακόλουθα γραφικά στοιχεία:

  1. Δημιουργήστε γραφικό στοιχείο window1.
  2. Δημιουργήστε γραφικό στοιχείο box1.
  3. Δημιουργήστε γραφικά στοιχεία button1, button2 και button3.
  4. Δημιουργήστε γραφικό στοιχείο entry1.

Αφού δημιουργήσετε τα παραπάνω γραφικά στοιχεία, θα έχετε την παρακάτω διεπαφή.

Ακολουθεί το πλήρες αρχείο 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>

Ως συνήθως, αντιγράψτε τον παραπάνω κώδικα και επικολλήστε τον στο αρχείο \ui.glade” στον αρχικό σας κατάλογο, δημιουργήστε ένα νέο αρχείο \myrecorder.py” και πληκτρολογήστε τον παρακάτω κώδικα μέσα σε αυτό (Κάθε νέα γραμμή εξηγείται στα σχόλια).

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

Τώρα εκτελέστε το αρχείο εφαρμόζοντας τις ακόλουθες εντολές στο τερματικό.

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

Και πήρατε την πρώτη σας συσκευή εγγραφής επιτραπέζιου υπολογιστή.

Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με τη λειτουργική μονάδα ‘os’ στη βιβλιοθήκη Python OS.

Και αυτό είναι όλο, η δημιουργία εφαρμογών για την επιφάνεια εργασίας του Linux δεν είναι δύσκολη με τη χρήση του PyGObject, πρέπει απλώς να δημιουργήσετε το γραφικό περιβάλλον, να εισαγάγετε ορισμένες μονάδες και να συνδέσετε το αρχείο Python με το GUI, τίποτα περισσότερο, τίποτα λιγότερο. Υπάρχουν πολλά χρήσιμα μαθήματα για να το κάνετε αυτό στον ιστότοπο του PyGObject:

Έχετε δοκιμάσει να δημιουργήσετε εφαρμογές χρησιμοποιώντας το PyGObject; Τι πιστεύετε για να το κάνετε αυτό; Ποιες εφαρμογές έχετε αναπτύξει στο παρελθόν;