Показать чувствительность мышки (DPI)
Как в Линуксе показать (или рассчитать) чувствительность мышки?
У меня следующая модель:
Bus 003 Device 008: ID 046d:c062 Logitech, Inc. M-UAS144 [LS1 Laser Mouse]
В сети я, к сожалению, не нашел инфу.
Хочу сравнить мышки по юзабилити в плане DPI.
forest22 ★
21.10.17 13:09:37 MSK
Попробуй что-нибудь из этого. Могу ошибаться.
/usr/sbin/hwinfo --mouse
xinput --list-props
sudo apt install python-pip sudo pip install rivalcfg rivalcfg -l
ult ★
( 21.10.17 13:41:34 MSK )
Ответ на: комментарий от ult 21.10.17 13:41:34 MSK

Пока без успеха.
forest22 ★
( 21.10.17 14:02:05 MSK ) автор топика

Знаю, как узнать/настроить refresh/polling rate в герцах: https://gitlab.com/iankelling/evhz. Задается через параметр ядра usbhid.mousepoll. Но это немного другое.
На счет DPI не знаю. Нужен специфический софт/драйвер для конкретной мыши. В системе оно задается обычно через настройки мыши с «ползунками» скорости, чувствительности и т.д.
Ну а если тебе просто надо:
Хочу сравнить мышки по юзабилити в плане DPI
то смотри в инете их технические характеристики. Как-то так.
Gonzo ★★★★★
( 21.10.17 16:28:37 MSK )
Ответ на: комментарий от ult 21.10.17 13:41:34 MSK

Он вроде только для SteelSeries Rival мышей, как razercfg — для Razer девайсов. Слишком специфично и вряд ли будет работать.
Gonzo ★★★★★
( 21.10.17 16:32:24 MSK )
Ответ на: комментарий от Gonzo 21.10.17 16:32:24 MSK

Именно на эту мышку (Logitech) не могу найти. Разные сведения. Пишут «5000» и «1100». Конечно, скорее 1100.
Создаем 2D игру на Python с библиотекой Arcade
Мы продолжаем делится с вами интересными найденными вещами про питончик. Сегодня вот решили разобраться с 2D играми. Это, конечно, немного попроще, чем то, что проходят у нас на курсе «Разработчик Python», но не менее интересно это уж точно.
Python — выдающийся язык для начинающих изучать программирование. Он также идеально подходит тем, кто хочет “просто взять и сделать”, а не тратить кучу времени на шаблонный код. Arcade — библиотека Python для создания 2D игр, с низким порогом вхождения, но очень функциональная в опытных руках. В этом статье я объясню, как начать использовать Python и Arcade для программирования игр.
Я начал разрабатывать на Arcade после преподавания азов библиотеки PyGame студентам. Я очно преподавал PyGames в течение почти 10 лет, а также разработал ProgramArcadeGames.com для обучения онлайн. PyGames отличная, но в какой-то момент я понял, что устал тратить время на оправдание багов, которые никогда не фиксятся.
Меня беспокоило преподавание таких вещей, как событийный цикл, которым уже почти не пользовались. И был целый раздел, в котором я объяснял, почему y-координаты повернуты в противоположном направлении. PyGames обновлялась редко и базировалась на старой библиотеке SDL 1, а не чем-то более современном вроде OpenGL. На светлое будущее я не рассчитывал.
В моих мечтах была простая и мощная библиотека, которая бы использовала новые фичи Python 3, например, декораторы и тайп-хинтинг. Ей оказалась Arcade. Посмотрим, как начать ее использовать.

Установка
Arcade, как и многие другие пакеты, доступна на PyPi, а значит, можно установить Arcade при помощи команды pip (или pipenv). Если Python уже установлен, скорее всего можно просто открыть командную строку Windows и написать:
pip install arcade
А в Linux и MacOS:
pip3 install arcade
Для более детализированной инструкции по установке, почитайте документацию по установке Arcade.
Простой рисунок
Вы можете открыть окно и нарисовать простой рисунок всего несколькими строчками кода. В качестве примера, нарисуем смайлик, как на картинке ниже:

