【问题标题】:Deselecting from a listbox in Tkinter从 Tkinter 中的列表框中取消选择
【发布时间】:2017-10-07 04:34:17
【问题描述】:

我只是想知道如何从更薄的列表框中取消选择。每当我单击列表框中的某些内容时,它会突出显示并带有下划线,但是当我从屏幕向一侧单击时,列表框选择会保持突出显示。即使我单击一个按钮,选择仍然保持下划线。例如:在下面的示例代码中,单击其中之一后,我无法单击列表框选择。

from tkinter import *

def Add():
   listbox.insert(END, textVar.get())


root = Tk()

textVar = StringVar()
entry = Entry(root, textvariable = textVar)
add = Button(root, text="add", command = Add)
frame = Frame(root, height=100, width=100, bg="blue")
listbox = Listbox(root, height=5)
add.grid(row=0, column=0, sticky=W)
entry.grid(row=0, column=1, sticky=E)
listbox.grid(row=1, column=0)
frame.grid(row=1, column=1)

root.mainloop()

【问题讨论】:

    标签: python tkinter listbox


    【解决方案1】:

    是的,这是列表框的正常行为。如果你想改变,你可以在每次列表框离开焦点时调用 clear 函数:

    listbox.bind('<FocusOut>', lambda e: listbox.selection_clear(0, END))
    

    【讨论】:

      【解决方案2】:

      在 Listbox 小部件上使用 selectmode 参数。 您可以再次单击所选项目,它将清除选择。

      查看 effbot 链接: http://effbot.org/tkinterbook/listbox.htm

      listbox = Listbox(root, height=5, selectmode=MULTIPLE)
      

      【讨论】:

        【解决方案3】:

        我已经设法在 Listbox 小部件中创建所需的功能,以便当用户单击返回 Listbox 中的同一项目或屏幕上的其他位置时,当前选定的项目会被取消选择。解决方案非常简单。

        首先我创建了一个绑定,这样当在窗口的任意位置按下鼠标左键时,就会执行取消选择列表框的功能。

        root.bind('<ButtonPress-1>', deselect_item)
        

        然后我创建了一个变量来存储要选择的最后一个列表框项的值并将其值初始化为None

        previous_selected = None
        

        然后我定义了取消选择列表框的函数,如下所示。首先选择新项目(用户刚刚单击的项目)并与之前选择的项目进行比较。如果这是真的,那么用户点击了列表框中已经突出显示的项目,因此列表框的选择被清除,删除了选定的项目。最后,该函数将先前选中的框更新为当前选中的框。

        def deselect_item(event):
            if listbox.curselection() == previous_selected:
                    listbox.selection_clear(0, tkinter.END)
            previous_selected = listbox.curselection()
        

        一个完整的工作示例(在 python 3.8.0 中)如下所示:

        import tkinter
        
        class App(tkinter.Tk):
            def __init__(self):
                tkinter.Tk.__init__(self)
                self.previous_selected = None
        
                self.listbox = tkinter.Listbox(self)
                self.bind('<ButtonPress-1>', self.deselect_item)
        
                self.listbox.insert(tkinter.END, 'Apple')
                self.listbox.insert(tkinter.END, 'Orange')
                self.listbox.insert(tkinter.END, 'Pear')
        
                self.listbox.pack()
        
            def deselect_item(self, event):
                if self.listbox.curselection() == self.previous_selected:
                        self.listbox.selection_clear(0, tkinter.END)
                self.previous_selected = self.listbox.curselection()
        
        app = App()
        app.mainloop()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多