Как вернуть список из функции события в tkinter? - PullRequest
2 голосов
/ 01 мая 2020

Я пытаюсь понять, как вернуть список из функции, которая используется, когда пользователь использует клавишу мыши для перемещения элемента в поле слева в поле справа. Я пытаюсь захватить элементы в поле справа в виде списка, но мне нужен этот список вне функции.

Поэтому я пытаюсь вернуть список (current_list) из функции select_events , Он захватывает список в функции, но мне нужно использовать его снаружи. Я изо всех сил пытаюсь понять, как использовать return, чтобы сделать это

from tkinter import *
from tkinter import ttk

my_window = Tk()

my_frame_in = Frame(my_window)
my_frame_in.grid(row=0, column=0)
my_frame_out = Frame(my_window)
my_frame_out.grid(row=0, column=1)

listbox_events = Listbox(my_frame_in, height='5')
listbox_events.grid(row=0, column=0, padx=10, pady=10)
listbox_events_filtered = Listbox(my_frame_out, height='5')
listbox_events_filtered.grid(row=0, column=2, padx=(0, 10), pady=10)
my_instructions = Label(my_window, text='Use arrow keys to move selected items')
my_instructions.grid(row=1, column=0, columnspan=3, pady=(0, 10))

my_list_events = ['A', 'B', 'C', 'D']

for item in my_list_events:
    listbox_events.insert(END, item)

global current_list


def select_events(event=None):
#    current_list = []
    listbox_events_filtered.insert(END, listbox_events.get(ANCHOR))
    listbox_events.delete(ANCHOR)
    current_list = list(listbox_events_filtered.get(0, END))
    print(current_list)
    return current_list


print(current_list)


def deselect_events(event=None):
#    current_list = []
    listbox_events.insert(END, listbox_events_filtered.get(ANCHOR))
    listbox_events_filtered.delete(ANCHOR)
    current_list = list(listbox_events_filtered.get(0, END))


listbox_events.bind('<Right>', select_events)
listbox_events_filtered.bind('<Left>', deselect_events)

mainloop()

1 Ответ

1 голос
/ 02 мая 2020

Вот кое-что, что иллюстрирует, что можно сделать, поскольку нет никакого осмысленного способа вернуть значение из функции-обработчика события tkinter. В нем показано, как ссылаться на глобальную переменную, например current_list, для использования внутри функции (т. Е. Путем объявления ее global).

Это необходимо сделать только тогда, когда функция пытается изменить значение - оператор сообщает Python , а не , чтобы создать локальную переменную с таким именем, когда что-то ему назначено (это поведение по умолчанию).

Я добавил Текущий список процессов Button к GUI, который будет вызывать функцию, которая также добавила с именем process_list() при каждом нажатии. Эта функция содержит (закомментированный) код, который вы упомянули в одном из ваших комментариев, чтобы указать, где можно выполнить подобную обработку.

from tkinter import *
from tkinter import ttk

my_window = Tk()

my_frame_in = Frame(my_window)
my_frame_in.grid(row=0, column=0)
my_frame_out = Frame(my_window)
my_frame_out.grid(row=0, column=1)

listbox_events = Listbox(my_frame_in, height='5')
listbox_events.grid(row=0, column=0, padx=10, pady=10)
listbox_events_filtered = Listbox(my_frame_out, height='5')
listbox_events_filtered.grid(row=0, column=2, padx=(0, 10), pady=10)
my_instructions = Label(my_window, text='Use arrow keys to move selected items')
my_instructions.grid(row=1, column=0, columnspan=3, pady=(0, 10))

my_list_events = ['A', 'B', 'C', 'D']
current_list = []  # Initilize global variable.

for item in my_list_events:
    listbox_events.insert(END, item)

def select_events(event=None):
    global current_list

    listbox_events_filtered.insert(END, listbox_events.get(ANCHOR))
    listbox_events.delete(ANCHOR)
    current_list = list(listbox_events_filtered.get(0, END))

def deselect_events(event=None):
    global current_list

    listbox_events.insert(END, listbox_events_filtered.get(ANCHOR))
    listbox_events_filtered.delete(ANCHOR)
    current_list = list(listbox_events_filtered.get(0, END))

def process_list():
    print('current_list:', current_list)
#    for item in current_list:
#        x, y = np.loadtxt(item + '_' + 'Test.csv', skiprows=1, usecols=[my_col_x_axis,
#                          my_col_y_axis], unpack=True, delimiter=',')

my_button = Button(my_window, text='Process current list', command=process_list)
my_button.grid(row=2, column=0, columnspan=3, pady=(0, 10))

listbox_events.bind('<Right>', select_events)
listbox_events_filtered.bind('<Left>', deselect_events)

mainloop()
...