Скрипт ниже показывает, как это сделать, используя команды рисования Arcade. Заметьте, что вам не обязательно знать, как использовать классы или определять функции. Программирование с быстрым визуальным фидбеком — хороший старт для тех, кто только учится.
import arcade # Задать константы для размеров экрана SCREEN_WIDTH = 600 SCREEN_HEIGHT = 600 # Открыть окно. Задать заголовок и размеры окна (ширина и высота) arcade.open_window(SCREEN_WIDTH, SCREEN_HEIGHT, "Drawing Example") # Задать белый цвет фона. # Для просмотра списка названий цветов прочитайте: # http://arcade.academy/arcade.color.html # Цвета также можно задавать в (красный, зеленый, синий) и # (красный, зеленый, синий, альфа) формате. arcade.set_background_color(arcade.color.WHITE) # Начать процесс рендера. Это нужно сделать до команд рисования arcade.start_render() # Нарисовать лицо x = 300 y = 300 radius = 200 arcade.draw_circle_filled(x, y, radius, arcade.color.YELLOW) # Нарисовать правый глаз x = 370 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) # Нарисовать левый глаз x = 230 y = 350 radius = 20 arcade.draw_circle_filled(x, y, radius, arcade.color.BLACK) # Нарисовать улыбку x = 300 y = 280 width = 120 height = 100 start_angle = 190 end_angle = 350 arcade.draw_arc_outline(x, y, width, height, arcade.color.BLACK, start_angle, end_angle, 10) # Завершить рисование и показать результат arcade.finish_render() # Держать окно открытым до тех пор, пока пользователь не нажмет кнопку “закрыть” arcade.run()
Использование функций
Конечно, писать код в глобальном контексте — не лучший способ. К счастью, использование функций поможет улучшить ваш код. Ниже приведен пример того, как нарисовать елку в заданных координатах (x, y), используя функцию:
def draw_pine_tree(x, y): """ Эта функция рисует елку в указанном месте""" # Нарисовать треугольник поверх ствола. # Необходимы три x, y точки для рисования треугольника. arcade.draw_triangle_filled(x + 40, y, # Point 1 x, y - 100, # Point 2 x + 80, y - 100, # Point 3 arcade.color.DARK_GREEN) # Нарисовать ствол arcade.draw_lrtb_rectangle_filled(x + 30, x + 50, y - 100, y - 140, arcade.color.DARK_BROWN)
Для полного примера, посмотрите рисунок с функциями.

Более опытные программисты знают, что современные программы сначала загружают графическую информацию на видеокарту, а затем просят ее отрисовать batch-файлом. Arcade это поддерживает. Индивидуальная отрисовка 10000 прямоугольников занимает 0.8 секунды. Отрисовка того же количества батником займет менее 0.001 секунды.
Класс Window
Большие программы обычно базируются на классе Window или используют декораторы. Это позволяет программисту писать код, контролирующий отрисовку, обновление и обработку входных данных пользователя. Ниже приведен шаблон для программы с Window-основой.
import arcade SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 class MyGame(arcade.Window): """ Главный класс приложения. """ def __init__(self, width, height): super().__init__(width, height) arcade.set_background_color(arcade.color.AMAZON) def setup(self): # Настроить игру здесь pass def on_draw(self): """ Отрендерить этот экран. """ arcade.start_render() # Здесь код рисунка def update(self, delta_time): """ Здесь вся игровая логика и логика перемещения.""" pass def main(): game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT) game.setup() arcade.run() if __name__ == "__main__": main()
В классе Window есть несколько методов, которые ваши программы могут переопределять для обеспечения функциональности. Вот список тех, что используются чаще всего:
- on_draw: Весь код для отрисовки экрана находится здесь.
- update: Весь код для перемещения объектов и отработки игровой логики находится здесь. Вызывается примерно 60 раз в секунду.
- on_key_press: Обрабатывает события при нажатии кнопки, например, движение персонажа.
- on_key_release: Обрабатывает события при отпускании кнопки, например, остановка персонажа.
- on_mouse_motion: Вызывается каждый раз при движении мышки.
- on_mouse_press: Вызывается при нажатии кнопки мыши.
- set_viewport: Эта функция используется в скроллерах, когда мир значительно больше, чем то что видно на одном экране. Вызов set_viewport позволяет программисту задать ту часть экрана, которая будет видна.
Спрайты
Спрайты — простой способ создания 2D bitmap объектов в Arcade. В нем есть методы, позволяющие с легкостью рисовать, перемещать и анимировать спрайты. Также можно использовать спрайты для отслеживания коллизий между объектами.
Создание спрайта
Создать инстанс Sprite класса Arcade очень легко. Программисту необходимо только название файла изображения, на котором будет основываться спрайт, и, опционально, число раз для увеличения или уменьшения изображения. Например:
SPRITE_SCALING_COIN = 0.2 coin = arcade.Sprite("coin_01.png", SPRITE_SCALING_COIN)
Этот код создает спрайт, используя изображение coin_01.png. Картинка уменьшится до 20% от исходной.
Список спрайтов
Спрайты обычно организуются в списки. Они помогают упростить их управление. Спрайты в списке будут использовать OpenGl для групповой batch-отрисовки. Нижеприведенный код настраивает игру, где есть игрок и множество монет, которые игрок должен собрать. Мы используем два списка — один для игрока и один для монеток.
def setup(self): """ Настроить игру и инициализировать переменные. """ # Создать список спрайтов self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # Счет self.score = 0 # Задать игрока и # Его изображение из kenney.nl self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING_PLAYER) self.player_sprite.center_x = 50 # Стартовая позиция self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) # Создать монетки for i in range(COIN_COUNT): # Создать инстанс монеток # и их изображение из kenney.nl coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING_COIN) # Задать положение монеток coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # Добавить монетку к списку self.coin_list.append(coin)
Мы с легкостью можем отрисовать все монетки в списке монеток:
def on_draw(self): """ Нарисовать все """ arcade.start_render() self.coin_list.draw() self.player_list.draw()
Отслеживание коллизий спрайтов
Функция check_for_collision_with_list позволяет увидеть, если спрайт наталкивается на другой спрайт из списка. Используем ее, чтобы увидеть все монетки, с которыми пересекается спрайт игрока. Применив простой for- цикл, можно избавиться от монетки в игре и увеличить счет.
def update(self, delta_time): # Сгенерировать список всех спрайтов монеток, которые пересекаются с игроком. coins_hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # Пройтись циклом через все пересекаемые спрайты, удаляя их и увеличивая счет. for coin in coins_hit_list: coin.kill() self.score += 1
С полным примером можно ознакомиться в collect_coins.py.
Игровая физика
Во многих играх есть физика в том или ином виде. Самые простое, например, что top-down игры не позволяют игроку проходить сквозь стены. Платформеры добавляют сложности с гравитацией и движущимися платформами. Некоторые игры используют полноценные физические 2D движки с массами, трением, пружинами и тд.
Top-down игры

