Blame platform-demos/cs/filechooserdialog.py.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="filechooserdialog.py" xml:lang="cs">
Packit 1470ea
  <info>
Packit 1470ea
    <title type="text">FileChooserDialog (Python)</title>
Packit 1470ea
    <link type="guide" xref="beginner.py#file-selectors"/>
Packit 1470ea
    <link type="seealso" xref="gmenu.py"/>
Packit 1470ea
    <link type="seealso" xref="toolbar_builder.py"/>
Packit 1470ea
    <link type="seealso" xref="textview.py"/>
Packit 1470ea
    <link type="next" xref="combobox.py"/>
Packit 1470ea
    <revision version="0.1" date="2012-08-14" status="draft"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Marta Maria Casetti</name>
Packit 1470ea
      <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <desc>Dialogové okno vhodné pro příkazy „Otevřít“ a „Uložit“</desc>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>FileChooserDialog</title>
Packit 1470ea
  <media type="image" mime="image/png" src="media/filechooserdialog_save.png"/>
Packit 1470ea
  

Tento FileChooserDialog ukládá textové dokumenty, které mohou být otevřeny nebo napsány od nuly v TextView (viz dále).

Packit 1470ea
  <media type="image" mime="image/png" src="media/filechooserdialog_menu.png"/>
Packit 1470ea
  

Je také možné zavolat FileChooserDialog pro otevření nového dokumentu.

Packit 1470ea
Packit 1470ea
  <links type="sections"/>
Packit 1470ea
  
Packit 1470ea
  <section id="overview">
Packit 1470ea
  <title>Kroky k reprodukci příkladu</title>
Packit 1470ea
  <steps>
Packit 1470ea
    <item>

Vytvořte soubor .ui, který bude popisovat aplikační nabídku s položkami „New“, „Open“, „Save“, „Save As“ a „Quit“. To můžete udělat v Glade nebo v textovém editoru. Viz <link xref="#xml"/>.

</item>
Packit 1470ea
    <item>

Vytvořte program v jazyce Python pro Gtk.TextView s Gtk.Buffer self.buffer a self.file, což bude Gio.File nastavený na počátku na None.

</item>
Packit 1470ea
    <item>

V tomto programu vytvoříme také akce odpovídající položkám v aplikační nabídce, napojíme je na funkce zpětného volání a naimportujeme nabídku pomocí metody do_startup() třídy Gtk.Builder.

</item>
Packit 1470ea
    <item>

Akce <gui>New</gui> a <gui>Quit</gui> a jejich funkce zpětného volání jsou velmi jednoduché, viz <link xref="#code"/>. Podrobnější vysvětlení signálů a funkcí zpětného volání najdete v <link xref="signals-callbacks.py"/>.

</item>
Packit 1470ea
    <item>

Zpětné volání akce <gui>Open</gui> by mělo vytvořit a otevřít Gtk.FileChooserDialog pro otevření souboru. Toto dialogové okno je napojeno na jiné funkce zpětného volání, jednu pro tlačítko <gui>Open</gui> a druhou pro tlačítko <gui>Cancel</gui> dialogového okna.

</item>
Packit 1470ea
    <item>

Akce <gui>Save as</gui> funguje podobně jako <gui>Open</gui>, akorát funkce zpětného volání pro tlačítko <gui>Save</gui> závisí na mnohem komplexnější metodě save_to_file().

</item>
Packit 1470ea
    <item>

Akci <gui>Save</gui> lze zúžit na případ, kdy soubor je None, což je případ, kdy self.file je nový soubor, a tím pádem to změníme na akci <gui>Save as</gui>, a případ, kdy soubor není None, což se zúží na save_to_file().

</item>
Packit 1470ea
    <item>

A nakonec metoda save_to_file(): viz <link xref="#code"/>, řádky 146 – 175.

</item>
Packit 1470ea
  </steps>
Packit 1470ea
  </section>
Packit 1470ea
  
Packit 1470ea
  <section id="xml">
Packit 1470ea
  <title>Soubor XML, který vytváří nabídku aplikace</title>
Packit 1470ea
  <?xml version="1.0"?>
Packit 1470ea
<interface>
Packit 1470ea
  <menu id="appmenu">
Packit 1470ea
    <section>
Packit 1470ea
      <item>
