如何使 filename/path 来自 Gtk+ (Python 3.4) FileChooserDialog 全局可访问

How to make filename/path from Gtk+ (Python 3.4) FileChooserDialog accessible globally

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

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

我以前遇到过这个问题,我们当时找出了它发生的原因并解决了它,但现在它又发生了,虽然我知道是什么原因造成的,但我不知道如何真正解决它。

这是我的代码:

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

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

如果我删除那个 global path 声明,对话框就会消失,但是当我稍后尝试访问 path 变量时,我会在程序中得到一个 NameError: name 'path' is not defined

我也试过在程序开始时使 path 全局化,但我仍然遇到 NameError。

我怎样做才能使该变量稍后在我的程序中可访问,同时仍然使对话框消失?

path 变量视为 FileChooser() 的实例。它提供了一个逻辑端,让代表 FileChooser().

的对话框访问路径
class FileChooser():

    def __init__(self):
        #Stores your path
        self.path = None

        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())
            self.path = dia.get_filename()
        elif response == Gtk.ResponseType.CANCEL:
            print("Cancel clicked")

        dia.destroy()

创建对象时。

dialog = FileChooser()

您可以通过以下方式访问:

dialog.path