Для простых игр с видом сверху программе на Arcade необходим список стен (или чего-то подобного), через которые игрок не сможет проходить. Обычно я называю это wall_list. Затем создается физический движок в установочном коде класса Window:
self.physics_engine = arcade.PhysicsEngineSimple(self.player_sprite, self.wall_list)
player_sprite получает вектор движения с двумя атрибутами change_x и change_y. Просто пример использования — перемещение игрока с помощью клавиатуры.
MOVEMENT_SPEED = 5 def on_key_press(self, key, modifiers): """Вызывается при нажатии пользователем клавиши""" if key == arcade.key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif key == arcade.key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif key == arcade.key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED elif key == arcade.key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED def on_key_release(self, key, modifiers): """Вызывается, когда пользователь отпускает клавишу""" if key == arcade.key.UP or key == arcade.key.DOWN: self.player_sprite.change_y = 0 elif key == arcade.key.LEFT or key == arcade.key.RIGHT: self.player_sprite.change_x = 0
Несмотря на то что этот код задает скорость игрока, он его не перемещает. Метод update в классе Window вызывает physics_engine.update(), что заставит игрока двигаться, но не через стены.
def update(self, delta_time): """ Передвижение и игровая логика """ self.physics_engine.update()
Пример полностью можно посмотреть в sprite_move_walls.py.
Платформеры

