Ṣẹda aṣawakiri Wẹẹbu tirẹ ati Awọn ohun elo Agbohunsile Ojú-iṣẹ Lilo PyGobject - Apá 3


Eyi ni apakan 3rd ti jara nipa ṣiṣẹda awọn ohun elo GUI labẹ tabili Linux nipa lilo PyGObject. Loni a yoo sọrọ nipa lilo diẹ ninu awọn modulu Python & ile ikawe ti o ni ilọsiwaju ninu awọn eto wa bii ' os ', ' WebKit ', ' ibeere ' ati awọn miiran, lẹgbẹẹ alaye miiran ti o wulo fun siseto.

O gbọdọ lọ nipasẹ gbogbo awọn ẹya iṣaaju ti jara lati ibi, lati tẹsiwaju awọn itọnisọna siwaju lori ṣiṣẹda awọn ohun elo ilosiwaju diẹ sii:

  1. Ṣẹda Awọn ohun elo GUI Labẹ Ojú-iṣẹ Linux Lilo PyGObject - Apá 1
  2. Ṣiṣẹda Awọn ohun elo PyGobject ilosiwaju lori Lainos - Apá 2

Awọn modulu & awọn ile ikawe ni Python wulo pupọ, dipo kikọ ọpọlọpọ awọn eto-kekere lati ṣe diẹ ninu awọn iṣẹ idiju eyiti yoo gba akoko pupọ ati iṣẹ, o le kan gbe wọn wọle! Bẹẹni, kan gbe awọn modulu & awọn ile ikawe ti o nilo wọle si eto rẹ ati pe iwọ yoo ni anfani lati fipamọ akoko pupọ ati ipa lati pari eto rẹ.

Ọpọlọpọ awọn modulu olokiki fun Python, eyiti o le rii ni Atọka Module Python.

O le gbe awọn ile-ikawe wọle daradara fun eto Python rẹ, lati “ gi.repository import Gtk ” laini yii gbe wọle ikawe GTK sinu eto Python, ọpọlọpọ awọn ile ikawe miiran wa bi Gdk, WebKit .. etc.

Ṣiṣẹda Awọn ohun elo GUI ilosiwaju

Loni, a yoo ṣẹda awọn eto 2:

  1. Ẹrọ aṣawakiri wẹẹbu ti o rọrun; eyiti yoo lo ile-ikawe WebKit.
  2. Agbohunsile tabili kan nipa lilo aṣẹ ‘avconv’; eyi ti yoo lo modulu ‘os’ lati Python.

Emi kii yoo ṣalaye bawo ni a ṣe le fa & ju awọn ẹrọ ailorukọ silẹ ni apẹẹrẹ Glade lati oni lọ, Emi yoo sọ fun ọ ni orukọ awọn ẹrọ ailorukọ ti o nilo lati ṣẹda, ni afikun Emi yoo fun ọ ni .glade faili fun eto kọọkan, ati faili Python fun daju.

Lati ṣẹda ẹrọ aṣawakiri wẹẹbu kan, a ni lati lo ẹrọ\" WebKit ", eyiti o jẹ ẹrọ fifi-orisun orisun fun wẹẹbu, o jẹ kanna ti o lo ninu Chrome / Chromium , fun alaye diẹ sii nipa rẹ o le tọka si oju opo wẹẹbu osise Webkit.org.

Ni akọkọ, a ni lati ṣẹda GUI, ṣii apẹẹrẹ Glade ki o ṣafikun awọn ẹrọ ailorukọ wọnyi. Fun alaye diẹ sii lori bii o ṣe le ṣẹda awọn ẹrọ ailorukọ, tẹle Apakan 1 ati Apakan 2 ti jara yii (awọn ọna asopọ ti a fun loke).

  1. Ṣẹda ẹrọ ailorukọ ‘window1’.
  2. Ṣẹda ẹrọ ailorukọ 'box1' ati 'box2'.
  3. Ṣẹda ẹrọ ailorukọ ‘button1’ ati ‘button2’.
  4. Ṣẹda ẹrọ ailorukọ 'titẹsi1.
  5. Ṣẹda ẹrọ ailorukọ 'scrolledwindow1'.

