возврат списка из виджета списка в tkinter - PullRequest
0 голосов
/ 01 мая 2020

Может ли кто-нибудь помочь мне с этим. Я передаю значения из одного списка в другой и снова в tkinter, но мне нужно вывести текущий список (значения в поле справа). Значения в этом поле будут изменены, поскольку их можно переместить обратно в исходное поле (слева) ). Я пытался использовать оператор 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)

current_list = []


def select_events():
    listbox_events_filtered.insert(END, listbox_events.get(ANCHOR))
    listbox_events.delete(ANCHOR)
    current_list.append(ANCHOR)
    return current_list


def deselect_events(event=None):
    listbox_events.insert(END, listbox_events_filtered.get(ANCHOR))
    listbox_events_filtered.delete(ANCHOR)
# ref https://effbot.org/tkinterbook/tkinter-events-and-bindings.htm


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

for item in current_list:
    print(item)

mainloop()

1 Ответ

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

Этот оператор возвращает кортеж, содержащий все значения во втором списке.

listbox_events_filtered.get(0,END)

Однако есть и ряд других проблем с вашим кодом:

def select_events() также должно быть def select_events(event=None)

Вы связываете неправильный список с deselect_events; listbox_events_filtered.bind('<Left>', deselect_events)

current_list в select_events() является локальной переменной и не влияет на current_list вне функции.

, возвращая current_list в конце select_events() ничего не делает, поскольку вы никому не назначаете функцию.

Наконец,

for item in current_list:
    print(item)

будет выполняться только один раз, так как mainloop() только повторяет события tkinter.

Имея все это в виду, вы должны вместо этого изменить свой код на что-то вроде этого:

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)

current_list = []


def select_events(event=None):
    listbox_events_filtered.insert(END, listbox_events.get(ANCHOR))
    listbox_events.delete(ANCHOR)
    current_list.append(ANCHOR)
    for item in listbox_events_filtered.get(0,END):
        print(item)


def deselect_events(event=None):
    listbox_events.insert(END, listbox_events_filtered.get(ANCHOR))
    listbox_events_filtered.delete(ANCHOR)
    for item in listbox_events_filtered.get(0,END):
        print(item)


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

mainloop()

Надеюсь, этот ответ поможет вам решить ваши проблемы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...