Как определить модель мышки при помощи python
Перейти к содержимому

Как определить модель мышки при помощи python

  • автор:

Игра «Поймай шарик» (часть 1)

Классические алгоритмы и все программы, которые ученики пишут в общеобразовательной школе — это линейные, ветвящиеся, циклические программы, которые стремятся как можно быстрее выполнить поставленную задачу и закончить выполнение. Приложения с графическим интерфейсом пользователя ведут себя иначе. Запустившись один раз, они ждут событий от пользователя программы, чтобы заняться их обработкой. То есть та или иная часть программного кода начинает выполняться лишь тогда, когда случается то или иное событие. Такие программы называются событийно-ориентированными.

События бывают разными. Сработал временной фактор, кто-то кликнул мышкой или нажал Enter, начал вводить текст, переключил радиокнопки, прокрутил страницу вниз и т. д. Когда случается что-то подобное, то, если был создан соответствующий обработчик, происходит срабатывание определенной части программы.

Событийно-ориентированное программирование прекрасно сочетается со структурным программированием (структурированием кода через декомпозицию). Код обработчиков событий удобно оформлять в отдельные функции (такие функции по-английски ещё называют event handler, callback, slot).

Выбор того как именно обрабатывать событие (какой из обработчиков вызывать) называется диспетчеризация событий. В библиотеке PyGame это делается вами вручную, например при помощи разветвлённых конструкций if elif else .

Pygame обрабатывает события с помощью очереди событий. В неё записываются все происходящие события. Вспомним код, который использовался в прошлых лабораторных для рисования картины:

import pygame from pygame.draw import * pygame.init() FPS = 30 screen = pygame.display.set_mode((400, 400)) pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True pygame.quit() 

В цикле используется функция get() модуля event библиотеки pygame — pygame.event.get() . Она забирает список событий из очереди. Основные события — это закрытие окна, нажатие и отпускание кнопки мыши, перемещение мыши, нажатие и отпускание клавиши. Узнать, что за событие произошло, позволяет сравнение типа события event.type с константой из pygame :

Константа Событие
QUIT закрытие окна
KEYDOWN нажатие клавиши
KEYUP поднятие клавиши
MOUSEMOTION движение мыши
MOUSEBUTTONUP отпускание кнопки мыши
MOUSEBUTTONDOWN нажатие кнопки мыши

Cобытия мыши

В pygame обрабатываются три события мыши: нажатие кнопки, отпускание кнопки, перемещение мыши. Какая именно кнопка была нажата, записывается в другое свойство события – button. Для левой кнопки это число 1, для средней – 2, для правой – 3, для прокручивания вперед – 4, для прокручивания назад – 5. У событий MOUSEMOTION (перемещение мыши) вместо button используется свойство buttons, в которое записывается состояние трех кнопок мыши (кортеж из трех элементов).

Координаты мыши записываются в атрибут pos . Таким образом, если вы нажали правую кнопку мыши точно в середине окна размером 200×200, то будет создан объект типа Event с полями event.type = pygame.MOUSEBUTTONDOWN , event.button = 3 , event.pos = (100, 100) .

У событий MOUSEMOTION есть еще один атрибут – rel . Он показывает относительное смещение по обоим осям. С помощью него, например, можно отслеживать скорость движения мыши.

Код ниже создаёт круги в местах клика мыши: красные при клике левой кнопкой, синие при клике правой кнопкой.

import pygame from pygame.draw import * pygame.init() FPS = 30 screen = pygame.display.set_mode((400, 400)) RED = (255, 0, 0) BLUE = (0, 0, 255) pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1: circle(screen, RED, event.pos, 50) pygame.display.update() elif event.button == 3: circle(screen, BLUE, event.pos, 50) pygame.display.update() pygame.quit() 

Заготовка игры «Поймай шарик»

Суть игры проста: в случайном месте появляется на короткое время шарик, и мы должны успеть щелкнуть по нему мышкой.

