У меня есть простой сценарий, который считывает необработанные данные масс-спектрометра, группирует данные в «последовательности» на основе временных меток, а затем предоставляет пользователю список последовательностей для продолжения анализа. Проблема в том, что я не получаю эти списки... Вот код:
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
? Это юридический кодекс, но это странный способ сделать это.
Есть 2 пути решения этой проблемы. 1. сделать переменную selected_sequences
глобальной переменной 2. вместо возврата переменной selected_sequences
из функции confirm_selection
вернуть ее из select_sequences
функции
Совершенно бессмысленно возвращать что-либо из функции command=
кнопки — не вы вызываете эту функцию, и Tkinter не собирается ничего делать со значением, так куда же вы ожидаете, что значение пойдет? Вам нужно где-то сохранить значение, которое будет существовать после завершения функции — глобальную или нелокальную переменную или, возможно, атрибут какого-либо объекта, на который ссылается такая переменная.
Ваша функция select_sequences()
не имеет оператора возврата. Таким образом, возвращаемое значение равно None
— это стандартное поведение Python. Следовательно, в основной части переменной selected_sequences
присваивается значение None
, а затем оно распечатывается.
Извините, но я все еще в замешательстве. Когда я добавляю «return selected_sequences» в select_sequences(), он возвращает ошибку, что переменная не определена. Мне все еще не хватает чего-то очень очевидного, извините.
Подождите, вы имеете в виду что-то вроде ``` selected_sequences = tk.Button(root, text = "Confirm choice", command=confirm_selection).pack() root.mainloop() return selected_sequences ``` ?
Я ничего не знаю о tkinter
библиотеке. Но, например, вы создаете переменную в функции select_sequences()
, присваиваете ей значение в submit_selection(), а затем возвращаете ее в конце select_sequences()
.
Функция select_sequences()
никогда не возвращает selected_sequences. Итак, вам нужна функция select_sequences return selected_sequences
. Если вы добавите это после root.mainloop()
, оно должно вернуть ожидаемое значение.
Вы возвращаете это значение из
confirm_selection
, а не изselect_sequences
.