Packit 1470ea
        <attribute name="label">New</attribute>
Packit 1470ea
        <attribute name="action">win.new</attribute>
Packit 1470ea
      </item>
Packit 1470ea
      <item>
Packit 1470ea
        <attribute name="label">Open</attribute>
Packit 1470ea
        <attribute name="action">win.open</attribute>
Packit 1470ea
      </item>
Packit 1470ea
    </section>
Packit 1470ea
    <section>
Packit 1470ea
      <item>
Packit 1470ea
        <attribute name="label">Save</attribute>
Packit 1470ea
        <attribute name="action">win.save</attribute>
Packit 1470ea
      </item>
Packit 1470ea
      <item>
Packit 1470ea
        <attribute name="label">Save As...</attribute>
Packit 1470ea
        <attribute name="action">win.save-as</attribute>
Packit 1470ea
      </item>
Packit 1470ea
    </section>
Packit 1470ea
    <section>
Packit 1470ea
      <item>
Packit 1470ea
        <attribute name="label">Quit</attribute>
Packit 1470ea
        <attribute name="action">app.quit</attribute>
Packit 1470ea
      </item>
Packit 1470ea
    </section>
Packit 1470ea
  </menu>
Packit 1470ea
</interface>
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
  
Packit 1470ea
  <section id="code">
Packit 1470ea
  <title>Kód použitý k vygenerování tohoto příkladu</title>
Packit 1470ea
  from gi.repository import Gtk
Packit 1470ea
from gi.repository import Gdk
Packit 1470ea
from gi.repository import Gio
Packit 1470ea
from gi.repository import GObject
Packit 1470ea
import sys
Packit 1470ea
Packit 1470ea
Packit 1470ea
class MyWindow(Gtk.ApplicationWindow):
Packit 1470ea
Packit 1470ea
    def __init__(self, app):
Packit 1470ea
        Gtk.Window.__init__(
Packit 1470ea
            self, title="FileChooserDialog Example", application=app)
Packit 1470ea
        self.set_default_size(400, 400)
Packit 1470ea
Packit 1470ea
        # Akce pro nabídku okna, napojí se na funkci zpětného volání
Packit 1470ea
        new_action = Gio.SimpleAction.new("new", None)
Packit 1470ea
        new_action.connect("activate", self.new_callback)
Packit 1470ea
        self.add_action(new_action)
Packit 1470ea
Packit 1470ea
        open_action = Gio.SimpleAction.new("open", None)
Packit 1470ea
        open_action.connect("activate", self.open_callback)
Packit 1470ea
        self.add_action(open_action)
Packit 1470ea
Packit 1470ea
        save_action = Gio.SimpleAction.new("save", None)
Packit 1470ea
        save_action.connect("activate", self.save_callback)
Packit 1470ea
        self.add_action(save_action)
Packit 1470ea
Packit 1470ea
        save_as_action = Gio.SimpleAction.new("save-as", None)
Packit 1470ea
        save_as_action.connect("activate", self.save_as_callback)
Packit 1470ea
        self.add_action(save_as_action)
Packit 1470ea
Packit 1470ea
        # Soubor
Packit 1470ea
        self.file = None
Packit 1470ea
Packit 1470ea
        # TextView s vyrovnávací pamětí
Packit 1470ea
        self.buffer = Gtk.TextBuffer()
Packit 1470ea
        textview = Gtk.TextView(buffer=self.buffer)
Packit 1470ea
        textview.set_wrap_mode(Gtk.WrapMode.WORD)
Packit 1470ea
Packit 1470ea
        # Okno s posuvníky pro TextView
Packit 1470ea
        self.scrolled_window = Gtk.ScrolledWindow()
