Question: I've seen some usage of `self.destroy()` within classes but I couldn't get it working with what I wanted it to do.

I have the class `resultsPage` that shows results obtained on another page. I have made the `displayResults(pageNo)` function to show these when `resultsPage` is visible. The problem arises with the back and next buttons which are made to go between pages of results. All widgets are created on top of each other but I want to remove them all then create the new ones. I added `self.destroy()` to try and fix this but it didn't work.

I'm not sure if it's to do with the placement of where I'm defining my functions but I have had a play around with where they're defined and it hasn't changed the error message.

This is a simplified example of my code:

```
class resultsPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

    def onShowFrame(self, event):
        def displayResults(pageNo):
            self.destroy()
            #Create widgets related to pageNo
            #Create back and next buttons e.g.
            back = tk.Button(self, text="<=",
                                 command=lambda: displayResults(pageNo - 1))
        displayResults(1)

```

The error I get is: `_tkinter.TclError: bad window path name ".!frame.!previewresultspage"`

If it helps, I can post my full code but I thought I'd generalise it so it's more helpful to others.

Answer: 
Thierry has provided a very comprehensive explanation of why your code doesn't work as you expect. As such it is the best answer to your question.I have added my answer just as an example of you you can code this in a less complex way .

create the 2d list with the first index as list of numbers. for each iteration take the last index of temp and slice from index 1 to the end then add on index 0.

then return the list

```py
def numbers(list_of_numbers):
    temp = [list_of_numbers]
    for _ in range(1, len(list_of_numbers)):
        temp.append(temp[-1][1:] + temp[-1][0:1])
    return temp
print(numbers([1,2,3,4]))

```

**OUTPUT**

```
[[1, 2, 3, 4], [2, 3, 4, 1], [3, 4, 1, 2], [4, 1, 2, 3]]

```
The problems is in `shallow` assignment of arrays. You should make `deep` copy, to really clone arrays, to make them independent.

I did it in your own code. There are a few changes of your code: 

1. `import copy` that it have been added to first row.
2. Three usages of `copy.deepcopy` function instead of `=`(simple assignment).

```py

    import copy

    def numbers(list_of_numbers):
        finalValues = copy.deepcopy([list_of_numbers])
        #print(list_of_numbers)
        for i in range(1,len(list_of_numbers)):
            print("Last array of final: ", finalValues[-1])
            tempArray = copy.deepcopy(finalValues[-1])
            print("Temp Array: ",tempArray)
            temp = tempArray[0]
            for j in range(0,len(list_of_numbers)-1):
                tempArray[j] = tempArray[j+1]
            tempArray[-1] = temp
            finalValues.append(copy.deepcopy(tempArray))

            print("Final Values: ",finalValues)
        return finalValues

    numbers([1,2,3,4])

```

> 
> Program Output
> 
> 
> 

```
[[4, 1, 2, 3], [4, 1, 2, 3], [4, 1, 2, 3], [4, 1, 2, 3]]

```

> 
> Program Output
> 
> 
> 

```
[[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]]

```