Glade PyGTK
Upcoming SlideShare
Loading in...5
×
 

Glade PyGTK

on

  • 3,278 views

Linux GUI programming con Glade e PyGTK

Linux GUI programming con Glade e PyGTK
Giovanni Marigi - Codemotion 2011

Statistics

Views

Total Views
3,278
Views on SlideShare
3,079
Embed Views
199

Actions

Likes
0
Downloads
64
Comments
1

8 Embeds 199

http://2011.codemotion.it 92
http://www.codemotion.it 83
http://codemotion.macaronilab.com 17
https://www.linkedin.com 3
http://twitter.com 1
http://codemotion.it 1
http://www.linkedin.com 1
http://codemotion.macaronibros.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Glade PyGTK Glade PyGTK Presentation Transcript

  • Linux GUI Programmingcon Glade e PyGTK Giovanni Marigi -gio.marigi[at]gmail.com –
  • Chi sono✔ Senior Consultant per ValueTeam SPAhttp://www.valueteam.com giomarigi✔ Uno dei coordinatori del JBoss User Group Romahttp://tech.groups.yahoo.com/group/roma-jbug✔ Membro e sostenitore delle attività del Jug Roma✔ My buzzwords: BRMS – BPM – APM – JBoss – CI – GateIn – SOA – Android - Linux Spring – Agile techniques - Flex – Python – PyGTK – Grails – Debian✔ Bloghttp://hifly81.wordpress.com Giovanni Marigi -gio.marigi[at]gmail.com –
  • GUI sketchesUna GUI si disegna prima su carta!La fase di GUI prototyping ha come obiettivo quello di fornire una seriedi sketches o screen mock-ups dellapplicazione che si intende realizzare(siti web – videogames – applicazioni con interfacce visuali)Graphic designers, interaction designers, web designers lavorano sullaprototipazione (non vi aspettate che sappiano creare un css :-) )Chi realizza i mock-ups attraverso uno strumento RAD utilizza i mock-upsdella fase di GUI prototypingDifficile che dietro ad una GUI di successo non ci sia una fase diprototipazione... Giovanni Marigi -gio.marigi[at]gmail.com –
  • GUI sketchesSe non siete convinti date unocchiata qui:http://deeplinking.net/paper-webhttp://www.tobinharris.com/past/2008/9/15/get-that-sketchy-look-in-your-wireframesVedrete alcuni degli sketches originali di twitter, flickr, vimeo,...Sembra che sia una cosa molto “cool”realizzare sketches nello stileribattezzato sketchy look(almeno così mi hanno detto amici grafici) Giovanni Marigi -gio.marigi[at]gmail.com –
  • GUI sketchesPer chi (come il sottoscritto) pur non avendo spiccato senso estetico si ostinaa voler disegnare GUI, un semplice strumento di prototipazione open source èpencilhttp://pencil.evolus.vnGUI prototypingtoolsAdobe FireworksmockingbirdForeUIAxureInkscapeBalsamiqDenim Giovanni Marigi -gio.marigi[at]gmail.com –
  • pyTorrent sketchGiovanni Marigi -gio.marigi[at]gmail.com –
  • GTK+GTK+ (GNU LGPL 2.1) è un toolkit per realizzare interfacce grafiche suambienti Unix, Windows e OS XUltima versione stabile 3.0.1GTK+ è scritto in C ma esistono suoi binding in quasi tutti i linguaggi piùusati C++, Objective-C, Perl, Python, Ada95, Free Pascal, Eiffel, JavaPer avere unidea delle applicazioni scritte in GTK+ (oltre a GNOME)http://gnomefiles.orghttp://gtk-apps.org Giovanni Marigi -gio.marigi[at]gmail.com –
  • GTK+GTK+ dipende dalle seguenti librerie:(reference guide http://library.gnome.org/devel/gtk3/stable)GlibA general-purpose utility library, not specific to graphical user interfaces. GLib providesmany useful data types, macros, type conversions, string utilities, file utilities, a main loopabstraction, and so onGobjectA library that provides a type system, a collection of fundamental types including an objecttype, a signal systemGIOA modern, easy-to-use VFS API including abstractions for files, drives, volumes, stream IO, aswell as network programming and DBus communicationcairoCairo is a 2D graphics library with support for multiple output devices Giovanni Marigi -gio.marigi[at]gmail.com –
  • GTK+PangoPango is a library for internationalized text handling. It centers around the PangoLayoutobject, representing a paragraph of text. Pango provides the engine for GtkTextView,GtkLabel, GtkEntry, and other widgets that display textATKATK is the Accessibility Toolkit. It provides a set of generic interfaces allowing accessibilitytechnologies to interact with a graphical user interface. For example, a screen reader usesATK to discover the text in an interface and read it to blind users. GTK+ widgets have built-insupport for accessibility using the ATK frameworkGdkPixbufThis is a small library which allows you to create GdkPixbuf ("pixel buffer") objects fromimage data or image files. Use a GdkPixbuf in combination with GtkImage to display imagesGDKGDK is the abstraction layer that allows GTK+ to support multiple windowingsystems. GDK provides window system facilities on X11, Windows, and OS X Giovanni Marigi -gio.marigi[at]gmail.com –
  • GTK+ widgetsIl modulo GTK+ vero è proprio è composto da una serie di oggetti chiamatiwidgets, i componenti con cui costruire le GUII widgets sono organizzati in modo gerarchico a partire dal componente baseGtkWidgetIl componente “concreto” base per la costruzione di una GUI è il GtkWindowhttp://library.gnome.org/devel/gtk3/stable/ch02.htmlGObject +----GInitiallyUnowned +----GtkObject +----GtkWidget +----GtkContainer +----GtkBin +----GtkWindow Giovanni Marigi -gio.marigi[at]gmail.com –
  • GTK+ widgetsWidget Galleryhttp://library.gnome.org/devel/gtk3/stable/ch03.htmlWindowsGtkDialog GtkInvisible GtkMessageDialog GtkWindow GtkWindowGroup GtkAboutDialog GtkAssistant GtkOffscreenWindowDisplay WidgetsGtkAccelLabelt GtkImage GtkLabel GtkProgressBar GtkStatusbar GtkInfoBar GtkStatusIcon GtkSpinnerButtons and Toggles - Numeric/Text Data Entry - Multiline Text Editor - Tree, List and Icon Grid WidgetsMenus, Combo Box, Toolbar - Action-based menus and toolbars - Selectors (Color/File/Font)Layout Containers – Scrolling - PrintingMiscellaneous - Abstract Base Classes - Cross-process EmbeddingRecently Used Documents - Choosing from installed applications - Interface builderApplication support Giovanni Marigi -gio.marigi[at]gmail.com –
  • GLADEGLADE (GNU General Public License) è un applicativo RAD per lacostruzione di interfacce attraverso lutilizzo dei widgets GTK+Ultima release 3.9.2 (1 febbraio 2011) mette già a disposizione iwidgets GTK+ 3Le interfacce generate da GLADE vengono salvate in formato XML inmodo da poter venir dinamicamente integrate allinterno di un linguaggioche offre un binding GTK+GLADE permette lesportazione della GUI in un formato XMLGtkBuilder o Libglade Giovanni Marigi -gio.marigi[at]gmail.com –
  • GLADEGiovanni Marigi -gio.marigi[at]gmail.com –
  • GLADE<?xml version="1.0" encoding="UTF-8"?> <glade-interface> <!-- interface-requires gtk+ 2.16 --> <!-- interface-naming-policy project-wide --> <widget class="GtkWindow" id="pyTorrent"> <property name="title" translatable="yes">pyTorrent</property> <property name="default_width">800</property> <property name="default_height">600</property> <property name="icon">python.gif</property> <property name="icon_name">python</property> <child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <child> <widget class="GtkMenuBar" id="menubar1"> <property name="visible">True</property> <property name="ubuntu_local">True</property> <child> <widget class="GtkMenuItem" id="menuitem1"> Giovanni Marigi -gio.marigi[at]gmail.com –
  • GLADEGiovanni Marigi -gio.marigi[at]gmail.com –
  • GLADEIn GLADE oltre alla costruzione dellinterfaccia vanno definiti anche isegnali (events handler) sui vari widgetsIn GLADE vengono solamente indicati (dizionari di eventi)i segnali che la GUI dovrà gestire; il comportamento che verrà associatoallhandler del segnale verrà realizzato attraverso ilcodice che caricherà la GUI XML generata da GLADE#Define a events dictionaryevents = {"on_pyTorrent_destroy" : self.destroy_clicked,"on_MainWindow_destroy" : gtk.main_quit } self.pytorrent.signal_autoconnect(events)def destroy_clicked(self, widget): print "Quit PyTorrent!" Giovanni Marigi -gio.marigi[at]gmail.com –
  • GLADENella definizione di una GUI è importante definire una strategia diposizionamento (packing) fra i vari widgetsGLADE basandosi sul tipo di widget applica delle strategie di packing moltospesso in linea con quanto ci si aspetta...Se come esempio creo un container con 3 widgets disposti in modoorizzontale di cui lultimo è una status bar, GLADE assume che ad unastatus bar non va assegnato lo stesso spazio degli altri due componentima uno spazio più limitato(footer) Giovanni Marigi -gio.marigi[at]gmail.com –
  • GLADEGiovanni Marigi -gio.marigi[at]gmail.com –
  • GLADESe non si è contenti del posizionamento automatico di GLADE si possonousare le proprietà di packing sui vari widgets:✔ homogeneoussi applica solo su container widgets ed assegna lo stesso spazio ai widgetscontenuti allinterno del container✔ expanddetermina se un widget deve ricevere ulteriore spazio nel momento in cuiil suo widget container viene ingrandito✔ filldetermina se un widget deve riempire uneventuale spazio a sé adiacentenon occupato da altri widgets Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTKPyGTK (GNU LGPL 2.1 stessa licenza di GTK+) è il binding di GTK+ perPython → Python + GTK+ = PyGTKUltima release 2.22.0 (25 settembre 2010) offre il binding delle API GTK+Il codice PyGTK è multipiattaforma (GTK+ è multipiattaforma)Facilità di utilizzo! (normale è Python) date unocchiata alle FAQhttp://faq.pygtk.org/index.py?req=allPyGTK è incluso già in molte distro Linux tra cui Debian, Fedora, Ubuntu,Opensuse, Gentoo, Mandrake, Redhat, SUSE...BitTorrent, Exaile, Gajim, gDesklets, GIMP (Python scripts), Gwibber,gPodder, PiTiVi, Ubiquity,... Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTKAPI reference http://library.gnome.org/devel/pygtk/stable/Codice sorgente e dev releasesgit clone git://git.gnome.org/pygtkgit clone git://git.gnome.org/gnome-pythongit clone git://git.gnome.org/gnome-python-desktopgit clone git://git.gnome.org/gnome-python-extrasIn PyGTK si possono usare GNOME libraries, dipendenze richieste:PyORBit, gnome-python, gnome-python-desktop , gnome-python-extrashttp://ftp.gnome.org/pub/GNOME/sources/pyorbit/http://ftp.gnome.org/pub/GNOME/sources/gnome-python/http://ftp.gnome.org/pub/GNOME/sources/gnome-python-desktop/http://ftp.gnome.org/pub/GNOME/sources/gnome-python-extras/ Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK✔#!/usr/bin/env pythonimport gtkdef button_handler(widget) : dialog = gtk.Dialog("Quit PyGTK talk?", codemotionWindow, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)) dialog.show() result = dialog.run() if result ==-3: gtk.main_quit#GTKWindowcodemotionWindow = gtk.Window(); hboxPanel = gtk.HBox()codemotionWindow.add(hboxPanel)codemotionButton = gtk.Button("Codemotion!")#Add an handler to the buttoncodemotionButton.connect("clicked", button_handler)hboxPanel.pack_start(codemotionButton)codemotionButton.show()#Add a signal to the main windowcodemotionWindow.connect("destroy", gtk.main_quit)#Show containers widgetshboxPanel.show(); codemotionWindow.show(); gtk.main() Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADE1) Invece di costruire la GUI attraverso PyGTK, carichiamo la GUI dal fileXML di generato da GLADE2) Utilizziamo PyGTK per accedere ai vari widgets GTK+ creati e pereventualmente modificarli3) Definiamo in PyGTK degli handler per il dizionario di segnali associatialla GUI GLADE4) Estendiamo, modifichiamo la nostra GUI con codice Python... Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADE#!/usr/bin/env pythonimport systry: import pygtk pygtk.require("2.2")except: passtry: import gtk import gtk.gladeexcept: sys.exit(1)class PyTorrent: def __init__(self): #Load a GLADE GUI self.gladefile = "pyTorrent.glade" self.pytorrent = gtk.glade.XML(self.gladefile) #Get the reference to a GTK+ widget self.window = self.pytorrent.get_widget("pyTorrent") #Modify a GTK+ widget with a new background color self.window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("navajowhite")) Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEevents = {"on_pyTorrent_destroy" : self.destroy_clicked,“on_pyTorrent_torrentSearch”: self.torrentSearch_clicked,"on_MainWindow_destroy" : gtk.main_quit }#Connect the dictionary of eventsself.pytorrent.signal_autoconnect(events)#A definition of a event handlerdef destroy_clicked(self, widget): print "Quit PyTorrent!" Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEOgni GObject ha la possibilità di registrarsi a degli eventi e di definireuna specifica funzione di callbackConnettere una callback ad un evento:handler_id = menuitem1.connect("clicked", self.on_clicked)Definizione di una funzione di callback:def callback_func(widget, event, callback_data ):Metodi sugli eventi:def disconnect(handler_id)def handler_disconnect(handler_id)def handler_is_connected(handler_id)def handler_block(handler_id)def handler_unblock(handler_id) Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEI componenti Tree e List (GTKTreeViews) definiti nella GUI GLADE nonvisualizzano nulla finchè non viene associato loro un modelUn GTKTreeView è disegnato secondo il classico modello MVC edaccetta come model uno dei seguenti widget GTK+GtkListStore, GtkTreeStore, GtkTreeModelSort,GtkGenericTreeModelUn GTKTreeView dispone di widget destinati a disegnare elementispecifici della viewGtkTreeViewColumnGtkCellRenderer, GtkCellRendererText,GtkCellRendererToggle, ecc... Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADE#Get the reference to a GLADE widgetself.searchTree = self.pytorrent.get_widget("searchTree")self.addSearchTreeHeader("Name", 0)self.addSearchTreeHeader("Seeds", 1)self.addSearchTreeHeader("Leeches", 2)self.addSearchTreeHeader("Size", 3)#Create a list modelself.searchList = gtk.ListStore(str, str, str, str)#Set the model to the viewself.searchTree.set_model(self.searchList)#Draw the list view headerdef addSearchTreeHeader(self, title, columnId): column = gtk.TreeViewColumn(title, gtk.CellRendererText(), text=columnId) column.set_resizable(True) column.set_sort_column_id(columnId) self.searchTree.append_column(column) Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEUn po di sano codice Python...import urllibfrom sgmllib import SGMLParser#A class to parse <a href> tags inside a docclass HREFParser(SGMLParser): def reset(self): SGMLParser.reset(self) self.urls = [] def start_a(self, attrs): href = [v for k, v in attrs if k==href] if href: self.urls.extend(href) Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADE#Event handler for search buttondef torrentSearch_clicked(self, widget): #get the search text self.searchTextField = self.pytorrent.get_widget("seacrhTextField") searchText = self.searchTextField.get_text() urlConn = urllib.urlopen("http://btjunkie.org/search?q="+searchText) hrefParser = HREFParser() hrefParser.feed(urlConn.read()) hrefParser.close() urlConn.close() for url in hrefParser.urls: if url.endswith(".torrent"): print url to be continued.... Giovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEGiovanni Marigi -gio.marigi[at]gmail.com –
  • PyGTK GLADEGiovanni Marigi -gio.marigi[at]gmail.com –