Python 变量值在分配给它的函数之外使用时会发生变化

Python 变量值在分配给它的函数之外使用时会发生变化,python,variables,tkinter,Python,Variables,Tkinter,我创建了一个函数,该函数获取文件的目录路径,如下所示: def discoverLocation(self): self.txtBox.insert(1.0, askdirectory()) if(self.txtBox.get(1.0) != 0): global path path = self.txtBox.get(1.0,END) print "path is " + path 此函数的输出按预期工作,这意味着输出“路径

我创建了一个函数,该函数获取文件的目录路径,如下所示:

def discoverLocation(self):
    self.txtBox.insert(1.0, askdirectory())
    if(self.txtBox.get(1.0) != 0):
        global path
        path = self.txtBox.get(1.0,END)
        print "path is "  + path
此函数的输出按预期工作,这意味着输出“路径是‘文件目录’”

但是,当我从函数外部使用这个“path”变量时,该变量似乎发生了变化

代码如下:

def __init__(self, parent):
    path = StringVar()
    print path


    dirs = os.listdir(path)
    for file in dirs:
        totalFiles += 1
这里的路径值与前面的路径不同,它显示的名称是“PY_VAR0”


我想使用def_init_(self,parent)方法中discoverLocation(self)方法给出的相同值。

您需要做两件事:

  • 从您的
    发现位置
    返回path的值,而不是尝试将其设置为全局值,例如:

    class MyClass(object):
        def discoverLocation(self):
            self.txtBox.insert(1.0, askdirectory())
            if(self.txtBox.get(1.0) != 0):
                path = self.txtBox.get(1.0,END)
                print "path is "  + path
                return path
            return None
    
  • 在主功能中使用该路径,例如:

    def __init__(self, parent):
        path = self.discoverLocation()
        print path
        dirs = os.listdir(path)
        for file in dirs:
           totalFiles += 1
    

  • 您还需要决定如果找不到路径该怎么办-例如,如果
    discoverLocation()
    返回
    None

    您需要做两件事:

  • 从您的
    发现位置
    返回path的值,而不是尝试将其设置为全局值,例如:

    class MyClass(object):
        def discoverLocation(self):
            self.txtBox.insert(1.0, askdirectory())
            if(self.txtBox.get(1.0) != 0):
                path = self.txtBox.get(1.0,END)
                print "path is "  + path
                return path
            return None
    
  • 在主功能中使用该路径,例如:

    def __init__(self, parent):
        path = self.discoverLocation()
        print path
        dirs = os.listdir(path)
        for file in dirs:
           totalFiles += 1
    

  • 您还需要决定如果找不到路径该怎么办-例如,如果
    discoverLocation()
    返回
    None

    您需要做两件事:

  • 从您的
    发现位置
    返回path的值,而不是尝试将其设置为全局值,例如:

    class MyClass(object):
        def discoverLocation(self):
            self.txtBox.insert(1.0, askdirectory())
            if(self.txtBox.get(1.0) != 0):
                path = self.txtBox.get(1.0,END)
                print "path is "  + path
                return path
            return None
    
  • 在主功能中使用该路径,例如:

    def __init__(self, parent):
        path = self.discoverLocation()
        print path
        dirs = os.listdir(path)
        for file in dirs:
           totalFiles += 1
    

  • 您还需要决定如果找不到路径该怎么办-例如,如果
    discoverLocation()
    返回
    None

    您需要做两件事:

  • 从您的
    发现位置
    返回path的值,而不是尝试将其设置为全局值,例如:

    class MyClass(object):
        def discoverLocation(self):
            self.txtBox.insert(1.0, askdirectory())
            if(self.txtBox.get(1.0) != 0):
                path = self.txtBox.get(1.0,END)
                print "path is "  + path
                return path
            return None
    
  • 在主功能中使用该路径,例如:

    def __init__(self, parent):
        path = self.discoverLocation()
        print path
        dirs = os.listdir(path)
        for file in dirs:
           totalFiles += 1
    

  • 您还需要决定如果找不到路径该怎么办-例如,如果
    discoverLocation()
    返回
    None

    您似乎错过了类的基本要点:它们将信息存储在实例属性中。您不希望创建全局变量,而是希望创建实例属性。您可以通过
    self
    引用它

    因此,在
    \uuuu init\uuuuu
    中:

    def __init__(self, parent):
        self.path = StringVar()
    

    现在您可以在
    discoverLocation
    中参考
    self.path
    ,您似乎忽略了类的基本要点:它们将信息存储在实例属性中。您不希望创建全局变量,而是希望创建实例属性。您可以通过
    self
    引用它

    因此,在
    \uuuu init\uuuuu
    中:

    def __init__(self, parent):
        self.path = StringVar()
    

    现在您可以在
    discoverLocation
    中参考
    self.path
    ,您似乎忽略了类的基本要点:它们将信息存储在实例属性中。您不希望创建全局变量,而是希望创建实例属性。您可以通过
    self
    引用它

    因此,在
    \uuuu init\uuuuu
    中:

    def __init__(self, parent):
        self.path = StringVar()
    

    现在您可以在
    discoverLocation
    中参考
    self.path
    ,您似乎忽略了类的基本要点:它们将信息存储在实例属性中。您不希望创建全局变量,而是希望创建实例属性。您可以通过
    self
    引用它

    因此,在
    \uuuu init\uuuuu
    中:

    def __init__(self, parent):
        self.path = StringVar()
    

    现在,您可以在
    discoverLocation

    中参考
    self.path
    ,在哪里全局定义变量path?我在您分配的init函数path=StringVar()中定义了它。当然,它不会是你之前分配给它的东西;这将是一个
    StringVar
    !另外,您忘了在
    \uuuu init\uuuuu
    中声明它
    全局
    ,但是仅仅修复它并不足以修复更大的问题。这两个函数都在同一个类中吗?如果是这样,为什么不将其另存为class属性?是的,它们都在同一个类中,您的意思是在两个函数之外将路径声明为StringVar()?变量path globaly在哪里定义?我在您分配的init function path=StringVar()中定义了它
    path=StringVar()
    。当然,它不会是你之前分配给它的东西;这将是一个
    StringVar
    !另外,您忘了在
    \uuuu init\uuuuu
    中声明它
    全局
    ,但是仅仅修复它并不足以修复更大的问题。这两个函数都在同一个类中吗?如果是这样,为什么不将其另存为class属性?是的,它们都在同一个类中,您的意思是在两个函数之外将路径声明为StringVar()?变量path globaly在哪里定义?我在您分配的init function path=StringVar()中定义了它
    path=StringVar()
    。当然,它不会是你之前分配给它的东西;这将是一个
    StringVar
    !另外,您忘了在
    \uuuu init\uuuuu
    中声明它
    全局
    ,但是仅仅修复它并不足以修复更大的问题。这两个函数都在同一个类中吗?如果是这样,为什么不将其另存为class属性?是的,它们都在同一个类中,您的意思是在两个函数之外将路径声明为StringVar()?变量path globaly在哪里定义?我在您分配的init function path=StringVar()中定义了它
    path=StringVar()
    。当然,它不会是你之前分配给它的东西;这将是一个
    StringVar
    !另外,您忘了在
    \uuuu init\uuuuu
    中声明它
    全局
    ,但是仅仅修复它并不足以修复更大的问题。这两个函数都在同一个类中吗?如果是这样,为什么不将其另存为class属性?是的,它们都在同一个类中,您的意思是将路径声明为两个函数之外的StringVar()?我已经尝试过这样做