GTK3 – Dialogs

4
Le finestre di dialogo, sia quelle di sistema che quelle personali, fatte al volo.

Finestre di dialogo personali

Ovvero custom dialogs. Possono (in genere sono) modali, cioè gli devi dare retta.

Oggetti Dialog

class Gtk.Dialog([title[, parent[, flags[, buttons]]])
crea un nuovo Gtk.Dialog con il titolo title e appartenente a parent. flag può essere usata per renderlo modale con Gtk.DialogFlags.MODAL e/o transiente che viene distrutto alla chiusura con Gtk.DialogFlags.DESTROY_WITH_PARENT. buttons è una tupla, vedi add_button().

get_content_area()
ritorna il content area (che non so cosa sia).

add_button(button_text, response_id)
aggiunge un pulsante con il testo button_text o uno stock button se button_text è uno stock item e setta la risposta con il segnale dato da response_id. Il pulsante è aggiunto in fondo all’area del dialogo.
response_id può essere in intero o uno dei valori predefiniti da Gtk.ResponseType:

  • Gtk.ResponseType.NONE
  • Gtk.ResponseType.REJECT
  • Gtk.ResponseType.ACCEPT
  • Gtk.ResponseType.DELETE_EVENT
  • Gtk.ResponseType.OK
  • Gtk.ResponseType.CANCEL
  • Gtk.ResponseType.CLOSE
  • Gtk.ResponseType.YES
  • Gtk.ResponseType.NO
  • Gtk.ResponseType.APPLY
  • Gtk.ResponseType.HELP

add_buttons(button_text, response_id[, ...])
aggiunge più pulsanti tutti in una volta, equivalente a una serie di add_button(). Le coppie testo e risposta sono passati individualmente, esempio:
dialog.add_buttons(Gtk.STOCK_OPEN, 42, "Close", Gtk.ResponseType.CLOSE)

set_modal(is_modal)
definisce se il pulsante è modale.

run()
blocca il dialogo finché ottiene un segnale o è distrutto; dubbi qui.

#!/usr/bin/python3

# d0.py

from gi.repository import Gtk

class DialogExample(Gtk.Dialog):

    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OK, Gtk.ResponseType.OK))

        self.set_default_size(150, 100)

        label = Gtk.Label("This is a dialog to display additional information")

        box = self.get_content_area()
        box.add(label)
        self.show_all()

class DialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Dialog Example")

        self.set_border_width(6)

        button = Gtk.Button("Open dialog")
        button.connect("clicked", self.on_button_clicked)

        self.add(button)

    def on_button_clicked(self, widget):
        dialog = DialogExample(self)
        response = dialog.run()

        if response == Gtk.ResponseType.OK:
            print("The OK button was clicked")
        elif response == Gtk.ResponseType.CANCEL:
            print("The Cancel button was clicked")

        dialog.destroy()

win = DialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

d0

MessageDialog

classe per creare velocemente finestre di dialogo con un testo, un’icona e pulsanti di risposta. È possibile avere testo in grassetto seguito da testo secondario, normale con Gtk.MessageDialog.format_secondary_text().

class Gtk.MessageDialog([parent[, flags[, message_type[, buttons, [message_format]]]])
message_type può essere uno dei seguenti valori:

  • Gtk.MessageType.INFO: Informational message
  • Gtk.MessageType.WARNING: Non-fatal warning message
  • Gtk.MessageType.QUESTION: Question requiring a choice
  • Gtk.MessageType.ERROR: Fatal error message
  • Gtk.MessageType.OTHER: None of the above, doesn’t get an icon

i pulsanti possono essere:

  • Gtk.ButtonsType.NONE: no buttons at all
  • Gtk.ButtonsType.OK: an OK button
  • Gtk.ButtonsType.CLOSE: a Close button
  • Gtk.ButtonsType.CANCEL: a Cancel button
  • Gtk.ButtonsType.YES_NO: Yes and No buttons
  • Gtk.ButtonsType.OK_CANCEL: OK and Cancel buttons

format_secondary_text(message_format)
setta il testo secondario, il precedente diventa neretto.

#!/usr/bin/python3

# d1.py

from gi.repository import Gtk

class MessageDialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="MessageDialog Example")

        box = Gtk.Box(spacing=6)
        self.add(box)

        button1 = Gtk.Button("Information")
        button1.connect("clicked", self.on_info_clicked)
        box.add(button1)

        button2 = Gtk.Button("Error")
        button2.connect("clicked", self.on_error_clicked)
        box.add(button2)

        button3 = Gtk.Button("Warning")
        button3.connect("clicked", self.on_warn_clicked)
        box.add(button3)

        button4 = Gtk.Button("Question")
        button4.connect("clicked", self.on_question_clicked)
        box.add(button4)

    def on_info_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO,
            Gtk.ButtonsType.OK, "This is an INFO MessageDialog")
        dialog.format_secondary_text(
            "And this is the secondary text that explains things.")
        dialog.run()
        print("INFO dialog closed")

        dialog.destroy()

    def on_error_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.ERROR,
            Gtk.ButtonsType.CANCEL, "This is an ERROR MessageDialog")
        dialog.format_secondary_text(
            "And this is the secondary text that explains things.")
        dialog.run()
        print("ERROR dialog closed")

        dialog.destroy()

    def on_warn_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.WARNING,
            Gtk.ButtonsType.OK_CANCEL, "This is an WARNING MessageDialog")
        dialog.format_secondary_text(
            "And this is the secondary text that explains things.")
        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            print("WARN dialog closed by clicking OK button")
        elif response == Gtk.ResponseType.CANCEL:
            print("WARN dialog closed by clicking CANCEL button")

        dialog.destroy()

    def on_question_clicked(self, widget):
        dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION,
            Gtk.ButtonsType.YES_NO, "This is an QUESTION MessageDialog")
        dialog.format_secondary_text(
            "And this is the secondary text that explains things.")
        response = dialog.run()
        if response == Gtk.ResponseType.YES:
            print("QUESTION dialog closed by clicking YES button")
        elif response == Gtk.ResponseType.NO:
            print("QUESTION dialog closed by clicking NO button")

        dialog.destroy()

win = MessageDialogWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

d10

FileChooserDialog

usato per File/Open e File/Save.
Per selezionare File/Apri usare Gtk.FileChooserAction.OPEN; per salvare Gtk.FileChooserAction.SAVE con Gtk.FileChooser.set_current_name() per il nome corrente e Gtk.FileChooser.set_filename() per uno diverso.
Per selezionare una cartella usare Gtk.FileChooserAction.SELECT_FOLDER.

La risposata sarà:

  • Gtk.ResponseType.ACCEPT
  • Gtk.ResponseType.OK
  • Gtk.ResponseType.YES
  • Gtk.ResponseType.APPLY

Alla fine si può usare Gtk.FileChooser.get_filename() o Gtk.FileChooser.get_uri(). Per default assetta una sola selezione ma si può modificare con  Gtk.FileChooser.set_select_multiple() e recuperare la lista con  Gtk.FileChooser.get_filenames() o Gtk.FileChooser.get_uris().

Gtk.FileChooser permette inoltre ulteriori configurazioni:

  • Gtk.FileChooser.set_local_only(): Only local files can be selected.
  • Gtk.FileChooser.show_hidden(): Hidden files and folders are displayed.
  • Gtk.FileChooser.set_do_overwrite_confirmation(): If the file chooser was configured in Gtk.FileChooserAction.SAVE mode, it will present a confirmation dialog if the user types a file name that already exists.

Inoltre è possibile stabilire il tipo di file con Gtk.FileChooser.add_filter().

Oggetti FileChooser

class Gtk.FileChooserDialog([title[, parent[, action[, buttons]]])
crea un nuovo dialogo, action può essere una delle seguenti:

  • Gtk.FileChooserAction.OPEN: The file chooser will only let the user pick an existing file.
  • Gtk.FileChooserAction.SAVE: The file chooser will let the user pick an existing file, or type in a new filename.
  • Gtk.FileChooserAction.SELECT_FOLDER: The file chooser will let the user pick an existing folder.
  • Gtk.FileChooserAction.CREATE_FOLDER: The file chooser will let the user name an existing or new folder.

i pulsanti sono gli stessi di Gtk.Dialog.

class Gtk.FileChooser
ne elenco solo qualcuno.

set_select_multiple(select_multiple)
definisce la scelta multipla.

set_local_only(local_only)
solo i file locali possono essere selezionati.

set_show_hidden(show_hidden)
visualizzo i file nascosti?

set_do_overwrite_confirmation(do_overwrite_confirmation)
conferma per sovrascrittura con salva.

get_filename()
ritorna il nome per il file selezionato, usare get_filenames() per la scelta multipla.

get_uri()
per file non locali, usare get_uris() per la scelta multipla.

add_filter(filter)
aggiunge un filtro e solo quelli che passano il filtro possono essere selezionati.

class Gtk.FileFilter

set_name(name)
setta il nome del filtro come stringa visualizzata nel dialogo.

add_mime_type(mime_type)
aggiunge un tipo mime alla lista dei filtri.

add_pattern(pattern)
aggiunge una regola a un filtro (?).

#!/usr/bin/python3

# d2.py

from gi.repository import Gtk

class FileChooserWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="FileChooser Example")

        box = Gtk.Box(spacing=6)
        self.add(box)

        button1 = Gtk.Button("Choose File")
        button1.connect("clicked", self.on_file_clicked)
        box.add(button1)

        button2 = Gtk.Button("Choose Folder")
        button2.connect("clicked", self.on_folder_clicked)
        box.add(button2)

    def on_file_clicked(self, widget):
        dialog = Gtk.FileChooserDialog("Please choose a file", self,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

        self.add_filters(dialog)

        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            print("Open clicked")
            print("File selected: " + dialog.get_filename())
        elif response == Gtk.ResponseType.CANCEL:
            print("Cancel clicked")

        dialog.destroy()

    def add_filters(self, dialog):
        filter_text = Gtk.FileFilter()
        filter_text.set_name("Text files")
        filter_text.add_mime_type("text/plain")
        dialog.add_filter(filter_text)

        filter_py = Gtk.FileFilter()
        filter_py.set_name("Python files")
        filter_py.add_mime_type("text/x-python")
        dialog.add_filter(filter_py)

        filter_any = Gtk.FileFilter()
        filter_any.set_name("Any files")
        filter_any.add_pattern("*")
        dialog.add_filter(filter_any)

    def on_folder_clicked(self, widget):
        dialog = Gtk.FileChooserDialog("Please choose a folder", self,
            Gtk.FileChooserAction.SELECT_FOLDER,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             "Select", Gtk.ResponseType.OK))
        dialog.set_default_size(800, 400)

        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            print("Select clicked")
            print("Folder selected: " + dialog.get_filename())
        elif response == Gtk.ResponseType.CANCEL:
            print("Cancel clicked")

        dialog.destroy()

win = FileChooserWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

d20

Advertisements
Post a comment or leave a trackback: Trackback URL.

Commenti

  • Smithe7  On 18 agosto 2014 at 07:12

    Admiring the hard work you put into your site and detailed information you offer. It’s good to come across a blog every once in a while that isn’t the same unwanted rehashed material. Wonderful read! I’ve bookmarked your site and I’m adding your RSS feeds to my Google account. beekbcdfgdccdedf

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: