29 aprile, 2007

pygtk: un About Dialog con link cliccabile

Creare un about dialog con link di riferimento cliccabile è una di quelle cose che vediamo in molte applicazioni ma per la quale non è semplice trovare documentazione a riguardo.

Scoprire come fare per me non è stato semplicissimo e quindi ho pensato che una soluzione pronta potrebbe essere di aiuto a qualcuno.

Cosa stiamo per realizzare
Ciò che ci apprestiamo a realizzare è un dialogo di informazione come quello che potete vedere in figura:


Da notarsi che il link è cliccabile e cliccandoci sopra verrà aperto un browser che vi porterà guarda caso proprio a quell'indirizzo :) Le librerie gtk (e i rispettivi bindings per python) mettono a disposizione un apposito widget per creare i dialoghi di informazione. Il widget in questione permette di settare facilmente il nome dell'applicazione, la versione, gli autori, la licenza, i traduttori e altre cosette interessanti. Stranamente però non permette di impostare in modo altrettanto semplice un url che risponda al click del mouse. Per farlo è necessario utilizzare la funzione gtk.about_dialog_set_url_hook e indicare una callback da richiamare quando l'utente clicca sul link. La callback in questione dovrà poi occuparsi di creare un nuovo processo per lanciare il browser.


Il codice python



import gtk
import subprocess

def on_url(d, link, data):
subprocess.Popen(["firefox", "http://linubuntu.blogspot.com"])

gtk.about_dialog_set_url_hook(on_url, None)

def create_dialog():
dlg = gtk.AboutDialog()
dlg.set_version("0.1")
dlg.set_name("app")
dlg.set_license("Puoi fare di questo software quello che ti pare")
dlg.set_authors(["redgun"])
dlg.set_website("http://linubuntu.blogspot.com")
def close(w, res):
if res == gtk.RESPONSE_CANCEL:
w.hide()
dlg.connect("response", close)
return dlg

if __name__ == "__main__":
dlg = create_dialog()
dlg.run()


Ricordate che la finestra di dialogo di suo non risponde al click sul pulsante chiudi ma sarà necessario impostare una funzione di callback per il segnale response come nel codice.

5 commenti:

  1. non ti conviene utilizzare il modulo webbrowser?

    RispondiElimina
  2. Il modulo webbrowser purtroppo sembra avere alcuni problemi (o sbaglio io ad usarlo anche se non credo visto che è molto banale). Alcuni utenti di cGmail mi hanno riportato errori a causa del modulo webbrowser (in pratica il browser non apriva la pagina corretta che io avevo passato alla funzione webbrowser.open_new come semplice stringa costante)

    Per questo motivo non uso quel modulo.

    Inoltre il post voleva descrivere solo l'utilizzo dei link su un About Dialog.

    Naturalmente chi vuole usare questo modulo deve trovare un metodo migliore per aprire il browser in modo da aprire quello di default e non necessariamente firefox.

    Per fare ciò basta prelevare l'impostazione di default per il browser gnome da gconf con python ;)

    RispondiElimina
  3. Oh yeah, you just saved my day. I needed to know which signal I should handle if the close button is clicked -- and it's just "response". Then I just had to connect delete_event (if it's not being closed with the button) with dialog.hide(). Thanks a bunch!

    RispondiElimina
  4. Anonimo8:12 AM

    purtroppo in windows non funziona

    Traceback (most recent call last):
    File "C:\98unz\00application\00Python\_workspace\work\_examples\_gtk\_dialog\l01.py", line 5, in on_url
    subprocess.Popen(["firefox.exe", "http://www.velug.it"])
    File "C:\Python24\Lib\subprocess.py", line 542, in __init__
    errread, errwrite)
    File "C:\Python24\Lib\subprocess.py", line 706, in _execute_child
    startupinfo)
    WindowsError: [Errno 2] Impossibile trovare il file specificato

    RispondiElimina
  5. Su linux funziona correttamente perché in genere l'eseguibile firefox si trova nel path. Su windows dovresti specificare il path completo all'eseguibile firefox.exe che però potrebbe variare su macchine diverse

    RispondiElimina