При повторной передаче имею ошибку TypeError: missing 1 required positional argument: 'self'
Господа, имею проблему. Подтягиваю значения из базы данных, визуализированные посредством метода Treeview в сторонее окно. В первый раз подтягивается, но когда хочу его изменить и вызвать окно с Treeview еще раз, то получаю ошибку TypeError: WindowMashins() missing 1 required positional argument: 'self'. Вот окно, из которого осуществляю вызов базы
from WindowMashins import Basad
from SetSizes import SetSizes
from OperationSwitch import OperationSwitch
from InductorParams import InductorParams
from Materials import Materials
class EntranceDataFirst():
def __init__(self):
self.bif1=""
self.GUI(self.bif1)
def GUI(self, bif1):
self.EntranceDataWindow = Tk()
self.EntranceDataWindow.geometry('640x700') # геометрия окна
self.EntranceDataWindow.title("Параметры для расчета технологического процесса МИОМ") # название окна
self.frame = Frame(self.EntranceDataWindow, relief=RAISED, borderwidth=1)
self.frame.pack(fill=BOTH, expand=True)
btn1 = Button(self.frame, text="Выбор оборудования", bg="blue", fg="black", command=self.WindowMashins)
btn2 = Button(self.frame, text="Выбор операции", bg="blue", fg="black", command=self.WindowOperationSwitch)
btn3 = Button(self.frame, text="Выбор материала", bg="blue", fg="black", command=self.WindowMaterials)
btn4 = Button(self.frame, text="Размер заготовки", bg="blue", fg="black", command=self.SetSizes)
self.message_entry = Entry(self.frame, textvariable='')
self.message_entry.insert(0, bif1)
self.message_entry.place(x=350, y=100)
self.message_entry1 = Entry(self.frame, textvariable='')
self.message_entry1.place(x=350, y=200)
self.message_entry2 = Entry(self.frame, textvariable='')
self.message_entry2.place(x=350, y=300)
self.message_entry3 = Entry(self.frame, textvariable='')
self.message_entry3.place(x=350, y=400)
btn1.place(x=50, y=100)
btn2.place(x=50, y=200)
btn3.place(x=50, y=300)
btn4.place(x=50, y=400)
closeButton = Button(self.EntranceDataWindow, text="Close", command=quit)
closeButton.pack(side=RIGHT, padx=5, pady=5)
okButton = Button(self.EntranceDataWindow, text="OK")
okButton.pack(side=RIGHT)
self.EntranceDataWindow.mainloop()
def WindowMashins(self):
self.EntranceDataWindow.destroy()
self.bif1=''
window=Basad()
отыгрывает процедура WindowMashins. При этом само окно закрывается при помощи destroy.
вот окно с базой
import sqlite3
from SQL12 import *
import EntranceData
from Terminator import Terminator
from EditorMashins import *
class Basad():
def GUI (self):
self.BasaM2 = Tk()
self.BasaM2.geometry('1800x1000')
self.BasaM2.title("Выбор оборудования МИОМ")
self.Tree = ttk.Treeview(self.BasaM2, columns=(
"Name", "Max_change_energi", "Condenser_capasity", "Equipment_induct", "SccF", "K1", "K2"), height=5,
show='headings')
self.Tree.column("Name", width=250, anchor=tk.CENTER)
self.Tree.column("Max_change_energi", width=190, anchor=tk.CENTER)
self.Tree.column("Condenser_capasity", width=250, anchor=tk.CENTER)
self.Tree.column("Equipment_induct", width=230, anchor=tk.CENTER)
self.Tree.column("SccF", width=280, anchor=tk.CENTER)
self.Tree.column("K1", width=60, anchor=tk.CENTER)
self.Tree.column("K2", width=50, anchor=tk.CENTER)
self.Tree['show'] = "headings"
self.Tree.heading("Name", text="Наименование оборудования")
self.Tree.heading("Max_change_energi", text="Максимальная энергия")
self.Tree.heading("Condenser_capasity", text="Емкость батареи кондецаторов")
self.Tree.heading("Equipment_induct", text=" Собственная индуктивность")
self.Tree.heading("SccF", text="Частота тока короткого замыкания")
self.Tree.heading("K1", text="K1")
self.Tree.heading("K2", text="K2")
self.Tree.place(x=400, y=10)
self.slct2 = ['Выбери из таблицы', 'Выбери из таблицы', 'Выбери из таблицы', 'Выбери из таблицы',
'Выбери из таблицы', 'Выбери из таблицы', 'Выбери из таблицы']
self.field1 = self.slct2[0]
self.field2 = self.slct2[1]
self.field3 = self.slct2[2]
self.field4 = self.slct2[3]
self.field5 = self.slct2[4]
self.field6 = self.slct2[5]
self.field7 = self.slct2[6]
self.btn = Button(self.BasaM2, text="Добавить оборудование", bg="grey", fg="black",
command=self.AddMashins) # описание объекта типа button названия кнопки
self.btn.place(x=250, y=800) # расположение кнопки
self.btn5 = Button(self.BasaM2, text="Редактировать оборудование", bg="grey", fg="black",
command=self.clicked2) # описание объекта типа button названия кнопки
self.btn5.place(x=750, y=800) # расположение кнопки
self.btn2 = Button(self.BasaM2, text="Удалить оборудование", bg="grey", fg="black",
command=self.DellMashins) # описание объекта типа button названия кнопки
self.btn2.place(x=500, y=800) # расположение кнопки
self.btn3 = Button(self.BasaM2, text="Применить", bg="grey", fg="black",
command=self.SelectlMashins) # описание объекта типа button названия кнопки
self.btn3.place(x=1000, y=800) # расположение кнопки
self.btn1 = Button(self.BasaM2, text="Отменить", bg='pink', fg='red', command=self.BasaM2.destroy)
self.btn1.place(x=1250, y=800)
self.btn4 = Button(self.BasaM2, text="Взять данные в работу", bg='green', fg='black', command=self.GoToWork)
self.btn4.place(x=50, y=800)
if self.field1 == 'Выбери из таблицы': self.btn4['state'] = 'disabled'
label1 = Label(self.BasaM2, text="Название оборудования", bg="grey", fg="black")
self.message_entry = Entry(self.BasaM2, textvariable='')
self.message_entry.insert(0, self.field1)
self.message_entry.place(x=50, y=75)
label2 = Label(self.BasaM2, text="Максимальная энергия заряда", bg="grey", fg="black")
self.message_entry1 = Entry(self.BasaM2, textvariable='')
self.message_entry1.place(x=50, y=175)
self.message_entry1.insert(0, self.field2)
label3 = Label(self.BasaM2, text="Емкость батареи кондецаторов", bg="grey", fg="black")
self.message_entry2 = Entry(self.BasaM2, textvariable='')
self.message_entry2.place(x=50, y=275)
self.message_entry2.insert(0, self.field3)
label4 = Label(self.BasaM2, text="Собственная индуктивность разрядного контура", bg="grey", fg="black")
self.message_entry3 = Entry(self.BasaM2, textvariable='')
self.message_entry3.place(x=50, y=375)
self.message_entry3.insert(0, self.field4)
label5 = Label(self.BasaM2, text="Частота тока короткого замыкания", bg="grey", fg="black")
self.message_entry4 = Entry(self.BasaM2, textvariable='')
self.message_entry4.place(x=50, y=475)
self.message_entry4.insert(0, self.field5)
label6 = Label(self.BasaM2, text="K1", bg="grey", fg="black")
self.message_entry5 = Entry(self.BasaM2, textvariable='')
self.message_entry5.place(x=50, y=575)
self.message_entry5.insert(0, self.field6)
label7 = Label(self.BasaM2, text="K2", bg="grey", fg="black")
self.message_entry6 = Entry(self.BasaM2, textvariable=self.field7)
self.message_entry6.place(x=50, y=675)
self.message_entry6.insert(0, self.field7)
label1.place(x=50, y=50)
label2.place(x=50, y=150)
label3.place(x=50, y=250)
label4.place(x=50, y=350)
label5.place(x=50, y=450)
label6.place(x=50, y=550)
label7.place(x=50, y=650)
def clicked2(self):
sel = self.Tree.focus()
self.slct2 = self.Tree.item(sel, option='values')
self.field1 = self.slct2[0]
self.field2 = self.slct2[1]
self.field3 = self.slct2[2]
self.field4 = self.slct2[3]
self.field5 = self.slct2[4]
self.field6 = self.slct2[5]
self.field7 = self.slct2[6]
NewWindow = Editor(self.field1, self.field2, self.field3, self.field4, self.field5, self.field6, self.field7)
def AddMashins(self):
self.field1 = ""
self.field2 = ""
self.field3 = ""
self.field4 = ""
self.field5 = ""
self.field6 = ""
self.field7 = ""
NewWindow = Editor(self.field1, self.field2, self.field3, self.field4, self.field5, self.field6, self.field7)
def DellMashins(self):
sel = self.Tree.focus()
self.slct2 = self.Tree.item(sel, option='values')
self.field1=self.slct2[0]
print(self.slct2)
print(self.slct2[0])
print(self.field1)
NewWindow2 = Terminator(self.field1)
def SelectlMashins(self):
self.btn4['state'] = 'active'
sel=self.Tree.focus()
self.message_entry.delete(0, END)
self.message_entry1.delete(0, END)
self.message_entry2.delete(0, END)
self.message_entry3.delete(0, END)
self.message_entry4.delete(0, END)
self.message_entry5.delete(0, END)
self.message_entry6.delete(0, END)
self.slct2=self.Tree.item(sel, option='values')
self.field1=self.slct2[0]
self.message_entry.insert(0, self.field1)
self.field2=self.slct2[1]
self.message_entry1.insert(0, self.field2)
self.field3=self.slct2[2]
self.message_entry2.insert(0, self.field3)
self.field4=self.slct2[3]
self.message_entry3.insert(0, self.field4)
self.field5=self.slct2[4]
self.message_entry4.insert(0, self.field5)
self.field6=self.slct2[5]
self.message_entry5.insert(0, self.field6)
self.field7=self.slct2[6]
self.message_entry6.insert(0, self.field7)
print("наименование оборудования "+self.field1)
print("максимальная энергия"+self.field2)
print('Емкость батарей конденсаторов ' + self.field3)
print('Собственная индуктивность ' + self.field4)
print('Частота тока короткого замыкания '+self.field5)
print('K1 '+ self.field6)
print("K2 "+ self.field7)
print(self.slct2)
def view_records(self):
mt = sqlite3.connect("mashins.db")
cursor = mt.cursor()
cursor.execute(sql6)
cursor.execute(sql6)
for row in cursor.execute(sql6): print(row)
cpt = 0 # Counter representing the ID of your code.
for row in cursor.execute(sql6):
# I suppose the first column of your table is ID
self.Tree.insert('', 'end', text=str(cpt), values=row)
cpt += 1 # increment the I
def GoToWork(self):
self.BasaM2.destroy()
EntranceData.EntranceDataFirst.GUI(EntranceData.EntranceDataFirst,self.field1)
def __init__(self):
self.GUI()
self.view_records()
self.BasaM2.mainloop()
Процедура GoToWork возвращает нужное значение на предыдущую форму, при этом есть destroy предыдущего окна. все вроде бы работает, но при повторном вызове базы возникает ошибка TypeError. Читал, что необходимо заводить и во воремя уничтожать объект класса. Подозреваю, что я не правильно использую Treeview. Был бы благодарен за комментарии.
Ответы (1 шт):
Не правильно вызывал окно. Для того, чтобы все было правильно, нужно было при повторном вызове формы с результатами выборки из базы данных инициализировать её как объект класса c передачей классу соотвествующего параметра, а не пытаться вызвать путем вызова процедуры GUI с передачей1 параметра ей. Вот так должно было быть
def GoToWork(self):
self.BasaM2.destroy()
f=EntranceData.EntranceDataFirst(self.field1)