1

This is the same problem I posed earlier today and which a couple of you tried to help me with, but I can't get it to work. All I want to do is to populate "ichose" with the multiple selections I make when I click on the listbox.

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

Whatever I do, "ichose" comes out as an empty tuple (). It's clear that the function "entered" is never called because I never see the test string 'hello'.

I also don't know what the various options are as in "Double-Button-", "<>" etc. Where can I find a list and explanation of each one?

If somebody could please just modify my program so the "print ichose" works, I'd be really grateful. You can see from my program that I don't really know what I'm doing but am keen to learn. Thank you.

2 Answers 2

2

I've finally found the answer to my own question. This is REALLY useful if you want to capture multiple responses from a listbox. I've commented a lot. Hope it helps!

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
Sign up to request clarification or add additional context in comments.

Comments

1
# ----------------[ 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("---------------------------")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.