代码之家  ›  专栏  ›  技术社区  ›  Jarad

使某些Tkinter列表框项目始终处于选中状态

  •  1
  • Jarad  · 技术社区  · 9 年前

    我有一个tkinter列表框,其中需要始终选择列表框中的一些项。在我的应用程序中,这些项目是用户必需的,而列表框中的其他一些项目是可选的(应该是可选/不可选的)。

    大多数示例使用绑定函数 '<<ListboxSelect>>' .

    我不明白的是,如何获得用户从绑定事件中选择的单个项目?

    在我的示例代码中, apples , peaches , lettuce 最初被选中。假设我点击 苹果 。通常,此事件将取消选择 苹果 但我想运行我的函数并打开选择 苹果 所以它看起来像是无法被取消选择的。

    import tkinter as tk
    
    root = tk.Tk()
    
    requiredlb = tk.Listbox(root, exportselection=False, activestyle='none', selectmode=tk.MULTIPLE)
    for i,item in enumerate(['apples', 'oranges', 'peaches', 'carrots', 'lettuce', 'grapes']):
      requiredlb.insert(tk.END, item)
      if i % 2 == 0:
        requiredlb.selection_set(i)
    requiredlb.grid(row=6, column=1, sticky='ew')
    
    def always_selected(event):
      widget = event.widget
      ## What Goes Here? ##
    
    requiredlb.bind('<<ListboxSelect>>', func=always_selected)
    
    root.mainloop()
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   Israel Unterman    9 年前

    好的,很好的问题。这是我设法想出的一个变通办法,似乎很管用。

    首先,创建要始终保持选中状态的索引列表:

    items = ['apples', 'oranges', 'peaches', 'carrots', 'lettuce', 'grapes']
    special_items = [0, 2, 4]
    
    for i,item in enumerate(items):
        ...
    

    如您所见,我对您的代码做了一些修改

    然后,在事件函数中,始终确保通过明确选择这些索引来选择它们:

    def always_selected(event):
      widget = event.widget
      for idx in special_items:
          widget.selection_set(idx)