Вначале создадим появляющиеся шарики:

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
import pygame from pygame.draw import * from random import randint pygame.init() FPS = 2 screen = pygame.display.set_mode((1200, 900)) RED = (255, 0, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) GREEN = (0, 255, 0) MAGENTA = (255, 0, 255) CYAN = (0, 255, 255) BLACK = (0, 0, 0) COLORS = [RED, BLUE, YELLOW, GREEN, MAGENTA, CYAN] def new_ball(): '''рисует новый шарик ''' x = randint(100, 1100) y = randint(100, 900) r = randint(10, 100) color = COLORS[randint(0, 5)] circle(screen, color, (x, y), r) pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True new_ball() pygame.display.update() screen.fill(BLACK) pygame.quit() 

Теперь добавим обработку щелчка мыши. Для начала выведем что-нибудь в консоль:

import pygame from pygame.draw import * from random import randint pygame.init() FPS = 2 screen = pygame.display.set_mode((1200, 900)) RED = (255, 0, 0) BLUE = (0, 0, 255) YELLOW = (255, 255, 0) GREEN = (0, 255, 0) MAGENTA = (255, 0, 255) CYAN = (0, 255, 255) BLACK = (0, 0, 0) COLORS = [RED, BLUE, YELLOW, GREEN, MAGENTA, CYAN] def new_ball(): '''рисует новый шарик ''' x = randint(100, 1100) y = randint(100, 900) r = randint(10, 100) color = COLORS[randint(0, 5)] circle(screen, color, (x, y), r) pygame.display.update() clock = pygame.time.Clock() finished = False while not finished: clock.tick(FPS) for event in pygame.event.get(): if event.type == pygame.QUIT: finished = True elif event.type == pygame.MOUSEBUTTONDOWN: print('Click!') new_ball() pygame.display.update() screen.fill(BLACK) pygame.quit() 

При каждом щелчке в консоли будет появляться надпись «click».

Чтобы определить, попали ли мы в круг, нужно знать его координаты, радиус круга и координаты мыши в момент щелчка. Координаты мыши легко получить через event.pos. Попробуем получить координаты круга:

def click(event): print(x, y, r) 

Не забудьте вставить вызов этой функции click(event) в место диспетчеризации!

И всё равно такой способ не прошел. Почему? В чем суть появившегося сообщения об ошибке, что оно означает?

def new_ball(): global x, y, r x = randint(100,700) y = randint(100,500) r = randint(30,50) color = COLORS[randint(0, 5)] circle(screen, color, (x, y), r) def click(event): print(x, y, r) 

Использование global – это не самое лучшее решение. Для данной задачи больше подходит использование ООП (объектно-ориентированного подхода), но об этом позже. А пока – будем использовать global.

global означает, что переменные будут считаться глобальными (а не локальными), т.е. их значение сохранится и после завершения работы функции, а не будет уничтожено, как это произойдет со всеми локальными переменными.

Осталось проверить, не лежит ли точка (event.x, event.y) дальше, чем r от точки (x,y) . Для этого, с помощью теоремы Пифагора мы найдем расстояние между двумя точками и сравним с радиусом круга.

Задания

  1. Сделать код читабельным и документированным.
  2. Реализовать подсчёт очков.
  3. Сделать шарики двигающимися со случайным отражением от стен.
  4. Реализовать одновременное присутствие нескольких шариков на экране.
    • Добавить второй тип мишени со своей формой и своим специфическим харктером движения.
    • Выдавать за эти мишени другое количество очков.
    • Сделать таблицу лучших игроков, автоматически сохраняющуюся в файл.

Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY.

Найти точку, в зависимости от расположения курсора мыши

Author24 — интернет-сервис помощи студентам

