Python Forum

Full Version: tkinter.TclError: bad window path name
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi all,
I am getting the error _tkinter.TclError: bad window path name ".!toplevel.!frame.!combobox
When I click on the "Columns" button the first time, it opens up a new window no problem.
When I click on the "Exit" button to close out the window and click on the "Columns" button again, I get the bad window error.
It is failing on line 19: column_values[i][j].grid(row=i,column= j)
Below is the code.
Any help would be appreciated.
Thanks in advance.

from tkinter import *
from tkinter import ttk
import tkinter.font as font

def get_columns(field_names):
    new_window = Toplevel(mw)
    new_window.wm_title("Select Columns")
    new_window.geometry('900x500+250+150')

    frame3 = Frame(new_window)
    framebot = Frame(new_window)
    frame3.pack(side=TOP,fill=X)
    framebot.pack(side=BOTTOM,fill=X)

    for i in range(0,max_columns):
      column_values.append([])
      j = 0
      column_values[i].append(ttk.Combobox(frame3,values=field_names))
      column_values[i][j].grid(row=i,column= j)

    exit_button = Button(framebot,text='Exit',font=("Times",16),command=new_window.destroy).pack(side="right")

# Start the main program here
if __name__ == "__main__":
    current_file = __file__
    mw=Tk()
    mw.geometry('900x500+200+150')
    mw.title(current_file)

    frame1 = Frame(mw)
    framebot = Frame(mw)
    frame1.pack(side=TOP,fill=X)
    framebot.pack(side=BOTTOM,fill=X)

    w1 = Label(frame1, text="Database Name: ",font=("Times",16)).pack(side="left")
    dbase = StringVar()
    a1 = ttk.Combobox(frame1,width=40,font=("Times",16),textvar=dbase)
    a1.pack(side="left")

    field_names = ["A.a","B.b","C.c"]
    max_columns = 10
    column_values = []

    btn2 = Button(framebot,text='Columns',font=("Times",16),command=lambda: get_columns(field_names)).pack(side="left")
    btn6 = Button(framebot,text='Exit',font=("Times",16),command=mw.quit).pack(side="right")

    mw.mainloop()
Please post complete unaltered error traceback. It contains information that is very useful in determining cause of error.
The problem is caused by you making a new window each time the Columns button is pressed. Though wasteful and potentially confusing, this would work if you also reset the column_values array.

I added some comments below to point out the problem spots.
def get_columns(field_names):
    new_window = Toplevel(mw)
    new_window.wm_title("Select Columns")
    new_window.geometry('900x500+250+150')

    frame3 = Frame(new_window)
    framebot = Frame(new_window)
    frame3.pack(side=TOP,fill=X)
    framebot.pack(side=BOTTOM,fill=X)
 
    for i in range(0,max_columns):
      column_values.append([])  # 2nd time around column_values is not empty
      j = 0
      # 2nd time around column_values[0] holds two combo boxes, one which doesn't exist
      # anymore because you deleted it.
      column_values[i].append(ttk.Combobox(frame3,values=field_names))
      # column_values[0][0] is the deleted combo box
      column_values[i][j].grid(row=i,column= j)
 
    exit_button = Button(framebot,text='Exit',font=("Times",16),command=new_window.destroy).pack(side="right")
Thanks for your responses. I added "column_values.clear()" before the for loop and that seems to have fixed the problem.
Thanks.