Доступ к атрибутам класса python в более широком контексте - PullRequest
0 голосов
/ 04 марта 2019

Все еще изучаю Python, вопрос новичка здесь.Я создаю простой графический интерфейс пользователя tkinter, который загружает данные JSON, а затем позволяет пользователю выбирать загруженные данные для печати.Вот описание моей архитектуры и проблемы:

1) В графическом интерфейсе у меня есть кнопка загрузки, которая вызывает функцию LoadData, чтобы открыть каталог, содержащий несколько текстовых файлов JSON

2)LoadData проверяет, существует ли определенное имя файла «AutoPilot.txt», и если это так, другая функция, LoadAutopilotData, называется

3) LoadAutopilotData создает экземпляр класса Data и заполняет егоДанные JSON

После завершения функций я хочу получить доступ к экземпляру класса данных, который я создал во внутренней области (APtime), но я не могу этого сделать.

Фрагмент файла 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 продолжается дозаполнить экземпляр класса данных.У меня проблема в том, что я могу получить доступ только к APtime в File3, а не в функциях «более высокого» уровня.Любая помощь очень ценится.Спасибо!

1 Ответ

0 голосов
/ 08 марта 2019

Что вам нужно сделать, это вернуть значение вызывающей функции.Вы можете заглянуть в раздел учебника по Определение функций на веб-сайте Python, чтобы немного подробнее рассказать об этом.

Так что если мы не слишком изменим ваш код, это может выглядеть примерно такчто:

Решение 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 , потому что это может сэкономить вам немного работы.Например, чтобы проверить, существует ли файл, для этого уже существует функция .

Так что ваш фрагмент 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...