在更高范围内访问python类属性

时间:2019-03-04 19:44:08

标签: python python-3.x class attributes

仍在学习Python,此处是菜鸟问题。我正在构建一个简单的tkinter GUI,该GUI加载JSON数据,然后允许用户选择加载的数据进行绘图。这是我的体系结构和问题的说明:

1)在GUI中,我有一个加载按钮,该按钮调用一个函数LoadData,以打开包含多个JSON txt文件的目录

2)LoadData检查是否存在某个文件名“ AutoPilot.txt”,如果存在,则调用另一个函数LoadAutopilotData

3)LoadAutopilotData创建一个Data类的实例,并使用JSON数据填充它。

功能完成后,我想访问在内部作用域(APtime)中创建的Data类的实例,但似乎无法做到这一点。

文件1片段:

loadBtn = Button(toolbar, image=useImg1, command=LoadData)

文件2片段:

def LoadData() :

    # Get data Path from the User
    path = askdirectory()

    # Go to that directory
    os.chdir(path)

    # Check directory to see if AutoPilot.log is available
    try:
        Autopilot = open("AutoPilot.txt")
        Load_Autopilot = True
    except:
        Load_Autopilot = False

    # If Autopilot data exists, load it and populate the listbox
    if Load_Autopilot == True:
        LoadAutopilotData()
        print(APtime.val)

文件3片段:

def LoadAutopilotData() :

    filedata = open( 'AutoPilot.txt' )

    if len( sys.argv) >= 2:
        controller = sys.argv[1]

    APtime = Data("Time", [], "sec")

其中File3继续填充Data类的实例。我遇到的问题是我只能在File3中访问APtime,而不能在“更高”级别的函数中访问。任何帮助是极大的赞赏。谢谢!

1 个答案:

答案 0 :(得分:0)

您需要做的是向调用函数返回一个值。您可以在Python网站上的Defining functions上的教程部分中找到有关此内容的更多信息。

因此,如果我们不对您的代码进行过多更改,则可能会出现以下情况:

解决方案1:文件2片段

def LoadData() :

    # Get data Path from the User
    path = askdirectory()

    # Go to that directory
    os.chdir(path)

    # Check directory to see if AutoPilot.log is available
    try:
        Autopilot = open("AutoPilot.txt")
        Load_Autopilot = True
    except:
        Load_Autopilot = False

    # If Autopilot data exists, load it and populate the listbox
    if Load_Autopilot == True:
        APtime = LoadAutopilotData()
        print(APtime.val)

解决方案1:归档3个片段

def LoadAutopilotData() :

    filedata = open( 'AutoPilot.txt' )

    if len( sys.argv) >= 2:
        controller = sys.argv[1]

    APtime_result = Data("Time", [], "sec")

    return APtime_result
  • 您应该看到函数LoadData()将函数LoadAutopilotData()返回的值分配给APtime变量(行APtime = LoadAutopilotData()
  • 函数LoadAutopilotData()处理完数据后,它使用语句return APtime_result使该值可供调用函数使用。

但是您的代码可以做一些改进。我唯一要提到的是,您应该阅读Standard Library中的内容,因为它可以节省您一些工作。例如,要检查文件是否存在,已经有一个function

因此您的File 2代码段可能看起来像这样:

import os.path

def LoadData() :

    # Get data Path from the User
    path = askdirectory()

    Load_Autopilot = os.path.exists(path)

    # If Autopilot data exists, load it and populate the listbox
    if Load_Autopilot:
        APtime = LoadAutopilotData()
        print(APtime.val)