【问题标题】:PyGTK: gtk.FileChooserButton shows folder not identical to gtk.FileChooserButton.get_current_folder()PyGTK:gtk.FileChooserButton 显示的文件夹与 gtk.FileChooserButton.get_current_folder() 不同
【发布时间】:2012-12-29 23:20:11
【问题描述】:

我在 Python 脚本中遇到了 gtk.FileChooserButton 的问题。如果您从按钮菜单中选择选项 ›Other ...‹,则会打开 gtk.FileChooserDialog,您可以在其中选择一个新文件夹。如果我通过双击选择这个新文件夹并通过单击 ›Open‹ 确认对话框,则所选文件夹名称显示在 gtk.FileChooserButton 中,并且 gtk.FileChooserButton.get_current_folder() 的值更改为所选文件夹的路径文件夹(您可以在示例的状态栏中看到)。这是预期的行为。

但是当我不是通过双击而是通过单击来选择新文件夹并通过单击 ›Open‹ 确认对话框时,所选文件夹名称显示在 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()

【问题讨论】:

    标签: python gtk pygtk filechooser


    【解决方案1】:

    您正在收听的信号,仅在文件选择器中的视图文件夹更改时发出,而不是在选择父文件夹中的文件夹时发出,get_current_folder() 也是如此,它会告诉您您是哪个文件夹'正在查看而不是您选择的。所以在你的代码中发生的事情是双击首先更改了当前文件夹,然后“按下”确定。

    FileChooserButtonfile-set 信号似乎更合适,尽管我不能 100% 确定您如何检查用户是否单击了任何按钮/退出了对话。要获得选择的内容,前提是您一次只允许选择一件事,您可以使用FileChooserget_filename()(或get_filenames(),如果您允许多选)。不幸的是,我无法测试解决方案,因为我在错误的计算机上,但它至少应该引导你朝着正确的方向前进。

    附带说明,当我需要对话并捕获它作为响应返回的内容(单击了什么按钮)然后使用get_filename() 时,我发现调用FileChooserDialog 中的run() 更容易。

    【讨论】:

    • 谢谢!将 get_current_folder() 更改为 get_filename() 就可以了。 YLSNED...
    • 很高兴它有帮助......也许你应该接受答案。
    【解决方案2】:

    如果您想要当前文件夹,最好监控 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多