Добрый вечер, коллеги. Проблема следующая: есть 3Д модель, которую нужно вращать лицевой частью в зависимости от расположения мыши: вперёд, назад, влево, вправо. Чтобы вращать модель, функция возвращает точку, к которой будет повернута лицевая часть модели. На изображении показаны 4 зоны, при наведении мыши которых будет задано направление. Требуется написать функцию, которая будет определять две точки x и z, в зависимости от расположения курсора мыши в какой-либо зоне, т.е. если мышь расположена в верхней зоне, она должна вернуть точку с координатами x = 0, z = 1. Снизу мой рабочий кусок кода, но чувствую, что его можно сократить чуть ли не до одной строчки, но так как я не силён в математике, обращаюсь к вам. (Ответ принимаю на любом ЯП)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
protected getStrictPointerPosition(pointerPosition: Vector3): Vector3 { let directionX: number = 0; let directionZ: number = 0; let relPointerPositionX: number = pointerPosition.x - this.root.position.x; let relPointerPositionZ: number = pointerPosition.z - this.root.position.z; let absPointerPositionX: number = Math.abs(relPointerPositionX); let absPointerPositionZ: number = Math.abs(relPointerPositionZ); if (relPointerPositionX > 0 && relPointerPositionZ > 0) { if (absPointerPositionX >= absPointerPositionZ) { directionX = 1; } else { directionZ = 1; } } else if (relPointerPositionX  0 && relPointerPositionZ > 0) { if (absPointerPositionX >= absPointerPositionZ) { directionX = -1; } else { directionZ = 1; } } else if (relPointerPositionX  0 && relPointerPositionZ  0) { if (absPointerPositionX >= absPointerPositionZ) { directionX = -1; } else { directionZ = -1; } } else { if (absPointerPositionX >= absPointerPositionZ) { directionX = 1; } else { directionZ = -1; } } return new Vector3(this.root.position.x + directionX, this.root.position.y, this.root.position.z + directionZ); }

Расстояние, пройденное мышкой

Помнится, когда я еще сидел на винде, у меня была маленькая резидентная программа, которая сидела в системном трее и измеряла расстояние, пройденное мышкой по столу. Расстояние измерялось в метрах, километрах. Было расстояние, пройденное за день, за месяц и за весь период использования.
Хотелось бы такую же программу сделать в линуксе, поскольку я не нашел ни одного аналога. Я бы сделал ее на Python + PyQt 5. Но вот какую библиотеку использовать для сбора этой статистики, я понятия не имею. Вы не могли бы мне подсказать, пожалуйста?

Rinaldus ★★★★★
18.06.17 20:18:45 MSK

модуль ядра пиши 🙂

Harald ★★★★★
( 18.06.17 20:19:54 MSK )
WereFox ★☆
( 18.06.17 20:19:58 MSK )
Ответ на: комментарий от WereFox 18.06.17 20:19:58 MSK

Для прикола. Мне нравится статистика подобного рода.

Rinaldus ★★★★★
( 18.06.17 20:20:42 MSK ) автор топика
Ответ на: комментарий от WereFox 18.06.17 20:19:58 MSK

Статистика это всегда любопытно

man_of_motley ★★
( 18.06.17 20:28:24 MSK )

при чём тут тег «python»?

Никакой статистики нет на самом деле, прекрати мыслить вашими пистонистыми высокоуровнёвыми категориями. Собираешь события смещения указателя с помощью xlib, и, зная сколько у тебя расстояния приходится на пиксель(и), посчитать всё в итоге не сложно

к слову, написать могу и сам, можешь стукануть на мыло

reprimand ★★★★★
( 18.06.17 20:38:11 MSK )

Я бы сделал ее на Python + PyQt 5.

Блин, ну ладно ещё Python (хотя тоже), но Qt-то тут куда? Сделай маленький демон, который логгирует этот дело и пару утилит, которые выводят в текстовом виде в консоль (можно потом добавить ещё вывод в виде html или ещё какой фигни, хоть картинку рендерить с графиком).

Psych218 ★★★★★
( 18.06.17 20:38:54 MSK )

На вяленом не заработает же.

Singularity ★★★★★
( 18.06.17 20:39:09 MSK )
Ответ на: комментарий от reprimand 18.06.17 20:38:11 MSK

и, зная сколько у тебя расстояния приходится на пиксель(и)

В этом проблема, кстати. У меня на мышке вот есть кнопочка переключения dpi (шагами от 300 до 3000 вроде). И сдаётся мне, что этот параметр совершенно неизвестен вне самой мышки, и сама эта кнопка вообще никаких событий не генерирует. Если переключателя нет, то проще, конечно, можно задать это число. Но если переключатель есть, то уже никак.

