Python Forum

Full Version: Listbox search code partially works
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi everyone on the Python Forum!

I have some search code that partially works thanks to a helpful forum post from deanhystad!
I still have a few glitches.

class SearchWin:
    def searchList(self):
        content = self.searchTerms.get()
        next_index = 0
        elements = int(itemslist.size())
        for i in range(0, elements):
            if content in itemslist.get(next_index):
                if next_index < elements - 1:
                    next_index += 1
                    messagebox.showerror("Item not found", "No item could be found containing " + "'" + content + "'")
    def __init__(self):
        searchPrompt = Tk()
        searchPrompt.title("Search list")
        searchPrompt.resizable(0, 0)
        searchText = Label(searchPrompt, text = "Search terms")
        self.searchTerms = Entry(searchPrompt, width = 30)
        self.searchTerms.pack(padx = 10)
        searchbtn = Button(searchPrompt, text = "Search", command = self.searchList)

1. Messagebox not displayed (line 15) when item not found
2. Not all items that contain the search term are highlighted (just the first one it finds)
If you ran the code below what do you think it would print? If the if statement was to changed to "if i > 6:" what would it print? Answer that, without actually running the code, and you will know not only why only the first matching item in the itemslist is selected but also why the message box is not drawn.

for i in range(5):
    if i > 2:   # Change this to 6, what is printed then?
    print('Counted to end')
What is printed? If I change the if comparison to i < 12, what gets printed then?
First try (original code)

After changing to 6

Counted to end

Had to run the code
Does that mean you understand how the break and for...else commands work? If you want to write python programs you need to understand a few basic concepts. You need to know about dictionaries, lists and tuples. You need to understand functions, arguments and return values. You need to know about for (and else can be useful), if-elif-else, break and continue. If you really understand that stuff it is amazing how much easier it is to pick up all the other stuff because the same ideas keep getting used over and over.

Oops! CAPS LOCK was on!
So did that help you solve your problem? Can you see how the break in your code is preventing other code inside your loop from running. Code you probably want to run. Do you now see that you probably wanted to use continue instead of break, but that using for..break..else provides a cleaner solution?

Oops! CAPS LOCK was on!
Break stops a loop. It is breaking the loop after it finds one which is why it doesn't find them all. So when do I stop the loop so that it finds everything?
Read your question out loud to yourself. The answer is there.

I think your problem is you are worrying too much about how to do stuff in python and it is preventing you from seeing how simple this is. I will rephrase your question.

I want to pick up all the rocks. How will I know when to stop picking up rocks?

I use rocks not because I think your head is full of rocks, but because most programming problems are so simple a cavman could do it (reference to old GEICO commercial in the USA). If programming was really hard there wouldn't be millions of people who can program. But new programmers often make the mistake of trying to design code at the keyboard. At the keyboard you need to think about syntax and spelling and punctuation and what commands are available and what arguments the commands take and..... When you become proficient in a language most of that stuff happens subconsciously, but when you are starting it can be overwhelming and make really smart people stupid.

Right now I have two pads of paper and pens and pencils sitting next to me. When I have a problem with the program I am working on it is the pencil and paper I reach for first, not the keyboard. I write my solution using pictures and natural language, not Python or C. When I am happy with the solution I translate it into programming language. Sometimes the translation requires modifications to the solution. but usually not.

Your problem is: If I want to process all the items in a list, how do I know when to stop?

See? Not any harder than picking up rocks.
Thanks. Wise advice!
Got it to work!