从 tkinter 中的列表框小部件返回列表
returning a list from a listbox widget in tkinter
有人可以帮我解决这个问题吗?我正在将值从一个列表框传递到另一个列表框,然后在 tkinter 中再次返回,但我需要输出当前列表(右侧框中的值)。此框中的值将更改,因为它们可以移回原始框(左侧) ).我已尝试使用 return 语句来 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()
此语句 returns 一个包含第二个列表框中所有值的元组。
listbox_events_filtered.get(0,END)
但是,您的代码还存在许多其他问题:
def select_events()
也需要 def select_events(event=None)
您将错误的列表框绑定到 deselect_events;应该是 listbox_events_filtered.bind('<Left>', deselect_events)
select_events()
中的current_list
是局部变量,不影响函数外的current_list
在 select_events()
末尾返回 current_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 中再次返回,但我需要输出当前列表(右侧框中的值)。此框中的值将更改,因为它们可以移回原始框(左侧) ).我已尝试使用 return 语句来 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()
此语句 returns 一个包含第二个列表框中所有值的元组。
listbox_events_filtered.get(0,END)
但是,您的代码还存在许多其他问题:
def select_events()
也需要 def select_events(event=None)
您将错误的列表框绑定到 deselect_events;应该是 listbox_events_filtered.bind('<Left>', deselect_events)
select_events()
中的current_list
是局部变量,不影响函数外的current_list
在 select_events()
末尾返回 current_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()
希望这个回答可以解决您的问题:)