Psych218 ★★★★★
( 18.06.17 20:40:47 MSK )
Последнее исправление: Psych218 18.06.17 20:42:27 MSK (всего исправлений: 1)

Ответ на: комментарий от Psych218 18.06.17 20:38:54 MSK

Можно было бы сделать консольную версию и GUI для нее. Но для начала надо поискать библиотеку, чтобы было, от чего плясать.

Rinaldus ★★★★★
( 18.06.17 20:43:11 MSK ) автор топика

Я бы отталкивался от прослушивания /dev/input/mouse* . Собственно ЯП уже не так важен будет

Dred ★★★★★
( 18.06.17 20:46:17 MSK )
Ответ на: комментарий от Rinaldus 18.06.17 20:43:11 MSK

Ну в этом нет ничего сложного, выше верно сказали — xlib (см. MotionNotify). Либо (возможно предпочтительнее, дабы к иксам не привязываться) правда тупо из /dev/input/mouse0 читать.

Psych218 ★★★★★
( 18.06.17 20:46:46 MSK )
Последнее исправление: Psych218 18.06.17 20:48:22 MSK (всего исправлений: 1)

Вот даже пример нагуглился

Dred ★★★★★
( 18.06.17 20:49:39 MSK )
Ответ на: комментарий от Singularity 18.06.17 20:39:09 MSK

А оно и не нужно.

awesomebuntu
( 18.06.17 21:05:17 MSK )

