如何使Gtk +(Python 3.4)FileChooserDialog中的文件名/路径可全局访问

问题描述 投票:1回答:2

[我有一些代码使用Python 3.4中的Gtk + FileChooserDialog来允许用户选择文件。

然后,应该(显然)关闭对话框并继续执行用户选择文件后的代码。但是,发生的情况是用户选择了他们的文件,并且代码继续执行,但是对话框并没有像应有的那样消失。

我以前曾遇到过这个问题,我们已经弄清楚了为什么会发生此问题并解决了它,但现在又又发生了,尽管我知道是什么原因,但我不知道如何真正解决它。

这是我的代码:

from gi.repository import Gtk

class FileChooser():

    def __init__(self):

        global path

        dia = Gtk.FileChooserDialog("Please choose a file", None,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

        self.add_filters(dia)

        response = dia.run()

        if response == Gtk.ResponseType.OK:
            print("Open clicked")
            print("File selected: " + dia.get_filename())
            path = dia.get_filename()
        elif response == Gtk.ResponseType.CANCEL:
            print("Cancel clicked")

        dia.destroy()

    def add_filters(self, dia):
        filter_any = Gtk.FileFilter()
        filter_any.set_name("Any files")
        filter_any.add_pattern("*")
        dia.add_filter(filter_any)

        filter_text = Gtk.FileFilter()
        filter_text.set_name('Text files')
        filter_text.add_mime_type('text/plain')
        dia.add_filter(filter_text)

        filter_py = Gtk.FileFilter()
        filter_py.set_name('Python files')
        filter_py.add_mime_type('text/x-python')
        dia.add_filter(filter_py)

        filter_img = Gtk.FileFilter()
        filter_img.set_name('Image')
        filter_img.add_mime_type('image/*')
        dia.add_filter(filter_img)

dialog = FileChooser()

# path variable will be used after this point

这里的问题是,由于我不知道的原因,如果我在global path类的FileChooser()函数中具有__init__()声明,该对话框将不会消失。

如果删除global path声明,对话框将消失,但是稍后当我尝试访问NameError: name 'path' is not defined变量时在程序中出现了path

我也尝试在程序开始时将path设置为全局,但是我仍然收到NameError。

如何使此变量在以后的程序中访问,同时仍然使对话框消失,该怎么办?

我有一些代码使用Python 3.4中的Gtk + FileChooserDialog来允许用户选择文件。然后,应该关闭对话框(显然)并继续执行代码...

python gtk gtk3 filechooser
2个回答
4
投票

path变量视为FileChooser()的实例。它提供了逻辑上的终点,以使代表FileChooser()的对话框访问路径。


0
投票

小注:self.path必须重命名为self.fpath之类的,因为每个gtk小部件都已经具有路径属性。

© www.soinside.com 2019 - 2024. All rights reserved.