首页 > 解决方案 > python 3.7 tkinter 的空列表框返回值

问题描述

为什么这个列表框不返回我的选择?我添加了带有按钮的 returnSelected() 函数,认为它需要被触发。我的目标是创建一个尽可能简单的功能,用户可以选择精简列表,我显然不了解 tkinter 流程​​。

import tkinter
def listboxinput3():
    # <ListboxSelect> callback function and current selection
    def cb(event):
        label['text'] = str(event) + '\n' + str(lb.curselection())

    def returnSelected():
        myselection = [my_list[k] for k in lb.curselection()]
        print(myselection )

    root = tkinter.Tk()
    root.title('Parameter Selection')
    root.geometry('200x600')
    my_list = dir(tkinter)
    var = tkinter.StringVar(value=my_list)

    label = tkinter.Label(root)
    label.grid()
    btnGet = tkinter.Button(root,text="Get Selection",command=returnSelected)
    btnGet.grid()
    lb = tkinter.Listbox(root, listvariable=var, selectmode='extended')
    lb.grid()
    lb.bind('<<ListboxSelect>>', cb)
    #tkinter.Button(root, text="Show Selected", command=returnSelected).pack()
    selected_text_list = [lb.get(i) for i in lb.curselection()]
    root.mainloop()
    return selected_text_list

selected_text_list = listboxinput3()

谢谢

标签: pythontkinter

解决方案


看来你不知道 GUI 是如何工作的。您selected_text_listmainloop()启动程序、显示窗口、点击、运行cbreturnSelected之前创建此列表 - 因此您甚至在看到窗口和选择项目之前就创建了此列表。

您必须在函数内部创建它,cb或者returnSelected在选择项目后执行它。它需要global selected_text_list将其分配给外部变量,因为button无法获取它并将其分配给外部变量。

import tkinter

def listboxinput3():
    # <ListboxSelect> callback function and current selection

    def cb(event):
        label['text'] = str(event) + '\n' + str(lb.curselection())

    def returnSelected():
        global selected_text_list
       
        selected_text_list = [my_list[k] for k in lb.curselection()]
        
    root = tkinter.Tk()
    root.title('Parameter Selection')
    root.geometry('200x600')
    
    my_list = dir(tkinter)
    var = tkinter.StringVar(value=my_list)

    label = tkinter.Label(root)
    label.grid()
    
    btnGet = tkinter.Button(root, text="Get Selection", command=returnSelected)
    btnGet.grid()
    
    lb = tkinter.Listbox(root, listvariable=var, selectmode='extended')
    lb.grid()
    lb.bind('<<ListboxSelect>>', cb)
    
    #tkinter.Button(root, text="Show Selected", command=returnSelected).pack()
    # selected_text_list = [lb.get(i) for i in lb.curselection()]  # useless - it is executed before you even see window
    
    # display window, run function assigned to button when you click, etc.
    root.mainloop()

    return selected_text_list

selected_text_list = listboxinput3()
print(selected_text_list)

推荐阅读