PyGobject ഉപയോഗിച്ച് നിങ്ങളുടെ സ്വന്തം വെബ് ബ്രൗസറും ഡെസ്ക്ടോപ്പ് റെക്കോർഡർ ആപ്ലിക്കേഷനുകളും സൃഷ്ടിക്കുക - ഭാഗം 3


PyGObject ഉപയോഗിച്ച് Linux ഡെസ്ക്ടോപ്പിന് കീഴിൽ GUI ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കുന്നതിനെക്കുറിച്ചുള്ള പരമ്പരയുടെ 3-ാം ഭാഗമാണിത്. 'os', 'WebKit', 'അഭ്യർത്ഥനകൾ' എന്നിങ്ങനെയുള്ള ഞങ്ങളുടെ പ്രോഗ്രാമുകളിൽ ചില വിപുലമായ പൈത്തൺ മൊഡ്യൂളുകളും ലൈബ്രറികളും ഉപയോഗിക്കുന്നതിനെക്കുറിച്ച് ഇന്ന് നമ്മൾ സംസാരിക്കും. മറ്റുള്ളവ, പ്രോഗ്രാമിംഗിന് ഉപയോഗപ്രദമായ മറ്റ് ചില വിവരങ്ങൾ കൂടാതെ.

കൂടുതൽ മുൻകൂർ ആപ്ലിക്കേഷനുകൾ സൃഷ്uടിക്കുന്നതിനുള്ള തുടർ നിർദ്ദേശങ്ങൾ തുടരുന്നതിന്, നിങ്ങൾ ഇവിടെ നിന്ന് ഈ പരമ്പരയുടെ ഈ മുൻ ഭാഗങ്ങളിലേക്ക് പോകണം:

  1. PyGObject ഉപയോഗിച്ച് Linux ഡെസ്ക്ടോപ്പിന് കീഴിൽ GUI ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കുക - ഭാഗം 1
  2. ലിനക്സിൽ അഡ്വാൻസ് പൈഗോബ്ജക്റ്റ് ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കുന്നു - ഭാഗം 2

പൈത്തണിലെ മൊഡ്യൂളുകളും ലൈബ്രറികളും വളരെ ഉപകാരപ്രദമാണ്, വളരെയധികം സമയവും അധ്വാനവും എടുക്കുന്ന ചില സങ്കീർണ്ണമായ ജോലികൾ ചെയ്യാൻ നിരവധി ഉപ-പ്രോഗ്രാമുകൾ എഴുതുന്നതിനുപകരം, നിങ്ങൾക്ക് അവ ഇറക്കുമതി ചെയ്യാൻ കഴിയും! അതെ, നിങ്ങളുടെ പ്രോഗ്രാമിലേക്ക് ആവശ്യമായ മൊഡ്യൂളുകളും ലൈബ്രറികളും ഇറക്കുമതി ചെയ്യുക, നിങ്ങളുടെ പ്രോഗ്രാം പൂർത്തിയാക്കാൻ നിങ്ങൾക്ക് ധാരാളം സമയവും പരിശ്രമവും ലാഭിക്കാൻ കഴിയും.

പൈത്തണിനായി നിരവധി പ്രശസ്തമായ മൊഡ്യൂളുകൾ ഉണ്ട്, അവ പൈത്തൺ മൊഡ്യൂൾ ഇൻഡക്സിൽ കാണാം.

gi.repository import Gtk എന്നതിൽ നിന്ന് നിങ്ങൾക്ക് നിങ്ങളുടെ പൈത്തൺ പ്രോഗ്രാമിനായി ലൈബ്രറികളും ഇറക്കുമതി ചെയ്യാൻ കഴിയും, ഈ ലൈൻ GTK ലൈബ്രറിയെ പൈത്തൺ പ്രോഗ്രാമിലേക്ക് ഇമ്പോർട്ടുചെയ്യുന്നു, Gdk, WebKit.. തുടങ്ങിയ നിരവധി ലൈബ്രറികൾ ഉണ്ട്.

അഡ്വാൻസ് ജിയുഐ ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കുന്നു

ഇന്ന്, ഞങ്ങൾ 2 പ്രോഗ്രാമുകൾ സൃഷ്ടിക്കും:

  1. ഒരു ലളിതമായ വെബ് ബ്രൗസർ; WebKit ലൈബ്രറി ഉപയോഗിക്കും.
  2. 'avconv' കമാൻഡ് ഉപയോഗിക്കുന്ന ഒരു ഡെസ്ക്ടോപ്പ് റെക്കോർഡർ; ഇത് പൈത്തണിൽ നിന്നുള്ള 'os' മൊഡ്യൂൾ ഉപയോഗിക്കും.

ഇപ്പോൾ മുതൽ Glade ഡിസൈനറിൽ വിജറ്റുകൾ വലിച്ചിടുന്നത് എങ്ങനെയെന്ന് ഞാൻ വിശദീകരിക്കില്ല, നിങ്ങൾ സൃഷ്ടിക്കേണ്ട വിജറ്റുകളുടെ പേര് ഞാൻ നിങ്ങളോട് പറയും, കൂടാതെ ഞാൻ നിങ്ങൾക്ക് .glade ഫയൽ, ഉറപ്പായും പൈത്തൺ ഫയൽ.

ഒരു വെബ് ബ്രൗസർ സൃഷ്uടിക്കുന്നതിന്, വെബിനായുള്ള ഒരു ഓപ്പൺ സോഴ്uസ് റെൻഡറിംഗ് എഞ്ചിൻ ആയ \WebKit എഞ്ചിൻ ഞങ്ങൾ ഉപയോഗിക്കേണ്ടതുണ്ട്, ഇത് Chrome/Chromium, അതിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് നിങ്ങൾക്ക് ഔദ്യോഗിക Webkit.org വെബ്സൈറ്റ് നോക്കാവുന്നതാണ്.

ആദ്യം, നമുക്ക് GUI സൃഷ്ടിക്കേണ്ടതുണ്ട്, Glade ഡിസൈനർ തുറന്ന് ഇനിപ്പറയുന്ന വിജറ്റുകൾ ചേർക്കുക. വിജറ്റുകൾ എങ്ങനെ സൃഷ്ടിക്കാം എന്നതിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക്, ഈ സീരീസിന്റെ ഭാഗം 1, ഭാഗം 2 എന്നിവ പിന്തുടരുക (മുകളിൽ നൽകിയിരിക്കുന്ന ലിങ്കുകൾ).

  1. ‘window1’ വിജറ്റ് സൃഷ്uടിക്കുക.
  2. ‘box1’, ‘box2’ വിജറ്റ് സൃഷ്uടിക്കുക.
  3. ‘ബട്ടൺ1’, ‘ബട്ടൺ2’ വിജറ്റ് സൃഷ്uടിക്കുക.
  4. ‘എൻട്രി1’ വിജറ്റ് സൃഷ്uടിക്കുക.
  5. ‘സ്ക്രോൾഡ് വിൻഡോ1’ വിജറ്റ് സൃഷ്uടിക്കുക.

വിജറ്റുകൾ സൃഷ്ടിച്ച ശേഷം, നിങ്ങൾക്ക് ഇനിപ്പറയുന്ന ഇന്റർഫേസ് ലഭിക്കും.

\സ്ക്രോൾ ചെയ്uത വിൻഡോ വിജറ്റ് ഒഴികെ പുതിയതായി ഒന്നുമില്ല; \WebKit എഞ്ചിൻ സ്ഥാപിക്കാൻ അനുവദിക്കുന്നതിന് ഈ വിജറ്റ് പ്രധാനമാണ്. >സ്ക്രോൾ ചെയ്ത വിൻഡോ വിജറ്റ് നിങ്ങൾ വെബ്uസൈറ്റുകൾ ബ്രൗസ് ചെയ്യുമ്പോൾ തിരശ്ചീനമായും ലംബമായും സ്ക്രോൾ ചെയ്യാനും കഴിയും.

നിങ്ങൾക്ക് ഇപ്പോൾ \backbutton_clicked ഹാൻഡ്uലർ Back ബട്ടണിലേക്ക് \clicked സിഗ്നലിലേക്ക് ചേർക്കേണ്ടതുണ്ട്, \refreshbutton_clicked b>” റിഫ്രഷ് ബട്ടണിലേക്കുള്ള ഹാൻഡ്uലർ \ക്ലിക്ക് ചെയ്uത സിഗ്നൽ കൂടാതെ \enterkey_clicked ഹാൻഡ്uലർ എൻട്രിക്കുള്ള \സജീവമാക്കിയ സിഗ്നലിലേക്ക് .

