【问题标题】:Problems in Python getting multiple selections from Tkinter listboxPython 中从 Tkinter 列表框中获得多项选择的问题
【发布时间】:2012-11-29 11:51:56
【问题描述】:

这是我今天早些时候提出的同一个问题,你们中的一些人试图帮助我解决这个问题,但我无法让它发挥作用。我要做的就是在单击列表框时使用我所做的多项选择来填充“ichose”。

import Tkinter as tk
from Tkinter import *
global ichose

class App(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self,master)
        self.master=master
        self.grid()
        self.ichose = ()

        self.l = Listbox(self, height=10, selectmode=EXTENDED)
        # Selectmode can be SINGLE, BROWSE, MULTIPLE or EXTENDED. Default BROWSE
        self.l.grid(column=0, row=0, sticky=(N,W,E,S))
        self.l.bind("Double-Button-1", self.entered)

        s = Scrollbar(self, orient=VERTICAL, command=self.l.yview)
        s.grid(column=0, row=0, sticky=(N,S,E))
        self.l['yscrollcommand'] = s.set

        for i in range(1,101):
            self.l.insert('end', 'Line %d of 100' % i)


    def entered(self, event):
        self.ichose = self.selection_get()
        self.ichose = ('hello')

root=tk.Tk()
root.title('Listbox Problem')
root.geometry('200x200')
app=App(root)
root.mainloop()

print app.ichose

无论我做什么,“ichose”都会以空元组 () 的形式出现。 很明显,从未调用过“entered”函数,因为我从未见过测试字符串“hello”。

我也不知道“Do​​uble-Button-”、“”等中的各种选项是什么。在哪里可以找到每个选项的列表和说明?

如果有人可以修改我的程序以使“print ichose”正常工作,我将不胜感激。您可以从我的程序中看到,我并不真正知道自己在做什么,但很想学习。谢谢。

【问题讨论】:

    标签: python listbox get ltk


    【解决方案1】:

    我终于找到了自己问题的答案。如果您想从列表框中捕获多个响应,这非常有用。我评论了很多。希望对您有所帮助!

    import Tkinter as tk
    from Tkinter import *
    
    class App(tk.Frame):
        def __init__(self, master):
            tk.Frame.__init__(self,master)
            self.master=master
            self.grid()
            self.ichose = []
    
            self.l = Listbox(self, height=10, selectmode=MULTIPLE)
            # Selectmode can be SINGLE, BROWSE, MULTIPLE or EXTENDED. Default BROWSE
            self.l.grid(column=0, row=0, sticky=(N,W,E,S))
    
            s = Scrollbar(self, orient=VERTICAL, command=self.l.yview)
            s.grid(column=0, row=0, sticky=(N,S,E))
            self.l['yscrollcommand'] = s.set
    
            for i in range(1,101):
                self.l.insert('end', 'Line %d of 100' % i)
    
            # Create Textbox that will display selected items from list
            self.selected_list = Text(self,width=20,height=10,wrap=WORD)
            self.selected_list.grid(row=12, column=0, sticky=W)        
    
            # Now execute the poll() function to capture selected list items
            self.ichose = self.poll()
    
        def poll(self):
            items =[]
            self.ichose = []
            # Set up an automatically recurring event that repeats after 200 millisecs
            self.selected_list.after(200, self.poll)
            # curselection retrieves the selected items as a tuple of strings. These
            # strings are the list indexes ('0' to whatever) of the items selected.
            # map applies the function specified in the 1st parameter to every item
            # from the 2nd parameter and returns a list of the results. So "items"
            # is now a list of integers
            items = map(int,self.l.curselection())
    
            # For however many values there are in "items":
            for i in range(len(items)):
                # Use each number as an index and get from the listbox the actual
                # text strings corresponding to each index, and append each to
                # the list "ichose".
                self.ichose.append(self.l.get(items[i]))
            # Write ichose to the textbox to display it.
            self.update_list()
            return self.ichose
    
        def update_list(self):
            self.selected_list.delete(0.0, END)
            self.selected_list.insert(0.0, self.ichose)
    
    
    root=tk.Tk()
    root.title('Listbox Multi-Capture')
    root.geometry('200x340')
    app=App(root)
    root.mainloop()
    
    print app.ichose
    

    【讨论】:

      【解决方案2】:
      # ----------------[ Listbox EXAMPLE ]----------------
      
          self.sarcCountries = (
              "Bangladesh",
              "India",
              "Pakistan",
              "Nepal",
              "Bhutan",
              "Sri Lanka",
              "Afghanistan"
          )
      
          self.listData = StringVar(value = self.sarcCountries)
      
          self.listbox = Listbox(
              master           = self,
              height           = 10,
              listvariable     = self.listData,
              selectmode       = MULTIPLE,
              selectbackground = "#BC80CC"
          )
      
          self.listbox.bind("<<ListboxSelect>>", self.OnListboxSelectionChanged)
      
          self.listbox.pack(fill = BOTH, expand = 0, padx = 10, pady = 10)
      # ----------------[ Listbox EXAMPLE ]----------------
      
      
      def OnListboxSelectionChanged(self, val):
          # NOTE: If your listbox's select mode is MULTIPLE, then you may use this portion of code
          selections = val.widget.curselection()
      
          print("---------------------------")
      
          if (selections != ()):
              for index in selections:
                  print(self.sarcCountries[int(index)])
      
          print("---------------------------")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        • 2012-12-30
        • 2014-09-16
        • 2014-10-14
        • 2017-10-07
        相关资源
        最近更新 更多