Найти - Пользователи
Полная версия: Вопрос по событиям
Начало » Python для новичков » Вопрос по событиям
1 2
Ess
У меня есть класс точка:
 @dataclass
class TPoint:
    x: int = 0
    y: int = 0

и есть tk canvas. При движении мыши я хочу выводить координаты мыши
self.canvas.bind('<Motion>', self.OnCanvasMouseMove )

Правильно ли будет использовать такой код для функции:
 def OnCanvasMouseMove(self, event):
    mouseCords=TPoint(event.x, event.y)

Мой вопрос возник вот почему:
Если я правильно понимаю. то переменная mouseCords=TPoint(event.x, event.y) каждый раз при сдвиге мыши создает новый экземпляр класса TPoint, но я же должен каждый раз удалять старый экземпляр или он удалиться сам при выходе из метода? или лучше создать поле класса FmouseCords : TPoint = TPoint() и обновлять значения поля в методе движения мыши, но как написано в документации - присвоение переменной тоже создаст новый класс типа целое число(для x и y)?
Просто интересно разобраться. Заранее спасибо.
ZerG
 mouseCords: TPoint = (event.x, event.y)
Ess
мне нужно к моему типу привести, а не к tuple

 a : TPoint = (event.x, event.y)
print(type(a)) #<class 'tuple'>
 a = TPoint(event.x, event.y)
print(type(a)) #<class 'Unit_TTypes.TPoint'>

Ess
в доках написано так
В Python деструктор вызывается не вручную, а полностью автоматически. Это происходит в следующих двух случаях:
когда объект выходит за пределы области видимости
когда счетчик ссылок на объект достигает 0.

в принципе если я добавлю в класс точка
 @dataclass
class TPoint:
    x: int = 0
    y: int = 0
    def __del__(self):
        print('Inside destructor')
то деструктор вызывается, т.е. при движении курсора мыши, переменная получает указатель на новый класс, в этот момент счетчик ссылок на старый класс будет =0, указателей нет на класс -> класс удаляется.

я правильно понимаю что код
 mouseCords=TPoint(event.x, event.y)
будет корректен??
ZerG
 @dataclass
class Point:
    x: int = 0
    y: int = 0
pt = Point()
print(f"T: {type(pt)} {pt}")
pt.x = 3
pt.y = 4
print(f"T: {type(pt)} {pt}")

 T: <class '__main__.Point'> Point(x=0, y=0)
T: <class '__main__.Point'> Point(x=3, y=4)

  def OnCanvasMouseMove(self, event):
    pt.x = event.x
    pt.y = event.y
Ess
Zerg
в вашем примере вы создаете 1 экземпляр класса pt и обслуживаете его из функции. Ваша функция и переменная находятся в единой зоне видимости. Но переменная и функция могут быть в разных зонах видимости, они могут быть инкапсулированы другими классами. В этом случае я потеряю видимость переменной. но по факту я должен получить переменную нужного “условного” типа тогда когда мне это нужно.

т.е. если вам нужно выполнить действие с=а+b, вы же (с) не будите объявлять где то выше или в полях класса, вы сделаете функцию суммы и передадите в нее (а) и (b).
ZerG
Видно что вы пытветесь натянуть на питон другой язык

 @dataclass
class Point:
    x: int 
    y: int 
def updater(x):
    result = Point(x, x+1)
    print(type(result), result, id(result))
for i in range(3):
    updater(i)

 <class '__main__.Point'> Point(x=0, y=1) 2340466024208
<class '__main__.Point'> Point(x=1, y=2) 2340466024208
<class '__main__.Point'> Point(x=2, y=3) 2340466024208

Как видно у переменной один и тот же айди и тип
Попробуйте сформулировать вопрос по другому а то у вас то видимость то тип и непонятно что же в итоге вам требуется
Ess
Получается вы тоже питон натягиваете на тот же язык , что и я??

ZerG
 def updater(x):
    result = Point(x, x+1)

я так и писал в 1 посте

  def OnCanvasMouseMove(self, event):
    mouseCords=TPoint(event.x, event.y)

собственно это и спрашивал))) только у меня класс TPoint а у вас Point, Мне это и было интересно корректна ли такая запись (C=TPoint(A,B) ), когда в условную переменную передается указатель на вновь созданный класс с созданием класса, но без удаления предыдущего , но как я понял да корректна.

Я и ожидал ответ: “Да корректна, т.к. при выходе из функции переменной присвоится новый адрес. в старом счетчик станет =0, и вызовется деструктор автоматом” или “Нет. нужно удалить старый созданный класс”

А вообще объектное программирование трудно на что то натягивать, его парадигмы неизменны для любого языка. Просто я не привык еще что питон например сам вызывает деструктор созданного/объявленного класса при выходе из зоны видимости или счетчике указателей =0 . В др языках это принудительно ручная обязанность программиста, ибо ресурс памяти не бесконечен.

В любом случае спасибо для приятное общение!!
ZerG
Вы бы перечитали про переменные в питоне
Ess
ZerG
Вы бы перечитали про переменные в питоне
говорит человек который пишет
 mouseCords: TPoint = (event.x, event.y)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB