При назначении переменной объекту любого класса и запуске mainloop () Tkinter моя кнопка, использующая метод этого объекта, кажется, всегда использует первый объект, созданный даже после успешной замены переменной новым объектом этого класса.
Те же функции, которые вызываются без кнопок на интерфейсе tkinter, но в оболочке также отлично работают, но просто кажется, что кнопка, которая выполняет метод для переменной, не учитывает назначенный новый объектк переменной.
from tkinter import *
class test():
def __init__(self):
print('Object id in init is: ', id(self))
def method(self):
print('Object id in his method is: ',id(self))
print('We start with a new object defined in main')
obj=test()
def new():
print('Replacing the object with a new object')
global obj
obj=test()
return
def display():
print('Object id in main is: ',id(obj))
return
root=Tk()
frame=Frame(root)
frame.pack()
n=Button(frame, text='new obj', command=new)
n.pack()
p=Button(frame, text='print_id_obj', command = display)
p.pack()
m=Button(frame, text='obj.method', command = obj.method)
m.pack()
root.mainloop()
При нажатии на кнопку p
, а затем m
сначала у меня есть хороший идентификатор для моего объекта (что совершенно нормально), но при нажатии на n
чтобы создать новый объект, сначала отображается новый идентификатор благодаря функции __init__
, затем при нажатии на p
у меня также есть хороший новый идентификатор, но при нажатии на m
отображается отображаемый идентификатор:первый объект, который должен был быть стерт к этому времени, как если бы определение метода кнопки сохранялопервый объект, назначенный var
, и продолжает использовать его при нажатии до тех пор, пока работает mainloop()
.
При закрытии окна tkinter
и вводе var.method()
в оболочке у меня снова появляется новый хороший идентификатор, а также при выполнении вручную этой последовательности действий непосредственно в оболочке без использования tkinter
,У меня в 3 раза больше моего первого идентификатора, затем в 3 раза больше моего нового идентификатора, чего я и ожидал, нажимая мои кнопки.Попробуйте мой код, чтобы понять, что я имею в виду, если вы не поняли.