Lẹhin ti o ṣẹda awọn ẹrọ ailorukọ, iwọ yoo ni wiwo atẹle.

Ko si nkankan titun, ayafi ẹrọ ailorukọ\" Window Ti a Ṣawakiri ; ẹrọ ailorukọ yii ṣe pataki lati gba aaye WebKit laaye lati fi sii inu rẹ, ni lilo \" Window Window yiyi ”ẹrọ ailorukọ iwọ yoo tun ni anfani lati yi lọ ni ita ati ni inaro lakoko ti o lọ kiri lori awọn oju opo wẹẹbu naa.

Iwọ yoo ni bayi lati ṣafikun oluṣakoso\" backbutton_clicked " si Pada bọtini\" te " ifihan agbara,\" refreshbutton_clicked ”olutọju si Bọtini Itura \" ti tẹ ifihan agbara "ati \" enterkey_clicked "olutọju si ami \" ti mu ṣiṣẹ "fun titẹsi .

Pipe .glade pipe fun wiwo wa nibi.

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

Bayi daakọ koodu ti o wa loke ki o lẹẹ mọ si faili\" ui.glade " ninu folda ile rẹ. Nisisiyi ṣẹda faili tuntun ti a pe ni\" mywebbrowser.py " ki o tẹ koodu atẹle ninu rẹ, gbogbo alaye wa ninu awọn asọye.

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

Fipamọ faili naa, ki o ṣiṣẹ.

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

Ati pe eyi ni ohun ti iwọ yoo gba.

O le tọka fun WebKitGtk iwe aṣẹ osise lati le ṣe awari awọn aṣayan diẹ sii.

Ni apakan yii, a yoo kọ bi a ṣe le ṣiṣẹ awọn aṣẹ eto agbegbe tabi awọn iwe afọwọkọ lati faili Python ni lilo modulu ' os ', eyiti yoo ṣe iranlọwọ fun wa lati ṣẹda agbohunsilẹ iboju ti o rọrun fun deskitọpu nipa lilo ' avconv ' pipaṣẹ.

Ṣii onise apẹẹrẹ Glade, ki o ṣẹda awọn ẹrọ ailorukọ wọnyi:

  1. Ṣẹda ẹrọ ailorukọ ‘window1’.
  2. Ṣẹda ẹrọ ailorukọ ‘box1’.
  3. Ṣẹda awọn ẹrọ ailorukọ ‘button1’, ‘button2’ ati ‘button3’.
  4. Ṣẹda ẹrọ ailorukọ 'titẹsi1.

Lẹhin ti o ṣẹda awọn ẹrọ ailorukọ ti o sọ loke, iwọ yoo wa ni isalẹ wiwo.

Eyi ni faili ui.glade ti o pe.

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

Gẹgẹ bi o ti ṣe deede, daakọ koodu ti o wa loke ki o lẹẹ mọ faili naa\" ui.glade " ninu itọsọna ile rẹ, ṣẹda faili tuntun "" myrecorder.py "ki o tẹ koodu atẹle ni inu rẹ (Gbogbo ila tuntun ni a ṣalaye ninu awọn asọye).

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

Bayi ṣiṣe faili naa nipa lilo awọn ofin wọnyi ni ebute naa.

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

Ati pe o ni agbohunsilẹ tabili akọkọ rẹ.

O le wa alaye diẹ sii nipa module ‘ os ‘ module ni Python OS Library.

Ati pe iyẹn ni, ṣiṣẹda awọn ohun elo fun tabili Linux ko nira nipa lilo PyGObject , o kan ni lati ṣẹda GUI, gbe wọle diẹ ninu awọn modulu ki o sopọ ọna faili Python pẹlu GUI, ko si nkan diẹ sii, ko si nkan ti o kere. Ọpọlọpọ awọn itọnisọna to wulo nipa ṣiṣe eyi ni oju opo wẹẹbu PyGObject:

Njẹ o ti gbiyanju ṣiṣẹda awọn ohun elo nipa lilo PyGObject? Kini o ro nipa ṣiṣe bẹ? Awọn ohun elo wo ni o ti dagbasoke ṣaaju?