криво работает метод наследуемого класса

В конструкторе класса Window в цикле for создаются кнопки, их колличество и именна зависят от списка tables (все кнопки лежат в словаре tableSelectBtns), в поле command передаётся метод из класса dbScripts, аргументом является имя кнопки, проблемма заключается в том, что все кнопки выводят в консоль одно и тоже значение, а именно последний эллемент списка tables, хотя каждая должна выводить в консоль своё имя.

И второй вопрос, класс Window является дочерним классов Tk и dbScripts и по идеи он может спокойно использовать их методы но почему то для методов dbScripts надо писать dbScripts.имяМетода, а иногда в качестве self надо передать dbScripts

tables = dbScripts.allDbTables(self=dbScripts)

почему так я не понимаю, ибо все эти конструкции мне просто пришли в голову, и написал и оно заработало, но почему так работает я не понимаю. Знающие люди, объясните пожалуйста

вот весь код:

import sqlite3 as sql
from tkinter import *
from tkinter import ttk


class dbScripts():
    conn = sql.connect("main.db")
    cursor = conn.cursor()

    def allDbTables(self):
        self.cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
        tables = []
        for i in self.cursor.fetchall():
            tables.append(i[0])
        tables.remove("sqlite_sequence")
        return tables

    def showTable(self, table):
        print(table)


class Window(Tk, dbScripts):
    tables = dbScripts.allDbTables(self=dbScripts)
    tableSelectBtns = {}

    def __init__(self, title: str):
        super().__init__()

        self.title(title)
        self.geometry("1920x1080")
        self.minsize(width=1250, height=500)

        mainFrame = Frame(self, bg="#c8c9c7")
        mainFrame.place(height=35, relwidth=1)

        for table in self.tables:
            self.tableSelectBtns[table] = ttk.Button(mainFrame, text=table, command=lambda: dbScripts().showTable(table))
            self.tableSelectBtns[table].pack(side=LEFT, padx=3)


def main():
    root = Window(title="test")
    root.mainloop()


if __name__ == "__main__":
    main()

Ответы (1 шт):

Автор решения: SD_new

порылся сегодня ещё в инете, очень помог этот ответ: Как правильно передать объект из одного класса в другой?

в кратце что бы передать переменную цикла надо в lamda отдельно её инициализировать

for table in self.tables:
   btn = ttk.Button(mainFrame, text=table, command=lambda table=table: dbScripts().showTable(table))
   btn.pack(side=LEFT, padx=3)

а ещё та муть со славарём, которую я написал не нужна, достатачно одну переменную переинициализировать

→ Ссылка