There are a few things that need looking at. There seems to be an error in the 'def add_item' method. The 'Build the SQL' section joins sections for table, column names and new values from the entry boxes but both the last two .format methods insert 'column_names' whereas I would expect the last one to be 'entries'. You seem to have got confused with the use of *args. In 'main' you have create_table(db, tbl, *columns) and demo_window = EntryWindow(root, *[db, tbl]) The * (asterix) is used in the method definition as a place holder for the arguments that may not appear in the method call. If they do appear then they will be accessible as a tuple in the body of the method definition. So create_table(db, tbl, columns) # no * would pass the columns list as the first item of the *col_defs in the create_table method as col_defs[0]. demo_window = EntryWindow(root, [db, tbl]) # no * would pass the db and table list as the first item of the *args in the EntryWindow method again as args[0][0] and args[0][1]. Note the double indices. The first accesses the first item in the *args tuple (even if there is only one!) and the second accesses the item within your list. You could change the call to demo_window = EntryWindow(root, db, tbl) # no list and still no * and then use args[0] and args[1] as you have done.