В KDE3 был kodometer, сплыл. (

evilface ★★
( 18.06.17 21:52:41 MSK )
Ответ на: комментарий от Psych218 18.06.17 20:40:47 MSK

А это смотря какое расстояние считать. Сколько мышка по столу ездила или сколько курсор по монитору.

peregrine ★★★★★
( 19.06.17 05:54:30 MSK )
Ответ на: комментарий от peregrine 19.06.17 05:54:30 MSK

Очевидно, что сантиметры в общем виде посчитать невозможно. А с пикселями проблем возникнуть не должно. Хотя, на мой взгляд, задача относится к классу «абсолютное ненужно в масштабе видимой вселенной».

MimisGotAPlan
( 19.06.17 07:03:59 MSK )

$ sudo chmod +r /dev/input/mice 
import struct, time from signal import signal, SIGINT, SIGTERM, SIGQUIT mouse_dev = open('/dev/input/mice', 'rb') stat_file = open('mouse_statistics.txt', 'a') def shutdown(*a): stat_file.close() exit() def mouse_statistics(): while True: s, x, y = struct.unpack('Bbb', mouse_dev.read(3)) b = ['_LR_M'[s&i] for i in (1,2,4) if s&i] buttons = ' Buttons: '*any(b) + ''.join(b) t = time.time() print(f' DeltaX: DeltaY: ', file=stat_file) [signal(s, shutdown) for s in (SIGINT, SIGTERM, SIGQUIT)] mouse_statistics() 

anonymous
( 19.06.17 07:06:27 MSK )
Ответ на: комментарий от Psych218 18.06.17 20:40:47 MSK

Не знаю как на линухе, на винде принято мыши обладать ускорением, так что и без переключателя задача нерешаема

khrundel ★★★★
( 19.06.17 07:06:41 MSK )
Ответ на: комментарий от khrundel 19.06.17 07:06:41 MSK

Ускорение софтовое, его узнать хотя бы возможно на каждый момент времени, или по каким алгоритмам делается (у меня ускорения нет, например), так что задача решаема. А вот с DPI нет, потому что информации об этом в системе попросту нет, только в мышке самой. Ну и на сантиметры мыши по столу ускорение влияния не оказывает, только на сантиметры курсора по экрану.

Psych218 ★★★★★
( 19.06.17 07:42:06 MSK )
Ответ на: комментарий от peregrine 19.06.17 05:54:30 MSK

А это смотря какое расстояние считать. Сколько мышка по столу ездила или сколько курсор по монитору.

Хы. Ну это да, с курсором проще будет. DPI монитора обычно всё же известен.

Psych218 ★★★★★
( 19.06.17 07:43:27 MSK )

В каких единицах измерения нужно расстояние? Тебя интересует расстояние которое проходит девайс или указатель?

В случае девайса, я не уверен что такое возможно получить точно.

invy ★★★★★
( 19.06.17 13:57:29 MSK )
Ответ на: комментарий от Psych218 19.06.17 07:42:06 MSK

А вот с DPI нет, потому что информации об этом в системе попросту нет, только в мышке самой.

В конфиге счётчика указать.

polym ★
( 19.06.17 14:10:55 MSK )

Разве это вообщем можно посчитать? Погрешность же дикая будет.

RazrFalcon ★★★★★
( 19.06.17 14:11:34 MSK )
Ответ на: комментарий от RazrFalcon 19.06.17 14:11:34 MSK

Так пусть в пикселях ответы выдает.

cnupm ★
( 19.06.17 15:11:13 MSK )
Ответ на: комментарий от RazrFalcon 19.06.17 14:11:34 MSK

Почему ты считаешь, что погрешность дикая будет? Даже если у тебя 300 dpi мышь, то это больше 11 точек на миллиметр. Через /dev/input/mice мышкой можно вместо рулетки пользоваться, очень точно меряет.

anonymous
( 19.06.17 15:36:12 MSK )
Ответ на: комментарий от anonymous 19.06.17 07:06:27 MSK

Ой, это же питончик.

Deleted
( 19.06.17 15:53:45 MSK )
Ответ на: комментарий от anonymous 19.06.17 15:36:12 MSK

Хз насколько точный там сенсор. Тем более никто не мешает просто поднять мышку и перенести. Сломав всё.

RazrFalcon ★★★★★
( 19.06.17 16:08:59 MSK )
Ответ на: комментарий от MimisGotAPlan 19.06.17 07:03:59 MSK

плюсирую, ведь соотношение пикселей и сантиметров может отличаться от модели мышки и настройки чувствительность и т.д.

I-Love-Microsoft ★★★★★
( 19.06.17 17:14:53 MSK )
Ответ на: комментарий от polym 19.06.17 14:10:55 MSK

I-Love-Microsoft ★★★★★
( 19.06.17 17:15:22 MSK )
Ответ на: комментарий от polym 19.06.17 14:10:55 MSK

Что указать? Есть мышка, на ней кнопка переключатель DPI, как я выше писал. Эта кнопка никаких событий не генерирует, и в системе DPI мышки никак не светится, оно дальше мышки не идёт никуда. Ну укажу я в конфиге 600 dpi, посижу так пять минут, потом захочу поиграть в xonotic, нажму кнопку пару раз, будет 3000 dpi, поиграю пять минут, включу обратно 600, или вообще 300. Каждый раз, когда пользователь нажимает кнопку на мышке, также (пользователю же) править конфиг?

Psych218 ★★★★★
( 19.06.17 19:28:03 MSK )
Последнее исправление: Psych218 19.06.17 19:28:52 MSK (всего исправлений: 1)

Угу, была такая. Вроде immouse называлась.

andreyu ★★★★★
( 20.06.17 13:16:27 MSK )
Ответ на: комментарий от Psych218 18.06.17 20:40:47 MSK

У меня на мышке вот есть кнопочка переключения dpi (шагами от 300 до 3000 вроде).

Я всегда считал, что в данном случае этот параметр влияет исключительно на точность позиционирования, а не пройденное расстояние.

andreyu ★★★★★
( 20.06.17 13:18:50 MSK )
Ответ на: комментарий от Psych218 19.06.17 19:28:03 MSK

С такой мышкой всё понятно, назначить дпи на хоткеи и всё.
Любишь статистику — переключай дпи и в программе замера расстояния.

polym ★
( 20.06.17 13:50:25 MSK )
Ответ на: комментарий от polym 20.06.17 13:50:25 MSK

Ну да, если только так. Только это уже не автоматический (не совсем автоматический) подсчёт и ложится (частично) на плечи пользователя — не забывать тыкать хоткеи.

Psych218 ★★★★★
( 20.06.17 14:02:22 MSK )
Ответ на: комментарий от andreyu 20.06.17 13:18:50 MSK

Я всегда считал, что в данном случае этот параметр влияет исключительно на точность позиционирования, а не пройденное расстояние.

Ну вот теперь знаешь, что нет. При увеличении dpi курсор начинает носиться быстрее, при уменьшении — медленнее. В играх есть такая настройка как sensitivity, и соответственно в конечном итоге оно, естественно, влияет именно на точность наведения. То же можно сделать и в самих иксах (настроить скорость передвижения курсора). Соответственно, если увеличить dpi самой мышки и при этом уменьшить скорость движения курсора в иксах, получим действительно именно увеличенную точность позиционирования. Только вот узнать это в рамках какого-либо демона для измерения «пробега» невозможно. Можно лишь посчитать количество пикселей. Получить сантиметры (ну дюймы точнее) поделив пиксели на dpi. DPI можно задать в конфиге, но при переключении на мышке мы не получаем никаких сигналов, соответственно автоматически изменять значение в конфиге при переключении dpi на мышке не выйдет, только если пользователь нажимая кнопку будет ещё и конфиг менять (да, он может делать это хоткеем в том числе, но это всё равно ручное действие).

Класс инструментов

Позволяет обновить курсор при нажатии на инструмент. По умолчанию значение курсора равно 0. Возможные варианты значения ID курсора показаны здесь:

Возвращает доступность инструмента; значение по умолчанию — True. Когда для этого свойства установлено значение False, инструмент отключен и недоступен. Это свойство позволяет вам создавать логические схемы для проверки состояния настольного приложения для включения или отключения инструментов. Например, может быть создан инструмент, для работы которого требуется, чтобы в ArcMap был загружен слой с данными.

Позволяет указать тип формы, которая будет отображена на карте. Форма может быть использована для выбора объектов, определения экстента или использована как входной параметр для инструментов геообработки. После того, как форма добавлена на карту, она исчезнет с экрана и произойдет вызов соответствующей функции. Функции описываются ниже.

Существуют три типа форм, которые можно определить:

__init__(self)

Это встроенная функция языка Python, которая называется конструктором. В ней могут быть определены первичные переменные. По умолчанию, курсор и включенные свойства инструмента уже установлены.

onDblClick(self)

Вызывается при двойном нажатии на кнопку мыши при активном инструменте.

onCircle(self, circle_geometry)

Вызывается при отпускании кнопки мыши после того, как на карте была нарисована окружность. circle_geometry представляет объект полигона.

onLine(self, line_geometry)

Вызывается при двойном нажатии кнопки мыши после того, как на карте была нарисована линия. line_geometry представляет объект Полилиния.

onRectangle(self, rectangle_geometry)

Вызывается при отпускании кнопки мыши после того, как на карте был нарисован прямоугольник. rectangle_geometry представляет объект Экстент.

onMouseDown(self, x, y, button, shift)

Вызывается при отпускании кнопки мыши при активном инструменте.

  • Значения x и y для функций onMouseDown и onMouseUp представляют координаты окна, в которых кнопка мыши была нажата или отпущена. Значения x и y для функций onMouseDownMap и onMouseUpMap представляют координаты карты, в которых кнопка мыши была нажата или отпущена.
  • button определяет, какая кнопка мыши была нажата. Значения, возвращаемые button, представлены ниже.
  • shift указывает, были ли нажаты клавиши SHIFT , CTRL или ALT , когда кнопка мыши была отпущена. Значения, возвращаемые shift, представлены ниже.

onMouseDownMap(self, x, y, button, shift)

onMouseUp(self, x, y, button, shift)

onMouseUpMap(self, x, y, button, shift)

onKeyDown(self, keycode, shift)

Вызывается, когда клавиша на клавиатуре была нажата ( onKeyDown ) или отпущена ( onKeyUp ) при активном инструменте.

  • keycode определяет, какая кнопка на клавиатуре была нажата.
  • shift определяет, были ли нажаты клавиши SHIFT , CTRL или ALT , когда была нажата клавиша на клавиатуре. Значения, возвращаемые shift , перечислены ниже.

onKeyUp(self, keycode, shift)

deactivate(self)

Код внутри этого метода выполняется, когда нажат другой инструмент (например, инструмент Переместить) и этот инструмент больше не активен.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *