Biblioteci pentru dezvoltarea interfețelor grafice în Python
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!".