Как получить глобальный доступ к переменной, которая еще не определена в python?

Я использую python и tkinter для создания программы, в которой вы можете найти файл excel, содержащий список имен файлов для поиска пути. Если он найдет список файлов, он позволит пользователю сжать все файлы в один файл. скопируйте zip-файл и сохраните его. Я новичок в программировании, поэтому прошу прощения, если это довольно просто. Моя проблема в том, что я пытаюсь работать со списком файлов, который находится в функции Load_File, но при запуске программы он еще не установлен пользователем. Мне нужно найти способ заставить python ждать, пока пользователь не перейдет к файлу excel, и как только файл будет установлен пользователем, установите его глобально, чтобы я мог использовать список файлов для поиска ОС. Ниже мой код:

def load_file():
    file_path = filedialog.askopenfilename(filetypes=[('Excel files', '*.xlsx')])
    wb = openpyxl.load_workbook(file_path)
    sheet = wb.active
    file_names = [cell.value for row in sheet.rows for cell in row]
    for file_name in file_names:
        listbox.insert('end', file_name)

def search_folder(folder, file_name):
    # Create an empty list to store the found file paths
    found_files = []
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file in file_name:
                found_files.append(os.path.join(root, file))
    return found_files

folder = r'C:\Path\To\File'
found_files = search_folder(folder, file_names)

Я установил для file_name значение global, но, как объяснялось выше, выдает ошибку, потому что программа еще не получила. Есть ли способ получить file_names в функцию search_folder, если мне нужно подождать, пока пользователь запустит программу, а затем перейти к этому файлу? Я чувствую, что структура моих функций и окна tkniter неверна, что ограничивает область действия моей переменной, с которой я могу работать. Любая помощь приветствуется!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, я понимаю, что ты делаешь;
Создайте список 'file_names' из имен [файлов], считанных из выбранного (с помощью askopenfilename) листа Excel. Затем найдите путь «папка» для каждого файла в этом списке. Если существует, добавьте к имени путь к папке, сохранив ее в списке «found_files». Поле со списком (по крайней мере, здесь просто для отображения имен файлов, найденных в файле Excel.
Таким образом, функция load_file не имеет возврата для списка имен файлов, включите это и вызовите функцию при вызове функции search_folder.

def load_file():
    file_path = filedialog.askopenfilename(filetypes=[('Excel files', '*.xlsx')])
    wb = openpyxl.load_workbook(file_path)
    sheet = wb.active
    file_names = [cell.value for row in sheet.rows for cell in row]
    for file_name in file_names:
        listbox.insert('end', file_name)
    return file_names  # <--- return your list 


def search_folder(folder, file_name):
    # Create an empty list to store the found file paths
    found_files = []
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file in file_name:
                found_files.append(os.path.join(root, file))
    return found_files

folder = r'C:\Path\To\File'
# found_files = search_folder(folder, file_names)
found_files = search_folder(folder, load_file())  # <-- call the load_file function, the return will be the list with the filenames.

Другие вопросы по теме