Skip to main content
 首页 » 编程设计

python之PyGTK:gtk.FileChooserButton 显示的文件夹与 gtk.FileChooserButton.get_current_folder() 不同

2025年05月04日9cloudgamer

我在 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() 

请您参考如下方法:

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

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

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