Если я устанавливаю текущую папку с помощью метода Gtk.FileChooserWidget.set_current_folder(), то при первом открытии средства выбора файлов он открывается в месте, используемом в качестве аргумента для set_current_folder()

Но, если я выбираю файл, то я снова открываю средство выбора файла, оно открывается в "most_recent_used_files".

Я бы хотел, чтобы он открывался по пути к папке последнего выбранного файла.

Как это сделать?

Спасибо.

3
Irr 4 Фев 2013 в 12:42

2 ответа

Лучший ответ

Из документов:

В старых версиях документации для выбора файлов предлагалось использовать gtk_file_chooser_set_current_folder () в различных ситуациях, чтобы приложение могло предложить разумную папку по умолчанию. Это больше не считается хорошей политикой, так как теперь средство выбора файлов может самостоятельно делать хорошие предложения. В общем, вы должны заставить средство выбора файлов показывать определенную папку, когда уместно использовать gtk_file_chooser_set_filename () - т.е. когда вы выполняете команду File / Save As, и у вас уже есть файл, сохраненный где-то.

Вам может понравиться или не понравиться обоснование такого поведения. Если вам интересно, как это произошло, см. файл. выберите недавние файлы в списке рассылки и Помогите пользователю выбрать место для размещения нового файла в вики GNOME.

3
Micah Carrick 5 Фев 2013 в 15:19

Настройка текущей папки каждый раз работает для меня, но это немного сложно. Я использую Gtk 3.14 и Python 2.7.

Вы должны получить имя файла перед сбросом каталога, или он утерян, и текущим каталогом может быть None, поэтому вы должны проверить это.

Этот код протестирован на Debian Jessie и Windows 7.

import os.path as osp

from gi.repository import Gtk

class FileDialog(Gtk.FileChooserDialog):
    def __init__(self, parent, title):
        Gtk.FileChooserDialog.__init__(self, title, parent)
        self.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL)
        self.add_button(Gtk.STOCK_OPEN, Gtk.ResponseType.OK)

        self.set_current_folder(osp.abspath('.'))

    def __call__(self):
        resp = self.run()
        self.hide()

        fname = self.get_filename()

        d = self.get_current_folder()
        if d:
            self.set_current_folder(d)

        if resp == Gtk.ResponseType.OK:
            return fname
        else:
            return None

class TheApp(Gtk.Window):
    def on_clicked(self, w, dlg):
        fname = dlg()
        print fname if fname else 'canceled'

    def __init__(self):
        Gtk.Window.__init__(self)

        self.connect('delete_event', Gtk.main_quit)
        self.set_resizable(False)

        dlg = FileDialog(self, 'Your File Dialog, Sir.')
        btn = Gtk.Button.new_with_label('click here')
        btn.connect('clicked', self.on_clicked, dlg)

        self.add(btn)
        btn.show()

if __name__ == '__main__':
    app = TheApp()
    app.show()
    Gtk.main()
1
sfaleron 7 Фев 2015 в 16:13