【问题标题】:returning a list from a listbox widget in tkinter从 tkinter 中的列表框小部件返回列表
【发布时间】:2020-05-01 12:21:40
【问题描述】:

有人可以帮我解决这个问题吗?我将值从一个列表框传递到另一个列表框,然后在 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()

【问题讨论】:

    标签: python tkinter listbox


    【解决方案1】:

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

    listbox_events_filtered.get(0,END)
    

    但是,您的代码还存在许多其他问题:

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

    您将错误的列表框绑定到取消选择事件;应该是listbox_events_filtered.bind('&lt;Left&gt;', 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()
    

    希望这个答案可以让你解决你的问题:)

    【讨论】:

    • 谢谢 - 起初我以为我理解但又感到困惑 - 我如何从该函数中返回 current_list ?如果我输入 print(current_list),那么如果我输入 print(current_list),我可以在代码之外使用,我只会得到一个 []。抱歉,我是 Python 新手
    • 为此,您应该首先在两个函数的开头写上global current_list,以表明您的意思是其余代码中的current_list。然后,不要使用current_list.append(ANCHOR),而是使用current_list = list(listbox_events_filtered.get(0,END))
    • 感谢您再次回答,但仍有问题 - 我已经包含了您提到的更正,但仍然无法从 print(current_list) 语句(我在 mainloop 之前插入 - 我需要返回吗?声明?我一直在尝试,但无法正常工作
    • 抱歉回复晚了,最近没在栈溢出;如前所述, Tk.mainloop() 只继续处理 tkinter 事件,而不循环它之前的代码。这意味着您的打印语句将只执行一次,这将在您开始更改列表框中的内容之前执行。要在 tkinter 主循环期间运行代码,我建议您查看 tk.after() method 或使用线程。
    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多