在列表框中获取所选项目并调用另一个存储所选项目的函数

Tru*_*ufa 5 python tk-toolkit listbox tkinter

我有一个createCategoryMeny(x)在点击时调用的画布.

这个函数只创建一个Toplevel()窗口,

def createCategoryMenu(tableNumber):

    ##Not interesting below:
    categoryMenu = Toplevel()
    categoryMenu.title("Mesa numero: " + str(tableNumber))
    categoryMenu.geometry("400x400+100+100")

    categoryMenu.focus()
    categoryMenu.grab_set()

    Label(categoryMenu, text="Elegir categoria \n Mesa numero: " + str(tableNumber)).pack()


    ## RELEVANT CODE BELOW:
    listbox = Listbox(categoryMenu, width=50, height=len(info.listaCategorias))
    listbox.pack(pady=20)

    for item in info.listaCategorias:
        listbox.insert(END, item)

    listbox.selection_set(first=0)

    ##My attempt to solve it
    callback = lambda event, tag= "ThisShouldBeTheSelected!!": do(event, tag)
    listbox.bind("<Double-Button-1>", callback)
Run Code Online (Sandbox Code Playgroud)

那么do函数:

def do(event, tag):
    print tag
Run Code Online (Sandbox Code Playgroud)

这成功地打印了"ThisShouldBeTheSelected !!"``.

这就是我完全陷入困境的地方.

我无法获得双击元素(选定的元素).

我想传递它tag=.

我试过了:

listbox.curselection()
Run Code Online (Sandbox Code Playgroud)

总是打印 ('0',)

如果我删除listbox.selection_set(first=0),我只能得到这个:()

所以问题是:

  • 如何获取所选项目(双击一项)
  • (不是那么重要)将它传递给我的其他功能是否合理?

注意:

我发现了这个:

8.5.当我将一个按钮绑定到我的列表框时,为什么没有.listbox curselection或selection返回正确的项目?

在列表框上的按钮单击事件期间获取所选项目的最佳方法是使用以下代码:

bind .listbox {set item [%W get [%W nearest%y]]}

这可以确保指针下的项目将作为项目返回..listbox curselection失败的原因是因为在Listbox类绑定触发器之前未设置curselection中的项目,这是在默认情况下实例绑定之后.这与选择get失败的原因相同,但如果将-exportselection选项设置为0,它也将失败.

我不确定它是否有用,我真的不明白它的含义.

Bry*_*ley 15

一个,不要使用lambda.它对于一小部分问题很有用,而这不是其中之一.创建一个合适的函数,它们更容易编写和维护.

完成后,您可以致电curselection获取当前选择.你说你试过,但你的示例代码没有显示你尝试过的,所以我只能假设你做错了.

至于使用相当不寻常的建议nearest...所有它的说法是你放在一个小部件上的绑定发生在同一事件的默认绑定之前.它是设置选择的默认绑定,因此当您绑定到单个按钮单击时,绑定将在默认绑定更新选择之前触发.有很多方法可以解决这个问题,其中最好的方法是不会在单击时绑定,而是<<ListboxSelect>>在选择发生更改后将触发绑定.

但是,你没有这个问题.由于您在双击时绑定,因此选择将由默认的单击绑定设置,curselection并将返回正确的值.也就是说,除非您有自己的单击绑定,否则会阻止默认绑定触发.

这是一个打印出选择的简单示例,因此您可以看到它是正确的.从命令行运行它,以便您看到stdout:

import Tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        lb = tk.Listbox(self)
        lb.insert("end", "one")
        lb.insert("end", "two")
        lb.insert("end", "three")
        lb.bind("<Double-Button-1>", self.OnDouble)
        lb.pack(side="top", fill="both", expand=True)

    def OnDouble(self, event):
        widget = event.widget
        selection=widget.curselection()
        value = widget.get(selection[0])
        print "selection:", selection, ": '%s'" % value

if __name__ == "__main__":
    app = SampleApp()
    app.mainloop()
Run Code Online (Sandbox Code Playgroud)