Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 25, 2023 02:51:06

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

У меня есть класс точка:

 @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)?
Просто интересно разобраться. Заранее спасибо.

Отредактировано Ess (Дек. 25, 2023 02:51:46)

Офлайн

#2 Дек. 25, 2023 08:07:24

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Вопрос по событиям

 mouseCords: TPoint = (event.x, event.y)



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Отредактировано ZerG (Дек. 25, 2023 08:07:41)

Офлайн

#3 Дек. 25, 2023 09:36:25

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

мне нужно к моему типу привести, а не к 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 (Дек. 25, 2023 09:38:15)

Офлайн

#4 Дек. 26, 2023 09:46:34

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

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

в принципе если я добавлю в класс точка

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

я правильно понимаю что код
 mouseCords=TPoint(event.x, event.y)
будет корректен??

Отредактировано Ess (Дек. 26, 2023 09:50:38)

Офлайн

#5 Дек. 26, 2023 21:58:03

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Вопрос по событиям

 @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



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#6 Дек. 27, 2023 02:43:18

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

Zerg
в вашем примере вы создаете 1 экземпляр класса pt и обслуживаете его из функции. Ваша функция и переменная находятся в единой зоне видимости. Но переменная и функция могут быть в разных зонах видимости, они могут быть инкапсулированы другими классами. В этом случае я потеряю видимость переменной. но по факту я должен получить переменную нужного “условного” типа тогда когда мне это нужно.

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

Отредактировано Ess (Дек. 27, 2023 02:46:47)

Офлайн

#7 Дек. 27, 2023 10:55:06

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Вопрос по событиям

Видно что вы пытветесь натянуть на питон другой язык

 @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

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



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#8 Дек. 28, 2023 03:56:06

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

Получается вы тоже питон натягиваете на тот же язык , что и я??

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 . В др языках это принудительно ручная обязанность программиста, ибо ресурс памяти не бесконечен.

В любом случае спасибо для приятное общение!!

Отредактировано Ess (Дек. 28, 2023 04:09:34)

Офлайн

#9 Дек. 28, 2023 13:43:42

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Вопрос по событиям

Вы бы перечитали про переменные в питоне



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#10 Дек. 29, 2023 01:54:27

Ess
Зарегистрирован: 2023-11-08
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по событиям

ZerG
Вы бы перечитали про переменные в питоне
говорит человек который пишет
 mouseCords: TPoint = (event.x, event.y)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version