Переход к платформеру с видом сбоку достаточно прост. Программисту необходимо переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную константу.
self.physics_engine = arcade.PhysicsEnginePlatformer(self.player_sprite, self.wall_list, gravity_constant=GRAVITY)
Для добавления тайлов и блоков, из которых будет состоять уровень, можно использовать программу вроде Tiled.
Учитесь на примере
Учиться на примере — один из лучших методов. В библиотеке Arcade есть большой список образцов программ, на которые можно ориентироваться при создании игры. Эти примеры раскрывают концепты игр, о которых спрашивали мои онлайн и оффлайн студенты в течение нескольких лет.
Запускать демки при установленной Arcade совсем не сложно. В начале программы каждого примера есть комментарий с командой, которую нужно ввести в командную строку для запуска этого примера. Например:
python -m arcade.examples.sprite_moving_platforms
Как всегда ждём ваши комментарии и вопросы, которые можно оставить тут или зайти к Стасу на день открытых дверей.
Словарь ModelBuilder
Блок-схема модели – это все, что вы видите, когда редактируете модель в ModelBuilder , в том числе ее внешний вид, а также компоновка инструментов и переменных в модели.
Элементы
- С помощью инструментов геообработки выполняются различные операции с географическими или табличными данными. Когда инструменты добавляются в модель, они становятся элементами модели. Можно открыть диалоговое окно любого инструмента геообработки в модели, чтобы задать входные и выходные параметры.
- Переменные являются элементами модели, в которых хранятся значения или ссылки на данные. Существует два типа переменных: данные и значения.
- Соединители соединяют данные и значения с инструментами. Стрелки соединителя указывают направление обработки. Есть четыре типа соединителей: данные, среда, предварительное условие и обратная связь.
- Группы являются визуальными элементами, которые группируют вместе связанные инструменты. Эти группы можно разворачивать и сворачивать, чтобы показывать или скрывать инструменты, таким образом для работы с ними будет больше визуального пространства.
Расположенные ниже таблица и изображение показывают разные элементы модели в ModelBuilder .

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


Переменные значений представляют собой значения, такие как строки, числа, логические значения (true/false), пространственные привязки, линейные единицы или экстенты. Переменные значений могут содержать что угодно, кроме слоев и ссылок на данные, хранящиеся на диске.
Переменная производного значения
Значения, появляющиеся в результате работы инструмента. Производные значения могут быть входными значениями для других инструментов. Например, инструмент Вычислить значение выдает результат вычисления логического или математического выражения.
Инструменты – инструменты геообработки, добавленные в модель. Это все инструменты, которые можно найти в системном наборе инструментов, а также пользовательские модели и инструменты-скрипты. Инструменты в ModelBuilder также включают специальные инструменты, например, итераторы, утилиты ModelBuilder и логические инструменты ModelBuilder .
Итераторы — это специальные инструменты ModelBuilder , которые повторяют одну операцию или цикл для набора входных данных или значений.

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

Логические инструменты используются для контроля логики исполнения моделей. Один из логических инструментов – Остановить .

Утилиты ModelBuilder – это инструменты, полезные при создании моделей и работе в ModelBuilder , но не при написании скриптов.

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

Процесс модели состоит из инструмента и всех переменных, соединенных с ним. Соединительные линии показывают последовательность выполнения. Несколько процессов могут быть связаны вместе, образуя более крупный процесс. Процессы модели могут быть в одном из четырех состояний: не готов к выполнению, готов в выполнению, выполняется и был выполнен.
Не готов к выполнению
Когда вы первоначально перетаскиваете инструмент в окно ModelBuilder , процесс находится в состоянии «не готов к выполнению», поскольку требуемые значения параметров еще не указаны. Инструменты и все его входные данные показаны серыми.
Готов к выполнению
Процесс готов к запуску, когда для инструмента заполнены все необходимые параметры. Все элементы модели в процессе имеют свой цвет.
Выполнение
Процесс находится в состоянии «выполняется», если инструменты модели показаны красным цветом.
Выполнен
Если запуск модели производится в ModelBuilder , инструменты и производные элементы данных отображаются с тенями. Это означает, что процесс уже выполнялся и были получены производные данные.

Типы переменных

Входными переменными в моделях могут быть одно значение, несколько значений или таблица переменных значений. Переменные с одним и несколькими значениями поддерживают один тип данных. Таблица переменных значений позволяет добавлять более одного типа данных. Вы можете создать переменную модели, нажав кнопку Переменная на вкладке ModelBuilder или кнопку Создать переменную в контекстном меню вида модели. В диалоговом окне Тип данных переменной можно установить флажок Несколько значений , чтобы создать переменную с несколькими значениями, или установить флажок Таблица значений , чтобы создать таблицу переменных значений. Некоторые типы данных имеют специальные пользовательские элементы управления, например, список полей, экстент, система координат и т. д. с взаимодействием, зависящим от конкретного элемента управления.
Проверка
Проверка модели представляет собой процесс, который должен гарантировать, что все переменные модели (данные или значения) корректны.
Параметры среды
Настройки среды геообработки – это дополнительные настройки, влияющие на работу инструментов. Эти настройки позволяют гарантировать, что геообработка выполняется в контролируемой среде. Например, вы можете задать экстент обработки, чтобы ограничить обработку определенной географической областью, или задать систему координат для всех выходных наборов геоданных.
Три уровня настроек среды применяются в ModelBuilder :
- Настройки среды уровня проекта – это настройки, которые применяются к любому инструменту, выполняющемуся в текущем проекте. Эти настройки сохраняются в проекте.
- Параметры уровня модели задаются и сохраняются с моделью и замещают настройки уровня проекта.
- Настройки среды уровня процесса модели применяются к однократному запуску инструмента, сохраняются в модели и перезаписывают настройки среды уровня проекта и уровня модели.
Среда рабочей области
Чтобы упростить управление данными модели, в ModelBuilder можно использовать четыре параметра среды рабочей области.
- Временная база геоданных Параметр среды Временная база геоданных – это местоположение файловой базы геоданных, которую можно использовать для записи временных данных. Временная база геоданных – это местоположение, куда по умолчанию записываются выходные данные модели. Используйте эту базу геоданных, указав путь к выходному набору данных как %scratchgdb%\output .
- Временная папка Параметр среды Временная папка является местоположением папки, которую можно использовать для записи файловых данных, например шейп-файлов, текстовых файлов и файлов слоев.
- Текущая рабочая область Инструменты, использующие параметр среды Текущая рабочая область, используют рабочую область, определенную как местоположение по умолчанию для входных и выходных данных инструмента геообработки.
- Временная рабочая область Инструменты, которые поддерживают параметр среды Временная рабочая область, используют указанное местоположение в качестве рабочей области по умолчанию для выходных наборов данных. Временная рабочая область предназначена для выходных данных, которые вы не хотите сохранять.
Дополнительно к рабочим областям, указанным выше, вы также можете записать результаты работы модели в память. Данные, записанные в память, являются временными и автоматически удаляются при закрытии приложения.
Предварительные условия
Предварительные условия можно использовать для управления последовательностью операций в модели. Например, можно настроить запуск процесса после другого процесса, сделав выходные данные первого процесса предварительным условием второго процесса. Предварительным условием для запуска инструмента можно сделать любую переменную. В свою очередь, у любого инструмента может быть несколько предварительных условий.
Обратная связь
Выходные данные процесса можно использовать в качестве входных данных для предыдущего процесса. Это называется обратной связью, так как в качестве входных данных используются выходные данные.
Компоновка
Элементы в модели можно упорядочивать путем перемещения элементов в нужное местоположение или автоматически с помощью кнопки Автокомпоновка на вкладке ModelBuilder . Чтобы автоматически расположить элементы внутри группы, щелкните правой кнопкой эту группу и выберите Автокомпоновка в контекстном меню. Чтобы заблокировать/разблокировать элементы, щелкните кнопку Заблокировать элемент или Разблокировать элемент в группе Вид на вкладке ModelBuilder . Заблокированные элементы не будут затронуты Автокомпоновкой в модели.
Промежуточные данные
Результаты работы промежуточных инструментов можно удалить, а можно оставить.
Замена встроенной переменной
В ModelBuilder значение или путь к набору данных переменной может быть замещено другой переменной, для этого замещающая переменная заключается в символы процента ( %VariableName% ). Подстановка переменных при помощи этого действия называется подстановкой встроенной переменной.
Например, если у вас есть переменная Name , имеющая значение Wilson , вы можете создать путь к набору данных C:\Data\Output.gdb\Clipped_%Name% , который будет выглядеть следующим образом: C:\Data\Output.gdb\Clipped_Wilson .
Итераторы
Итерирование или цикл – это способ автоматизированного повторения процесса. Итерация очень важна, поскольку автоматизация повторяющихся задач способствует уменьшению времени и усилий, необходимых для выполнения задач. Итерация в ModelBuilder позволяет выполнять процесс снова и снова, используя каждый раз другие параметры или данные.
Утилиты
ModelBuilder содержит массу утилит, в том числе Вычислить значение , Собрать значения , Получить значение поля , Анализировать путь и Выбрать данные .
Логические инструменты ветвления если-то-иначе
Логика если-то-иначе – это принцип, позволяющий выполнять действия, основанных на различных условиях. Логику если-то-иначе можно объяснить следующим образом: если условие действительно, то выполните действие; иначе выполните другое действие.
Параметры

Параметры модели появляются на панели Геообработка при открытии модели в качестве инструмента геообработки. Любую переменную модели можно преобразовать в параметр модели. Производные переменные (выходные данные инструмента), являющиеся параметрами, будут добавлены на последнюю активную карту, на которой они были успешно созданы.
Инструмент-модель
Модель ModelBuilder сохраняется как инструмент-модель в наборе инструментов. Инструмент модели действует, как и любой другой инструмент геообработки: он может быть запущен, использован в Python , либо добавлен к другой модели. Для редактирования модели в ModelBuilder щелкните правой кнопкой мыши и выберите пункт Редактировать . Чтобы открыть и запустить инструмент-модель на панели Геообработка , дважды щелкните или щелкните правой кнопкой и выберите Открыть .
Добавление подмодели в модель
При добавлении и запуске инструмента одной модели в другой модели, добавляемая модель иногда называется подмоделью, вложенной моделью или моделью внутри модели. Использование одной модели с другой позволяет разбить крупную модель на более мелкие модели, которые проще в управлении и которые можно использовать повторно.
Инструмент Пакетная модель
Инструменты-модели можно запускать в пакетном режиме, позволяющем вам автоматически выполнять инструмент модели несколько раз, используя несколько входных наборов данных или разные параметры инструмента. Это позволяет запускать инструмент много раз с минимальными усилиями.
Запуск модели по расписанию
Вы можете запланировать запуск инструмента-модели в определенное время суток или многократный запуск через определенный интервал времени. Это применяется также, когда модель очень долго выполняется, и вы хотите, чтобы результаты ее работы были доступны в определенное время.
Экспорт модели в Python
Вы можете экспортировать модель либо в окно Python , либо в файл скрипта Python . Обе опции генерируют один и тот же код Python , который можно впоследствии отредактировать и использовать в автономном скрипте Python , или настроить для работы в качестве инструмента-скрипта.
Отчет модели
Вид Отчет ModelBuilder показывает все переменные и инструменты в модели наравне с их значением и другими свойствами. Это полезно для определения местоположения переменных в большой модели. Кроме того, вы также можете находить и заменять имена и значения переменных в виде отчета.
Связанные разделы
В этом разделе
- Схема
- Элементы
- Процессы и состояния
- Типы переменных
- Проверка
- Параметры среды
- Предварительные условия
- Обратная связь
- Компоновка
- Промежуточные данные
- Замена встроенной переменной
- Итераторы
- Утилиты
- Логические инструменты ветвления если-то-иначе
- Параметры
- Инструмент-модель
- Добавление подмодели в модель
- Инструмент Пакетная модель
- Запуск модели по расписанию
- Экспорт модели в Python
Python проверка режима мышки для левши
pyautogui не различает, выдержка из документации гласит:
If the buttons are swapped, the primary button is the right mouse button and the secondary button is the left mouse button. If not swapped, the primary and secondary buttons are the left and right buttons, respectively. NOTE: Swap detection has not been implemented yet.
Распознование еще не реализовано.
НО для windows можно забрать информацию из GetSystemMetrics . Здесь можно посмотреть для возможных значений. Нам нужен SM_SWAPBUTTON и адрес 0x0017 .
Теперь можно написать коротенькую функцию для опредления левши:
import ctypes def is_left(): get_state = 23 #0x0017 for SM_SWAPBUTTON is_left_from_win = ctypes.windll.user32.GetSystemMetrics(get_state) return bool(is_left_from_win)
вызов функции будет возвращать True , если пользователь левша
>>> is_left() False
Переключим в винде и попробуем
>>> is_left() True
Так же можно через стороннюю библиотеку pywin32 .
Для Linux такую функцию написал:
import subprocess import re def is_left(): retval = subprocess.Popen("xmodmap -pp", shell=True, stdout=subprocess.PIPE).stdout.read() data = retval.decode().split("\n") for i in data: k = i.split() if len("".join(k)) == 2: if k[0] != k[1]: return True return False
xmodmap утилитой можно прочитать как определены соответствия физических кнопок и логических. Для правши это выглядит вот так:
~$ xmodmap -pp There are 10 pointer buttons defined. Physical Button Button Code 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
для левши вот так
~$ xmodmap -pp There are 10 pointer buttons defined. Physical Button Button Code 1 3 2 2 3 1 4 4 5 5 6 6 7 7 8 8 9 9 10 10
И в функции просто сравнил значения колонок. Если хоть одно сравнение дает False , значит левша трогает мышку
