Biblioteci pentru dezvoltarea interfețelor grafice în Python


 21 Oct, 2014  doru  1466  
python pyside pyqt wxpython pygtk pygobject pygi tkinter gui

Dacă vrei să dezvolți interfețe grafice pentru utilizator (GUI - Graphical User Interface) în Python ajungi imediat în dilema: "Ce bibliotecă grafică (GUI toolkit) să folosesc?". Și asta pentu că sunt mai multe astfel de biblioteci și fiecare are atuurile ei.

        

Ghidându-te după anumite criterii (gradul de maturitate, suportul și menținearea activă, cât de bine sunt documentate și - de ce nu - cât de pythonice sunt) ies în evidență cinci astfel de biblioteci:

  • PyQt - legăturile în Python pentru softul cadru de dezvoltare a interfețelor pentru utilizator (UI framework) Qt. Este disponibilă numai sub o licență restrictivă:  dacă vrei să o folosești într-o aplicație comercială (adică pe care vrei s-o vinzi) trebuie să cumperi licență de la Riverbank Computing, firma producătoare. Poate fi folosită aproape pe orice platformă, de la Windows la Mac OS. Oferă suport pentru Qt5. Poate fi folosită în Python 3.
  • PySide - este o bibliotecă în mare parte identică - din punct de vedere tehnic - cu PyQt numai că este emisă sub licență LGPL, adică este software liber: poți să o folosești în propria ta aplicație comercială fără să plătești o licență și fără să fii obligat să faci codul aplicației tale public (open source).  Nu oferă încă suport pentru Qt5, ci numai pentru Qt4. De asemenea, fiind o bibliotecă menținută de comunitate, modificările în Qt sunt puțin mai greu transpuse în PySide (față de PyQt). Dar se pare că are principii de codare mai pythonice. Poate fi folosită pe aproape orice platformă, de la Windows la Mac OS. Momentan există (cel puțin) un proiect, menținut activ, care are drept scop introducerea PySide/PyQt în dezvoltarea aplicațiilor mobile. Poate fi folosită în Python 3.
  • PyGObject (Pygi) - este fosta bibliotecă PyGtk. Reprezintă legăturile în Python pentru softul cadru de dezvoltare a interfețelor pentru utilizator Gtk. Este de asemenea funcțională pe majoritatea platformelor desktop. Și este de asemenea software liber (sub licență LGPL). Poate fi folosită în Python 3.
  • wxPython - reprezintă legăturile în Python pentru biblioteca de elemente grafice wxWidgets (scrisă în C++). Este o bibliotecă matură (menținută parcă nu așa activ...) care oferă un aspect nativ (aplicațiilor codate în ea) pe orice platformă. Se pare că este portată în Python 3 (wxPython Project Phoenix).
  •  Tkinter - este biblioteca de dezvoltare a interfețelor pentru utilizator care vine preinstalată cu Python-ul. Asta nu înseamnă că este cea mai bună: este folosită de obicei in scopuri educative (nu este - din câte știu - folosită în mari aplicații sau în aplicații comerciale).

Pentru a vă face o (foarte mică) idee despre cum arată codul în fiecare din aceste biblioteci grafice am să implementez celebrul "Salutare (ro)coderi!" în fiecare.

Pyside

import sys
from PySide.QtGui import *
from PySide.QtCore import *
 
class SalutareRoCoderi(QLabel):
    def __init__(self):
        QLabel.__init__(self)
        self.setWindowTitle("PySide")
        self.setGeometry(300, 250, 300, 200)
        self.setText("Salutare (ro)coderi!")
        self.setAlignment(Qt.AlignCenter)
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    fereastra = SalutareRoCoderi()
    fereastra.show()
    app.exec_()

 

PyQt

import sys
from PyQt5.Qt import *
 
class SalutareRoCoderi(QLabel):
    def __init__(self):
        QLabel.__init__(self)
        self.setWindowTitle("PyQt5")
        self.setGeometry(300, 250, 300, 200)
        self.setText("Salutare (ro)coderi!")
        self.setAlignment(Qt.AlignCenter)
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    fereastra = SalutareRoCoderi()
    fereastra.show()
    app.exec_()

 

PyGObject

from gi.repository import Gtk, Gio

class SalutareRoCoderi(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self, application_id="apps.test.helloworld",
                                 flags=Gio.ApplicationFlags.FLAGS_NONE)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        window = Gtk.Window(type=Gtk.WindowType.TOPLEVEL)
        window.set_title("PyGObject")
        window.resize(300, 200)
        label = Gtk.Label("Salutare (ro)coderi!")
        window.add(label)
        window.show_all()
        self.add_window(window)
    
if __name__ == "__main__":
    app = SalutareRoCoderi()
    app.run(None)

 

wxPython

import wx

class SalutareRoCoderi(wx.Panel):
  def __init__(self, parent, id):
    wx.Panel.__init__(self, parent, id)
    str1 = "Salutare (ro)coderi!"
    self.label1 = wx.StaticText(self, -1, str1 , wx.Point(100, 90))
     
app = wx.PySimpleApp()
myframe = wx.Frame(None, -1, "wxPython", size = (300, 200))
SalutareRoCoderi(myframe, -1)
myframe.Show(1)
app.MainLoop()

 

Tkinkter

import Tkinter
 
tk = Tkinter.Tk()
frame = Tkinter.Frame(tk, relief="ridge", borderwidth=1, width = 300, height = 200)
frame.pack(fill="both",expand=1)
label = Tkinter.Label(frame, text="Salutare (ro)coderi!")
label.pack(expand=1)
frame.pack_propagate(0)

tk.mainloop()

După rularea codului (dacă aveți respectivele biblioteci instalate în Python) va apărea o fereastră în care scrie "Salutare (ro)coderi!".