криво работает метод наследуемого класса
В конструкторе класса 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 шт):
порылся сегодня ещё в инете, очень помог этот ответ: Как правильно передать объект из одного класса в другой?
в кратце что бы передать переменную цикла надо в 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)
а ещё та муть со славарём, которую я написал не нужна, достатачно одну переменную переинициализировать