Hozzon létre saját webböngészőt és asztali rögzítőt a PyGobject segítségével – 3. rész
Ez a sorozat 3. része a GUI-alkalmazások létrehozásáról Linux asztalon PyGObject használatával. Ma néhány fejlett Python-modul és -könyvtár programjainkban való használatáról fogunk beszélni, mint például a 'os', 'WebKit', 'requests' és egyéb hasznos információk mellett a programozáshoz.
Követelmények
Innen kell végigmennie a sorozat összes korábbi részein, hogy folytassa az előrehaladottabb alkalmazások létrehozásával kapcsolatos további utasításokat:
- GUI-alkalmazások létrehozása Linux Desktop alatt PyGObject segítségével – 1. rész
- Fejlett PyGobject alkalmazások létrehozása Linuxon – 2. rész
A Python moduljai és könyvtárai nagyon hasznosak, ahelyett, hogy sok alprogramot írna néhány bonyolult feladat elvégzéséhez, amelyek sok időt és munkát igényelnek, egyszerűen importálhatja őket! Igen, csak importálja a szükséges modulokat és könyvtárakat a programba, és sok időt és erőfeszítést takaríthat meg a program befejezéséhez.
Számos híres Python modul létezik, amelyeket a Python Module Index oldalon találhat meg.
A Python programhoz könyvtárakat is importálhat, a „gi.repository import Gtk” sorból ez a sor importálja a GTK könyvtárat a Python programba, sok más könyvtár is létezik, például Gdk, WebKit stb.
Advance GUI alkalmazások létrehozása
Ma 2 programot készítünk:
- Egy egyszerű webböngésző; amely a WebKit könyvtárat fogja használni.
- Az „avconv” parancsot használó asztali felvevő; amely a Python „os” modulját fogja használni.
Mostantól nem magyarázom el, hogyan kell widgeteket áthúzni a Glade tervezőben, csak megmondom a létrehozandó widgetek nevét, valamint megadom a >.glade fájlt minden programhoz, a Python fájlt pedig biztosan.
Egyszerű webböngésző létrehozása
Webböngésző létrehozásához a „WebKit” motort kell használnunk, amely egy nyílt forráskódú megjelenítő motor az internethez, ugyanaz, mint a Chrome/Chromium. További információért keresse fel a hivatalos Webkit.org webhelyet.
Először létre kell hoznunk a grafikus felhasználói felületet, meg kell nyitnunk a Glade tervezőt, és hozzá kell adnunk a következő widgeteket. A widgetek létrehozásával kapcsolatos további információkért kövesse a sorozat 1. részét és 2. részét (a fenti linkek).
- Hozzon létre „window1” widgetet.
- Hozzon létre „box1” és „box2” widgetet.
- Hozzon létre „button1” és „button2” widgetet.
- Hozzon létre „bejegyzés1” widgetet.
- Hozzon létre 'scrolledwindow1' widgetet.
A widgetek létrehozása után a következő felületet kapja.
Nincs semmi új, kivéve a „Görgetett ablak” widgetet; ez a widget azért fontos, hogy lehetővé tegye a WebKit motor beültetését, a „Görgetett ablak” widget használatával vízszintesen és függőlegesen is görgethet, miközben böngészni a weboldalakat.
Most hozzá kell adnia a „backbutton_clicked ” kezelőt a Vissza gomb „kattintott ” jeléhez, „refreshbutton_clicked ” kezelő a Frissítés gombra „kattintott jel” és az „enterkey_clicked ” kezelő a bejegyzés „aktivált” jelére.
Az interfész teljes .glade fájlja itt található.
<?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>
Most másolja ki a fenti kódot, és illessze be a saját mappájában található „ui.glade ” fájlba. Most hozzon létre egy új fájlt „mywebbrowser.py” néven, és írja be a következő kódot, a magyarázat a megjegyzésekben található.
#!/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()
Mentse el a fájlt, és futtassa.
chmod 755 mywebbrowser.py
./mywebbrowser.py
És ezt fogod kapni.
További lehetőségek megismeréséhez tekintse meg a hivatalos WebKitGtk dokumentációt.
Egyszerű asztali rögzítő létrehozása
Ebben a részben megtudjuk, hogyan futtassunk helyi rendszerparancsokat vagy shell-szkripteket a Python fájlból az 'os' modul használatával, amely segít egy egyszerű képernyőrögzítő létrehozásában az asztalon a 'avconv' parancsot.
Nyissa meg a Glade tervezőt, és hozza létre a következő widgeteket:
- Hozzon létre „window1” widgetet.
- Hozzon létre „box1” widgetet.
- Hozzon létre „button1”, „button2” és „button3” widgeteket.
- Hozzon létre „bejegyzés1” widgetet.
A fenti widgetek létrehozása után az alábbi felület jelenik meg.
Íme a teljes ui.glade fájl.
<?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>
A szokásos módon másolja ki a fenti kódot, és illessze be a kezdőkönyvtár „ui.glade ” fájljába, hozzon létre egy új „myrecorder.py ” fájlt, és írja be a következőt kód benne (Minden új sor magyarázata a megjegyzésekben található).
#!/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()
Most futtassa a fájlt a következő parancsok alkalmazásával a terminálban.
chmod 755 myrecorder.py
./myrecorder.py
És megvan az első asztali felvevője.
Az „os” modulról a Python OS Library oldalán talál további információt.
És ez az, nem nehéz a Linux asztali alkalmazásokat létrehozni a PyGObject segítségével, csak létre kell hoznia a grafikus felhasználói felületet, importálnia kell néhány modult, és össze kell kapcsolnia a Python fájlt a grafikus felhasználói felülettel, semmi több, nem kevesebb. A PyGObject webhelyen számos hasznos oktatóanyag található erről:
Próbáltál már alkalmazásokat létrehozni PyGObject segítségével? Mit gondolsz erről? Milyen alkalmazásokat fejlesztettél korábban?