PyGTK: gtk.FileChooserButton показывает папку, не идентичную gtk.FileChooserButton.get_current_folder()

У меня проблема с gtk.FileChooserButton в скрипте Python. Если вы выберете опцию ›Другое ...‹ в меню кнопок, откроется диалоговое окно gtk.FileChooserDialog, где вы сможете выбрать новую папку. Если я выберу эту новую папку, дважды щелкнув ее, и подтвержу диалоговое окно, нажав «Открыть», имя выбранной папки отобразится в gtk.FileChooserButton, а значение gtk.FileChooserButton.get_current_folder() изменится на путь к выбранной папке. папка (как вы можете видеть в строке состояния примера). Это ожидаемое поведение.

Но когда я выбираю новую папку не двойным щелчком, а только одним щелчком, и подтверждаю диалог, нажав «Открыть», имя выбранной папки отображается в gtk.FileChooserButton, а путь в gtk.FileChooserButton.get_current_folder () — это путь не к выбранной папке, а к ее родительской папке.

Это баг или ошибка в моем скрипте? Имя папки на кнопке всегда должно совпадать с именем gtk.FileChooserButton.get_current_folder(). Что здесь можно сделать? Спасибо.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import gtk, os

class MainClass(object):
    def __init__(self):
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_position(gtk.WIN_POS_CENTER)
        self.window.set_default_size(400, 100)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.set_border_width(6)
        self.vbox1 = gtk.VBox(False, 0)
        self.window.add(self.vbox1)

        self.filechooserdialog1 = gtk.FileChooserDialog("Select a folder…", None, gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        self.filechooserdialog1.set_default_response(gtk.RESPONSE_OK)
        self.filechooserbutton1 = gtk.FileChooserButton(self.filechooserdialog1)
        self.filechooserbutton1.set_current_folder(os.environ['HOME'])
        self.filechooserbutton1.connect('current-folder-changed', self.tell_folder)

        self.vbox1.pack_start(self.filechooserbutton1, True, False, 0)
        self.statusbar1 = gtk.Statusbar()
        self.vbox1.pack_start(self.statusbar1, False, False, 0)
        self.context_id = self.statusbar1.get_context_id("status")
        self.window.show_all()

    def tell_folder(self, data=None):
        self.statusbar1.push(self.context_id, self.filechooserbutton1.get_current_folder())

    def delete_event(self, widget, event, data=None):
        return False

    def destroy(self, data=None):
        gtk.main_quit()

    def main(self):
        gtk.main()

if __name__ == "__main__":
    MyApp = MainClass()
    MyApp.main()

person atarax    schedule 29.12.2012    source источник


Ответы (2)


Сигнал, который вы слушаете, излучается только при изменении папки просмотра в средстве выбора файлов, а не при выборе папки внутри родительской папки, то же самое касается get_current_folder(), он скорее скажет вам, какую папку вы просматриваете. чем вы выбрали. Итак, в вашем коде произошло то, что двойной щелчок сначала изменил текущую папку, а затем «нажал» «ОК».

Было бы более уместно слушать сигнал file-set FileChooserButton, хотя я не уверен на 100%, как вы проверяете, нажал ли пользователь какую-либо кнопку/вышел из диалога. Чтобы получить то, что выбрано, при условии, что вы разрешаете выбирать только одну вещь за раз, вы можете использовать get_filename() FileChooser (или get_filenames(), если вы разрешаете множественный выбор). К сожалению, я не могу протестировать решение, потому что я не на том компьютере, но оно, по крайней мере, должно привести вас в правильном направлении.

В качестве примечания, мне проще просто вызвать run() из FileChooserDialog, когда мне нужен диалог, и поймать, что он возвращает в качестве ответа (какая кнопка была нажата), а затем использовать get_filename().

person deinonychusaur    schedule 30.12.2012
comment
Спасибо! Замена get_current_folder() на get_filename() помогла. ИЛСНЕД... - person atarax; 30.12.2012
comment
Рад, что это помогло ... и, возможно, тогда вам следует принять ответ. - person deinonychusaur; 31.12.2012

Если вам нужна текущая папка, хорошо отслеживать сигнал current-folder-changed, тогда вы можете использовать get_current_folder в обратном вызове, но надежно только в обратном вызове. Вот достойный обходной путь.

def on_current_folder_changed(widget):
    widget._folder = widget.get_current_folder()

def on_file_set(widget):
    # Lock that value in.
    if widget.get_current_folder() != widget._folder:
        widget.set_current_folder(widget._folder)
person Stephen Fairchild    schedule 20.02.2013