Python 从tkinter中的listbox小部件返回列表

Python 从tkinter中的listbox小部件返回列表,python,tkinter,listbox,Python,Tkinter,Listbox,有人能帮我吗。我将值从一个列表框传递到另一个列表框,然后在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_

有人能帮我吗。我将值从一个列表框传递到另一个列表框,然后在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()
从tkinter导入*
从tkinter导入ttk
my_window=Tk()
我的框架=框架(我的窗口)
我的框架网格(行=0,列=0)
my\u frame\u out=帧(my\u窗口)
my_frame_out.grid(行=0,列=1)
listbox\u events=listbox(我的框架,高度=5')
listbox_events.grid(行=0,列=0,padx=10,pady=10)
listbox\u events\u filtered=listbox(my\u frame\u out,height='5')
listbox\u events\u filtered.grid(行=0,列=2,padx=(0,10),pady=10)
my_instructions=标签(my_窗口,text='使用箭头键移动所选项目')
my_instructions.grid(行=1,列=0,列span=3,pady=(0,10))
我的列表事件=['A'、'B'、'C'、'D']
对于我的\u列表\u事件中的项目:
listbox\u事件。插入(结束,项目)
当前_列表=[]
def select_事件():
listbox\u events\u filtered.insert(结束,listbox\u events.get(锚定))
listbox_事件。删除(锚定)
当前_列表。追加(锚定)
返回当前\u列表
def取消选择_事件(事件=无):
listbox\u events.insert(END,listbox\u events\u filtered.get(锚定))
列表框\u事件\u已筛选。删除(锚定)
#参考号https://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
listbox\u events.bind(“”,选择\u events)
listbox_events.bind(“”,取消选择_events)
对于当前_列表中的项目:
打印(项目)
mainloop()

此语句返回一个元组,其中包含第二个列表框中的所有值

listbox_events_filtered.get(0,END)
但是,您的代码还存在许多其他问题:

def select_events()
还需要是
def select_events(event=None)

您绑定了错误的列表框以取消选择\u事件;它应该是
listbox\u events\u filtered.bind(“”,取消选择\u events)

select\u events()
中的
current\u list
是一个局部变量,不影响函数外部的
current\u list

select\u events()
的末尾返回
current\u list
没有任何作用,因为您没有将函数分配给任何对象

最后,

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()
从tkinter导入*
从tkinter导入ttk
my_window=Tk()
我的框架=框架(我的窗口)
我的框架网格(行=0,列=0)
my\u frame\u out=帧(my\u窗口)
my_frame_out.grid(行=0,列=1)
listbox\u events=listbox(我的框架,高度=5')
listbox_events.grid(行=0,列=0,padx=10,pady=10)
listbox\u events\u filtered=listbox(my\u frame\u out,height='5')
listbox\u events\u filtered.grid(行=0,列=2,padx=(0,10),pady=10)
my_instructions=标签(my_窗口,text='使用箭头键移动所选项目')
my_instructions.grid(行=1,列=0,列span=3,pady=(0,10))
我的列表事件=['A'、'B'、'C'、'D']
对于我的\u列表\u事件中的项目:
listbox\u事件。插入(结束,项目)
当前_列表=[]
def select_事件(事件=无):
listbox\u events\u filtered.insert(结束,listbox\u events.get(锚定))
listbox_事件。删除(锚定)
当前_列表。追加(锚定)
对于列表框中的项目\u事件\u已筛选。获取(0,结束):
打印(项目)
def取消选择_事件(事件=无):
listbox\u events.insert(END,listbox\u events\u filtered.get(锚定))
列表框\u事件\u已筛选。删除(锚定)
对于列表框中的项目\u事件\u已筛选。获取(0,结束):
打印(项目)
listbox\u events.bind(“”,选择\u events)
listbox\u events\u filtered.bind(“”,取消选择\u events)
mainloop()

希望这个答案能帮助您解决您的问题:)

谢谢-起初我以为我理解了,但又困惑了-如何从该函数中返回当前的\u列表?如果我键入print(当前列表),以便在代码之外使用,如果我键入print(当前列表),我只会得到一个[]。很抱歉,我是Python新手要做到这一点,您应该首先在这两个函数的开头写
global current_list
,表明您指的是代码其余部分中的
current_list
。然后,使用
current\u list.append(ANCHOR)
,而不是使用
current\u list=list(listbox\u events\u filtered.get(0,END))
。感谢再次回答,但仍然有问题-我已经包含了您提到的更正,但仍然无法从print(current\u list)语句中获得任何信息(我刚刚在mainloop之前插入了它-我需要一个return语句吗?我一直在尝试它们,但无法将其发送到workSorry以供延迟回复,最近没有出现堆栈溢出;如上所述,Tk.mainloop()仅继续处理tkinter事件,不循环前面的代码。这意味着您的print语句将只执行一次,这将在您开始更改列表框中的内容之前执行。要在tkinter Main循环期间运行代码,我建议您查看或使用线程。