ഇന്റർഫേസിനായുള്ള പൂർണ്ണമായ .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

ഇത് നിങ്ങൾക്ക് ലഭിക്കും.

കൂടുതൽ ഓപ്uഷനുകൾ കണ്ടെത്തുന്നതിന് നിങ്ങൾക്ക് WebKitGtk ഔദ്യോഗിക ഡോക്യുമെന്റേഷൻ റഫർ ചെയ്യാം.

ഈ വിഭാഗത്തിൽ, 'os' മൊഡ്യൂൾ ഉപയോഗിച്ച് പൈത്തൺ ഫയലിൽ നിന്ന് ലോക്കൽ സിസ്റ്റം കമാൻഡുകളോ ഷെൽ സ്ക്രിപ്റ്റുകളോ എങ്ങനെ പ്രവർത്തിപ്പിക്കാമെന്ന് ഞങ്ങൾ പഠിക്കും, ഇത് ഡെസ്ക്ടോപ്പിനായി ലളിതമായ സ്ക്രീൻ റെക്കോർഡർ സൃഷ്ടിക്കാൻ ഞങ്ങളെ സഹായിക്കും. 'avconv' കമാൻഡ്.

ഗ്ലേഡ് ഡിസൈനർ തുറന്ന് ഇനിപ്പറയുന്ന വിജറ്റുകൾ സൃഷ്ടിക്കുക:

  1. ‘window1’ വിജറ്റ് സൃഷ്uടിക്കുക.
  2. ‘box1’ വിജറ്റ് സൃഷ്uടിക്കുക.
  3. ‘ബട്ടൺ1’, ‘ബട്ടൺ2’, ‘ബട്ടൺ3’ വിജറ്റുകൾ സൃഷ്uടിക്കുക.
  4. ‘എൻട്രി1’ വിജറ്റ് സൃഷ്uടിക്കുക.

മുകളിൽ പറഞ്ഞ വിജറ്റുകൾ സൃഷ്ടിച്ച ശേഷം, നിങ്ങൾക്ക് താഴെയുള്ള ഇന്റർഫേസ് ലഭിക്കും.

പൂർണ്ണമായ 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>

പതിവുപോലെ, മുകളിലെ കോഡ് പകർത്തി നിങ്ങളുടെ ഹോം ഡയറക്uടറിയിലെ \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’ മൊഡ്യൂളിനെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ കണ്ടെത്താനാകും.

അത്രയേയുള്ളൂ, ലിനക്സ് ഡെസ്ക്ടോപ്പിനായി ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കുന്നത് PyGObject ഉപയോഗിച്ച് ബുദ്ധിമുട്ടുള്ള കാര്യമല്ല, നിങ്ങൾ GUI സൃഷ്ടിക്കുകയും ചില മൊഡ്യൂളുകൾ ഇറക്കുമതി ചെയ്യുകയും GUI-യുമായി പൈത്തൺ ഫയൽ ലിങ്ക് ചെയ്യുകയും വേണം, അതിൽ കൂടുതലൊന്നും, കുറവൊന്നുമില്ല. PyGObject വെബ്uസൈറ്റിൽ ഇത് ചെയ്യുന്നതിനെക്കുറിച്ച് ധാരാളം ഉപയോഗപ്രദമായ ട്യൂട്ടോറിയലുകൾ ഉണ്ട്:

നിങ്ങൾ PyGObject ഉപയോഗിച്ച് ആപ്ലിക്കേഷനുകൾ സൃഷ്ടിക്കാൻ ശ്രമിച്ചിട്ടുണ്ടോ? അങ്ങനെ ചെയ്യുന്നതിനെക്കുറിച്ച് നിങ്ങൾക്ക് എന്തു തോന്നുന്നു? നിങ്ങൾ മുമ്പ് എന്ത് ആപ്ലിക്കേഷനുകൾ വികസിപ്പിച്ചെടുത്തു?