Cree sus propias aplicaciones de 'navegador web' y 'grabadora de escritorio' con PyGobject - Parte 3


Esta es la tercera parte de la serie sobre la creación de aplicaciones GUI en el escritorio de Linux usando PyGObject. Hoy hablaremos sobre el uso de bibliotecas y módulos avanzados de Python en nuestros programas como ' os ', ' WebKit ', ' solicitudes ' y otros, además de alguna otra información útil para la programación.

Debe revisar todas estas partes anteriores de la serie desde aquí, para continuar con más instrucciones sobre cómo crear aplicaciones más avanzadas:

  1. Create GUI Applications Under Linux Desktop Using PyGObject – Part 1
  2. Creating Advance PyGobject Applications on Linux – Part 2

Los módulos y bibliotecas en Python son muy útiles, en lugar de escribir muchos subprogramas para hacer algunos trabajos complicados que llevarán mucho tiempo y trabajo, ¡puede importarlos! Sí, solo importe los módulos y bibliotecas que necesita a su programa y podrá ahorrar mucho tiempo y esfuerzo para completar su programa.

Hay muchos módulos famosos para Python, que puede encontrar en Python Module Index.

También puede importar bibliotecas para su programa Python, desde “ gi.repository import Gtk ” esta línea importa la biblioteca GTK al programa Python, hay muchas otras bibliotecas como Gdk, WebKit, etc.

Creación de aplicaciones GUI avanzadas

Hoy, crearemos 2 programas:

  1. A simple web browser; which will use the WebKit library.
  2. A desktop recorder using the ‘avconv‘ command; which will use the ‘os’ module from Python.

No explicaré cómo arrastrar y soltar widgets en el diseñador Glade de ahora en adelante, solo te diré el nombre de los widgets que necesitas crear, además te daré el .glade archivo para cada programa, y u200bu200bel archivo Python seguro.

Para crear un navegador web, tendremos que usar el motor “ WebKit ”, que es un motor de renderizado de código abierto para la web, es el mismo que se usa en Chrome / Chromium , para obtener más información al respecto, puede consultar el sitio web oficial Webkit.org.

Primero, tendremos que crear la GUI, abrir el diseñador Glade y agregar los siguientes widgets. Para obtener más información sobre cómo crear widgets, siga la Parte 1 y la Parte 2 de esta serie (enlaces que se muestran arriba).

  1. Create ‘window1’ widget.
  2. Create ‘box1’ and ‘box2’ widget.
  3. Create ‘button1’ and ‘button2’ widget.
  4. Create ‘entry1’ widget.
  5. Create ‘scrolledwindow1’ widget.

Después de crear widgets, obtendrá la siguiente interfaz.

No hay nada nuevo, excepto el widget " Ventana desplazada "; este widget es importante para permitir la implantación del motor WebKit en su interior, utilizando el widget “ Ventana desplazada ” también podrá desplazarse horizontal y verticalmente mientras navegar por los sitios web.

Ahora tendrá que agregar el controlador " backbutton_clicked " a la señal " clic " del botón Atrás , " refreshbutton_clicked " controlador al botón Actualizar " señal de clic " y controlador " enterkey_clicked " a la señal " activada " para la entrada.

El archivo .glade completo para la interfaz está aquí.

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

Ahora copie el código anterior y péguelo en el archivo " ui.glade " en su carpeta de inicio. Ahora cree un nuevo archivo llamado “ mywebbrowser.py ” e ingrese el siguiente código dentro de él, toda la explicación está en los comentarios.

#!/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://tecmint.com") 

urlentry = builder.get_object("entry1") 
urlentry.set_text("https://tecmint.com") 

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

Guarde el archivo y ejecútelo.

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

Y esto es lo que obtendrás.

Puede consultar la documentación oficial de WebKitGtk para descubrir más opciones.

En esta sección, aprenderemos cómo ejecutar comandos del sistema local o scripts de shell desde el archivo Python usando el módulo ' os ', que nos ayudará a crear un registrador de pantalla simple para el escritorio usando el Comando ' avconv '.

Abra el diseñador de Glade y cree los siguientes widgets:

  1. Create ‘window1’ widget.
  2. Create ‘box1’ widget.
  3. Create ‘button1’, ‘button2’ and ‘button3’ widgets.
  4. Create ‘entry1’ widget.

Después de crear los widgets mencionados anteriormente, obtendrá la interfaz siguiente.

Aquí está el archivo ui.glade completo.

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

Como de costumbre, copie el código anterior y péguelo en el archivo " ui.glade " en su directorio de inicio, cree un nuevo archivo " myrecorder.py " e ingrese lo siguiente código dentro de él (cada nueva línea se explica en los comentarios).

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

Ahora ejecute el archivo aplicando los siguientes comandos en la terminal.

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

Y tienes tu primera grabadora de escritorio.

Puede encontrar más información sobre el módulo " sistema operativo " en Python OS Library.

Y eso es todo, crear aplicaciones para el escritorio Linux no es difícil usando PyGObject , solo tienes que crear la GUI, importar algunos módulos y vincular el archivo Python con la GUI, nada más y nada menos. Hay muchos tutoriales útiles sobre cómo hacer esto en el sitio web de PyGObject:

¿Ha intentado crear aplicaciones con PyGObject? ¿Qué piensas de hacerlo? ¿Qué aplicaciones has desarrollado antes?