Packit 1470ea
        self.scrolled_window.set_policy(
Packit 1470ea
            Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
Packit 1470ea
        self.scrolled_window.add(textview)
Packit 1470ea
        self.scrolled_window.set_border_width(5)
Packit 1470ea
Packit 1470ea
        # Přidá okno s posuvníky do okna
Packit 1470ea
        self.add(self.scrolled_window)
Packit 1470ea
Packit 1470ea
    # Zpětné volání pro "new"
Packit 1470ea
    def new_callback(self, action, parameter):
Packit 1470ea
        self.buffer.set_text("")
Packit 1470ea
        print("New file created")
Packit 1470ea
Packit 1470ea
    # Zpětné volání pro "open"
Packit 1470ea
    def open_callback(self, action, parameter):
Packit 1470ea
        # Vytvoří FileChooserDialog pro otevření
Packit 1470ea
        # argumenty jsou: název okna, rodičovské okno, akce,
Packit 1470ea
        # (tlačítka, odpověď)
Packit 1470ea
        open_dialog = Gtk.FileChooserDialog("Pick a file", self,
Packit 1470ea
                                            Gtk.FileChooserAction.OPEN,
Packit 1470ea
                                           (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Packit 1470ea
                                            Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT))
Packit 1470ea
Packit 1470ea
        # Lze vybírat nejen místní soubory
Packit 1470ea
        open_dialog.set_local_only(False)
Packit 1470ea
        # Dialogové okno bude vždy nad oknem s TextView
Packit 1470ea
        open_dialog.set_modal(True)
Packit 1470ea
        # Napojí dialogové okno na funci zpětného volání open_response_cb()
Packit 1470ea
        open_dialog.connect("response", self.open_response_cb)
Packit 1470ea
        # Zobrazí dialogové okno
Packit 1470ea
        open_dialog.show()
Packit 1470ea
Packit 1470ea
    # Funkce zpětného volání pro dialogové okno open_dialog
Packit 1470ea
    def open_response_cb(self, dialog, response_id):
Packit 1470ea
        open_dialog = dialog
Packit 1470ea
        # Pokud odpověď je "ACCEPT" (bylo kliknuto na tlačítko "Open")
Packit 1470ea
        if response_id == Gtk.ResponseType.ACCEPT:
Packit 1470ea
            # self.file je soubor, který jsme od FileChooserDialog dostali
Packit 1470ea
            self.file = open_dialog.get_file()
Packit 1470ea
            # Prázdný řetězec (prozatímně)
Packit 1470ea
            content = ""
Packit 1470ea
            try:
Packit 1470ea
                # Načte obsah souboru do paměti
Packit 1470ea
                # success: pravdivostní hodnota závisející na úspěchu operace
Packit 1470ea
                # content: obsah
Packit 1470ea
                # etags: je značka entity (může být použit k rychlému určení, jestli
Packit 1470ea
                # byl soubor změněn vůči verzi v souborovém systému)
Packit 1470ea
                [success, content, etags] = self.file.load_contents(None)
Packit 1470ea
            except GObject.GError as e:
Packit 1470ea
                print("Error: " + e.message)
Packit 1470ea
            # Nastaví obsah jako text do vyrovnávací paměti
Packit 1470ea
            self.buffer.set_text(content, len(content))
Packit 1470ea
            print("opened: " + open_dialog.get_filename())
Packit 1470ea
        # Pokud odpověď je "CANCEL" (vylo kliknuto na tlačítko "Cancel")
Packit 1470ea
        elif response_id == Gtk.ResponseType.CANCEL:
Packit 1470ea
            print("cancelled: FileChooserAction.OPEN")
Packit 1470ea
        # Zlikviduje FileChooserDialog
Packit 1470ea
        dialog.destroy()
Packit 1470ea
Packit 1470ea
    # Funkce zpětného volání pro "save_as"
Packit 1470ea
    def save_as_callback(self, action, parameter):
Packit 1470ea
        # Vytvoří FileChooserDialog pro uložení
Packit 1470ea
        # argumenty jsou: název okna, rodičovské okno, akce,
Packit 1470ea
        # (tlačítka, odpověď)
Packit 1470ea
        save_dialog = Gtk.FileChooserDialog("Pick a file", self,
Packit 1470ea
                                            Gtk.FileChooserAction.SAVE,
Packit 1470ea
                                           (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Packit 1470ea
                                            Gtk.STOCK_SAVE, Gtk.ResponseType.ACCEPT))
Packit 1470ea
        # Pokud uživatel zadá název souboru, který již existuje, zobrazí dialogové okno
Packit 1470ea
        # dotaz na potvrzení
Packit 1470ea
        save_dialog.set_do_overwrite_confirmation(True)
Packit 1470ea
        # Dialogové okno bude vždy nad oknem s TextView
Packit 1470ea
        save_dialog.set_modal(True)
Packit 1470ea
        # Pokud byl self.file již uložen
Packit 1470ea
        if self.file is not None:
Packit 1470ea
            try:
Packit 1470ea
                # Nastaví self.file jako aktuální název do výběru souboru
Packit 1470ea
                save_dialog.set_file(self.file)
Packit 1470ea
            except GObject.GError as e:
Packit 1470ea
                print("Error: " + e.message)
Packit 1470ea
        # Napojí dialogové okno na funkci zpětného volání save_response_cb()
Packit 1470ea
        save_dialog.connect("response", self.save_response_cb)
Packit 1470ea
        # Zobrazí dialogové okno
Packit 1470ea
        save_dialog.show()
Packit 1470ea
Packit 1470ea
    # Funkce zpětného volání pro dialogové okno save_dialog
Packit 1470ea
    def save_response_cb(self, dialog, response_id):
Packit 1470ea
        save_dialog = dialog
Packit 1470ea
        # Pokud odpověď je "ACCEPT" (bylo kliknuto na tlačítko "Save")
Packit 1470ea
        if response_id == Gtk.ResponseType.ACCEPT:
Packit 1470ea
            # self.file je aktuálně vybraný soubor
Packit 1470ea
            self.file = save_dialog.get_file()
Packit 1470ea
            # Uloží do souboru (viz níže)
Packit 1470ea
            self.save_to_file()
Packit 1470ea
        # Pokud odpověď je "CANCEL" (bylo kliknuto na tlačítko "Cancel")
Packit 1470ea
        elif response_id == Gtk.ResponseType.CANCEL:
Packit 1470ea
            print("cancelled: FileChooserAction.SAVE")
Packit 1470ea
        # Zlikviduje FileChooserDialog
Packit 1470ea
        dialog.destroy()
Packit 1470ea
Packit 1470ea
    # Funkce zpětného volání pro uložení
Packit 1470ea
    def save_callback(self, action, parameter):
Packit 1470ea
        # Pokud tam self.file zatím není
Packit 1470ea
        if self.file is not None:
Packit 1470ea
            self.save_to_file()
Packit 1470ea
        # self.file je nový soubor
Packit 1470ea
        else:
Packit 1470ea
            # Použije save_as
Packit 1470ea
            self.save_as_callback(action, parameter)
Packit 1470ea
Packit 1470ea
    # Uložení do souboru
Packit 1470ea
    def save_to_file(self):
Packit 1470ea
        # Získá obsah vyrovnávací paměti, bez skrytých znaků
Packit 1470ea
        [start, end] = self.buffer.get_bounds()
Packit 1470ea
        current_contents = self.buffer.get_text(start, end, False)
Packit 1470ea
        # Pokud je nějaký obsah
Packit 1470ea
        if current_contents != "":
Packit 1470ea
            # Nastaví obsah jako obsah souboru self.file
Packit 1470ea
            # argumenty: obsah, značka entity, vytvořit zálohu?, příznaky, GError
Packit 1470ea
            try:
Packit 1470ea
                self.file.replace_contents(current_contents,
Packit 1470ea
                                           None,
Packit 1470ea
                                           False,
Packit 1470ea
                                           Gio.FileCreateFlags.NONE,
Packit 1470ea
                                           None)
Packit 1470ea
                print("saved: " + self.file.get_path())
Packit 1470ea
            except GObject.GError as e:
Packit 1470ea
                print("Error: " + e.message)
Packit 1470ea
        # Pokud je obsah prázdný
Packit 1470ea
        else:
Packit 1470ea
            # Vytvoří (když soubor neexistuje) nebo přepíše soubor v režimu zápisu
Packit 1470ea
            # argumenty: značka entity, vytvořit zálohu?, příznaky, GError
Packit 1470ea
            try:
Packit 1470ea
                self.file.replace_readwrite(None,
Packit 1470ea
                                            False,
Packit 1470ea
                                            Gio.FileCreateFlags.NONE,
Packit 1470ea
                                            None)
Packit 1470ea
                print("saved: " + self.file.get_path())
Packit 1470ea
            except GObject.GError as e:
Packit 1470ea
                print("Error: " + e.message)
Packit 1470ea
Packit 1470ea
Packit 1470ea
class MyApplication(Gtk.Application):
Packit 1470ea
Packit 1470ea
    def __init__(self):
Packit 1470ea
        Gtk.Application.__init__(self)
Packit 1470ea
Packit 1470ea
    def do_activate(self):
Packit 1470ea
        win = MyWindow(self)
Packit 1470ea
        win.show_all()
Packit 1470ea
Packit 1470ea
    def do_startup(self):
Packit 1470ea
        Gtk.Application.do_startup(self)
Packit 1470ea
Packit 1470ea
        # Akce "quit" aplikace, napojí se na funkci zpětného volání
Packit 1470ea
        quit_action = Gio.SimpleAction.new("quit", None)
Packit 1470ea
        quit_action.connect("activate", self.quit_callback)
Packit 1470ea
        self.add_action(quit_action)
Packit 1470ea
Packit 1470ea
        # Získá nabídku ze souboru s UI pomocí Builderu
Packit 1470ea
        builder = Gtk.Builder()
Packit 1470ea
        try:
Packit 1470ea
            builder.add_from_file("filechooserdialog.ui")
Packit 1470ea
        except:
Packit 1470ea
            print("file not found")
Packit 1470ea
            sys.exit()
Packit 1470ea
        menu = builder.get_object("appmenu")
Packit 1470ea
        self.set_app_menu(menu)
Packit 1470ea
Packit 1470ea
    # Funkce zpětného volání pro "quit"
Packit 1470ea
    def quit_callback(self, action, parameter):
Packit 1470ea
        self.quit()
Packit 1470ea
Packit 1470ea
app = MyApplication()
Packit 1470ea
exit_status = app.run(sys.argv)
Packit 1470ea
sys.exit(exit_status)
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
  
Packit 1470ea
  <section id="methods">
Packit 1470ea
  <title>Užitečné metody pro FileChooserDialog</title>
Packit 1470ea
    

Poznamenejme, že akce u dialogového okna pro výběr souboru může být některá z následujících: Gtk.FileChooserAction.OPEN (umožní uživateli jen vybrat existující soubor) Gtk.FileChooserAction.SAVE (umožní uživateli vybrat existující soubor nebo napsat název nového), Gtk.FileChooserAction.SELECT_FOLDER (umožní uživateli jen vybrat existující složku), Gtk.FileChooserAction.CREATE_FOLDER (umožní uživateli vybrat existující složku nebo napsat název nové).

Packit 1470ea
    

Mimo metod použitých v <link xref="#code"/>, máme:

Packit 1470ea
    <list>
Packit 1470ea
      <item>

set_show_hidden(True) se používá k zobrazení skrytých souborů a složek.

</item>
Packit 1470ea
      <item>

set_select_multiple(True) nastavuje možnost vybrat více souborů naráz. To má význam jen v případě, že režim je Gtk.FileChooserAction.OPEN nebo Gtk.FileChooserAction.SELECT_FOLDER.

</item>
Packit 1470ea
      <item>

V dialogovém okně <gui>Uložení jako</gui> funkce set_current_name(aktuální_název) nastavuje ve výběru souboru aktuální_název, jako by jej zadal uživatel. aktuální_název může být něco jako Untitled.txt. Tato metoda by se neměla používat jinde než pro „Uložit jako“.

</item>
Packit 1470ea
      <item>

Výchozí aktuální složkou jsou nedávné položky. Pro nastavení jiné složky použijte set_current_folder_uri(uri). Upozorňujeme ale, že tuto metodu byste měli použít, a přimět tím výběr souboru zobrazit zadanou složku, jen když provádíte „Uložit jako“ a máte již soubor někde uložený.

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="references">
Packit 1470ea
  <title>Odkazy k API</title>
Packit 1470ea
  

V této ukázce se používá následující:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkFileChooserDialog.html">GtkFileChooserDialog</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkFileChooser.html">GtkFileChooser</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkWindow.html">GtkWindow</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkTextView.html">GtkTextView</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkTextBuffer.html">GtkTextBuffer</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkScrolledWindow.html">GtkScrolledWindow</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gio/stable/GFile.html">GFile</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gio/stable/GSimpleAction.html">GSimpleAction</link>

</item>
Packit 1470ea
    <item>

<link href="http://developer.gnome.org/gtk3/stable/GtkBuilder.html">GtkBuilder</link>

</item>
Packit 1470ea
  </list>
Packit 1470ea
  </section>
Packit 1470ea
</page>