Python не возвращает переменную

У меня есть простой сценарий, который считывает необработанные данные масс-спектрометра, группирует данные в «последовательности» на основе временных меток, а затем предоставляет пользователю список последовательностей для продолжения анализа. Проблема в том, что я не получаю эти списки... Вот код:

import tkinter as tk
from import_raw import get_raw_data

def select_sequences(sequence_data):
    # Tkinter GUI
    root = tk.Tk() 
    root.title("Select Sequences")
    root.geometry("400x200")

    # Listbox for sequence selection
    listbox = tk.Listbox(root, selectmode='multiple')  
    for item in reversed(sequence_data):
        listbox.insert(tk.END, f"Sequence {item['sequence_number']}: {item['start_time']} - {item['end_time']}")
    listbox.pack(fill = "both")

    # Confirm button
    def confirm_selection():
        selected_indices   = listbox.curselection()
        selected_sequences = [sequence_data[len(sequence_data) - i - 1]['sequence_number'] for i in selected_indices]
        print("Selected Sequences:", selected_sequences) 
        root.destroy() 

        return selected_sequences

    tk.Button(root, text = "Confirm selection", command=confirm_selection).pack()
    root.mainloop() 


all_data, sequence_data = get_raw_data() 
selected_sequences = select_sequences(sequence_data)
print("Selected Sequences:", selected_sequences)

Обратите внимание на две функции печати: одну внутри функции confirm_selection(), а другую в конце основного скрипта. Вот результат после выбора последовательностей 20 и 21:

Selected Sequences: [21, 20]
Selected Sequences: None

Почему значения не возвращаются/не извлекаются из функции? Очевидно, я упускаю из виду что-то очень простое.

Я в тупике. Я ожидал, что обе функции печати будут возвращать одинаковые значения.

Вы возвращаете это значение из confirm_selection, а не из select_sequences.

Ry- 30.04.2024 03:20

Вы хотели, чтобы confirm_selection была подфункцией, определенной внутри функции select_sequences? Это юридический кодекс, но это странный способ сделать это.

John Gordon 30.04.2024 03:39

Есть 2 пути решения этой проблемы. 1. сделать переменную selected_sequences глобальной переменной 2. вместо возврата переменной selected_sequences из функции confirm_selection вернуть ее из select_sequences функции

JRudransh 30.04.2024 03:42

Совершенно бессмысленно возвращать что-либо из функции command= кнопки — не вы вызываете эту функцию, и Tkinter не собирается ничего делать со значением, так куда же вы ожидаете, что значение пойдет? Вам нужно где-то сохранить значение, которое будет существовать после завершения функции — глобальную или нелокальную переменную или, возможно, атрибут какого-либо объекта, на который ссылается такая переменная.

jasonharper 30.04.2024 04:05
Почему в 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
4
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ваша функция select_sequences() не имеет оператора возврата. Таким образом, возвращаемое значение равно None — это стандартное поведение Python. Следовательно, в основной части переменной selected_sequences присваивается значение None, а затем оно распечатывается.

Извините, но я все еще в замешательстве. Когда я добавляю «return selected_sequences» в select_sequences(), он возвращает ошибку, что переменная не определена. Мне все еще не хватает чего-то очень очевидного, извините.

ohshitgorillas 30.04.2024 03:41

Подождите, вы имеете в виду что-то вроде ``` selected_sequences = tk.Button(root, text = "Confirm choice", command=confirm_selection).pack() root.mainloop() return selected_sequences ``` ?

ohshitgorillas 30.04.2024 03:46

Я ничего не знаю о tkinter библиотеке. Но, например, вы создаете переменную в функции select_sequences(), присваиваете ей значение в submit_selection(), а затем возвращаете ее в конце select_sequences().

David Pal 02.05.2024 01:17

Функция select_sequences() никогда не возвращает selected_sequences. Итак, вам нужна функция select_sequences return selected_sequences. Если вы добавите это после root.mainloop(), оно должно вернуть ожидаемое значение.

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