Как написать стратегию на питоне

Содержание
  1. Python. Делаем тестер стратегий и. зарабатываем на случайном блуждании.
  2. Пишем простую игру на python
  3. Полный код:
  4. Читают сейчас
  5. Редакторский дайджест
  6. Похожие публикации
  7. Система рекомендаций фильмов с GUI на Python
  8. Десктопные GUI-тесты на Python. Лекция в Яндексе
  9. Автоматизируем десктопный GUI на Python + pywinauto: как подружиться c MS UI Automation
  10. Вакансии
  11. Минуточку внимания
  12. Комментарии 8
  13. Создаем 2D игру на Python с библиотекой Arcade
  14. Установка
  15. Простой рисунок
  16. Использование функций
  17. Класс Window
  18. Спрайты
  19. Создание спрайта
  20. Список спрайтов
  21. Отслеживание коллизий спрайтов
  22. Игровая физика
  23. Top-down игры
  24. Платформеры
  25. Учитесь на примере
  26. Как создать 2D игру с Python и аркадной библиотекой
  27. Как создать 2D игру с Python и аркадной библиотекой
  28. Узнайте, как начать работу с Arcade, простой в использовании библиотеки Python для создания 2D-видеоигр.
  29. Установка
  30. Простой рисунок
  31. Использование функции
  32. класс Window
  33. Спрайты
  34. Создание спрайта
  35. Списки спрайтов
  36. Обнаружение столкновений спрайтов
  37. Игровая физика
  38. Игры сверху вниз
  39. Платформеры
  40. Учись на примере
  41. Краткие сведения
  42. Разработка игры под Android на Python на базе Kivy. От А до Я: подводные камни и неочевидные решения. Часть 1
  43. 0. Если вы впервые слышите о Kivy.
  44. 1. Немного о моей игре
  45. 2. Kivy тормоз или я что-то делаю не так?
  46. 3. Сервисы. Автозапуск и перезапуск
  47. Локализация и мультиязычность
  48. Продолжение следует

Python. Делаем тестер стратегий и. зарабатываем на случайном блуждании.

Если вам кто нибудь скажет, что на случайном блуждании (СБ) нельзя зарабатывать, бросьте в него камень. Как говорил Паниковский — это жалкие ничтожные люди. На СБ можно зарабатывать с результатами не хуже, чем на реальном рынке. У СБ, по сравнению с реальным рынком, только один недостаток — за игры с СБ никто деньги платить не будет.
А если бы платили? Никто бы ничего не заметил. По прежнему 95% СБ-трейдеров сливало бы депозиты, а 5% регулярно выигрывало и считало бы себя Гуру. По прежнему на графики наносились бы каббалистические знаки и индикаторы, угадывались бы направления движения, каналы, и линии поддержки/сопротивления. Все так же начинающие трейдеры искали Учителя для обучения, а аналитики предсказывали будущее. И, ровным счетом, абсолютно ничего бы не поменялось. Может только АГ заметил бы подвох, но тоже не сразу, а только через несколько месяцев, а, может, и через год-другой. Но, легко сделать, чтобы и АГ остался в неведении.)

deals_report — это отчет о проделанной работе по каждой из сделок, а j — номер отсчета выхода из сделки.

Ну, а какую стратегию выбрать для работы с СБ — лучше всего тоже случайную: случайный вход в сделку, и случайный выход из нее.
Выбор когда входить и в какую сделку — шорт или лонг сделаем так:

Здесь мы выбрали, что вероятность входа в сделку всего 0.01, а лонг или шорт выбираем с вероятностью 0.5.
Функция сопровождения сделки делается примерно аналогично — полный код всей стратегии и тестера см. в конце топика.

Запускаем наш тестер, и получаем:

Вот сами видите, можно же зарабатывать. Мы уже Гуру трейдинга на СБ, можем набирать учеников. Конечно, многие скажут — 500 сделок, интервал маловат, надо минимум 1000. — Не проблема, сейчас покажем и 1000 сделок.
Обольщаться не надо, такие результаты доступны только

10% трейдеров, но многие могут прибыльно торговать на СБ тоже с неплохими результатами. Вот с 1000 сделками дела похуже — Гуру становится меньше и успешные трейдеры потихоньку рассасываются. Но, при всем при том, истинные профессионалы, их немного, но даже на таком случайном рынке все равно остаются. В общем, на СБ вполне можно рассчитывать на

5% успешных трейдеров, ну, а истинные гуру — их всегда мало, где-то доли процента. И в завершение, код нашей стратегии.
Что мы в итоге получили? А получили, что игры на СБ, по крайней мере по показателям успешности трейдеров, статистически не отличаются от игр на реальных биржевых инструментах.

На этом, думаю, можно завершить цикл топиков о моделировании торговых систем на Python. [1],[2] Все необходимые инструменты для тестирования ваших стратегий в Python готовы к применению.

Источник

Пишем простую игру на python

Сегодня мы создадим всем известную игру камень, ножницы, бумага. В этом нам поможет ЯП python и библиотека tkinter, но если вы не знаете что это такое, советую почитать данную статью.

Первое, что нам нужно, это начальная структура, окошко, у меня оно будет выглядеть так:

Здесь мы создаём неизменяемое окно 500 на 500 с заголовком «Камень, ножницы, бумага» и белым фоном. Именно в это окошко мы будем добавлять кнопочки, счетчики и т.д.

Теперь в наш метод startUI добавим такие строчки:

Эти 7 строчек добавят в наше окно 3 кнопки которые нечего не делают. Мы исправим это позже.

Пользователь делает свой выбор, нажимая на одну из 3 кнопок, это круто, но нам нужен оппонент, именно для этого нужен модуль random.

А вот теперь мы добавим функцию, которая будет обрабатывать выбор, и выдавать ответ, кто же выиграл в этом раунде. Сделаем это вот таким образом:

Что тут происходит?

Всё очень просто. Грубо говоря, если игрок нажмет камень, отправится 1, если ножницы, то 2, а если бумага, то 3, причем не только отправится, но и выведется в консоль.
На счет компьютера. Он свой выбор делает, но его выбор никуда не идёт.

Перед тем, как делать логику, нам нужно передать игроку результат, и для этого мы будем использовать Label. Добавим в startUI такие строчки:

Отлично. Теперь у нас есть надпись, в которую мы будем выводить результат раунда и надпись со статистикой.

Сделаем 3 счетчика:

1. Поражений
2. Побед
3. Ничей

Для этого все в тот же startUI добавим такую строку:

Теперь в классе main создаем метод btn_click, и пишем в него следующие строки:

Недолго музыка играла. Там же, в btn_click, удаляем

Собственно всё, на этом создание закончилось. Всё работает, можно играть.

Полный код:

Читают сейчас

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Система рекомендаций фильмов с GUI на Python

Десктопные GUI-тесты на Python. Лекция в Яндексе

Автоматизируем десктопный GUI на Python + pywinauto: как подружиться c MS UI Automation

Вакансии

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Минуточку внимания

Комментарии 8

Хм, не то, чтобы я хотел раскритиковать в негативном смысле, но многое тут непонятно и можно было бы описать.

P.S. я не пытаюсь разгромить пост, я действительно пытаюсь понять, почему сделано именно так: может быть есть веские причины, которые я не понимаю, а может быть просто этот код скорее proof of concept, показывающий, что такое вообще возможно сделать лёгким движением руки.

Зачем нужен if __name__ == ‘__main__’:? без него не заработает?

Зачем нужен if name == ‘main‘:? без него не заработает?

Добавлю к предыдущему оратору.
Таки да — лучше написать if main().
А просто с первой колонки не писать ничего.
Тогда при запуске программы будет выполняться это вот main().
А вот при импорте как модуля — ничего выполняться не будет.
Ну такой вот стиль хорошего тона.

Ещё не всё. В январе только прекратят работать над последним релизом, а в апреле хотят выложить этот релиз (2.7.18, если я не ошибаюсь).

Источник

Создаем 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 и написать:

Для более детализированной инструкции по установке, почитайте документацию по установке Arcade.

Простой рисунок

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

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

Использование функций

Конечно, писать код в глобальном контексте — не лучший способ. К счастью, использование функций поможет улучшить ваш код. Ниже приведен пример того, как нарисовать елку в заданных координатах (x, y), используя функцию:

Для полного примера, посмотрите рисунок с функциями.

Более опытные программисты знают, что современные программы сначала загружают графическую информацию на видеокарту, а затем просят ее отрисовать batch-файлом. Arcade это поддерживает. Индивидуальная отрисовка 10000 прямоугольников занимает 0.8 секунды. Отрисовка того же количества батником займет менее 0.001 секунды.

Класс Window

Большие программы обычно базируются на классе Window или используют декораторы. Это позволяет программисту писать код, контролирующий отрисовку, обновление и обработку входных данных пользователя. Ниже приведен шаблон для программы с Window-основой.

В классе Window есть несколько методов, которые ваши программы могут переопределять для обеспечения функциональности. Вот список тех, что используются чаще всего:

Спрайты

Спрайты — простой способ создания 2D bitmap объектов в Arcade. В нем есть методы, позволяющие с легкостью рисовать, перемещать и анимировать спрайты. Также можно использовать спрайты для отслеживания коллизий между объектами.

Создание спрайта

Создать инстанс Sprite класса Arcade очень легко. Программисту необходимо только название файла изображения, на котором будет основываться спрайт, и, опционально, число раз для увеличения или уменьшения изображения. Например:

Этот код создает спрайт, используя изображение coin_01.png. Картинка уменьшится до 20% от исходной.

Список спрайтов

Спрайты обычно организуются в списки. Они помогают упростить их управление. Спрайты в списке будут использовать OpenGl для групповой batch-отрисовки. Нижеприведенный код настраивает игру, где есть игрок и множество монет, которые игрок должен собрать. Мы используем два списка — один для игрока и один для монеток.

Мы с легкостью можем отрисовать все монетки в списке монеток:

Отслеживание коллизий спрайтов

Функция check_for_collision_with_list позволяет увидеть, если спрайт наталкивается на другой спрайт из списка. Используем ее, чтобы увидеть все монетки, с которыми пересекается спрайт игрока. Применив простой for- цикл, можно избавиться от монетки в игре и увеличить счет.

С полным примером можно ознакомиться в collect_coins.py.

Игровая физика

Во многих играх есть физика в том или ином виде. Самые простое, например, что top-down игры не позволяют игроку проходить сквозь стены. Платформеры добавляют сложности с гравитацией и движущимися платформами. Некоторые игры используют полноценные физические 2D движки с массами, трением, пружинами и тд.

Top-down игры

Для простых игр с видом сверху программе на Arcade необходим список стен (или чего-то подобного), через которые игрок не сможет проходить. Обычно я называю это wall_list. Затем создается физический движок в установочном коде класса Window:

player_sprite получает вектор движения с двумя атрибутами change_x и change_y. Просто пример использования — перемещение игрока с помощью клавиатуры.

Несмотря на то что этот код задает скорость игрока, он его не перемещает. Метод update в классе Window вызывает physics_engine.update(), что заставит игрока двигаться, но не через стены.

Пример полностью можно посмотреть в sprite_move_walls.py.

Платформеры

Переход к платформеру с видом сбоку достаточно прост. Программисту необходимо переключить физический движок на PhysicsEnginePlatformer и добавить гравитационную константу.

Для добавления тайлов и блоков, из которых будет состоять уровень, можно использовать программу вроде Tiled.

Учитесь на примере

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

Запускать демки при установленной Arcade совсем не сложно. В начале программы каждого примера есть комментарий с командой, которую нужно ввести в командную строку для запуска этого примера. Например:

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

Источник

Как создать 2D игру с Python и аркадной библиотекой

Привет, Хабр! представляю вашему вниманию перевод статьи How to create a 2D game with Python and the Arcade library автора Paul Vincent Craven

Как создать 2D игру с Python и аркадной библиотекой

Узнайте, как начать работу с Arcade, простой в использовании библиотеки Python для создания 2D-видеоигр.

Phython это отличный язык для людей, обучающихся программированию, и идеально подходит для тех, кто хочет «сделать что-то» а не тратить кучу времени на шаблонный код. Arcade это библиотека Python для создания 2D-видеоигр, которая проста в использовании и очень эффективна, когда вы набираетесь опыта. В этой статье я объясню, как начать использовать Python и Arcade для программирования видеоигр.

Я начал разработку на Arcade после обучения студентов с помощью библиотеки PyGame. Я преподавал лично, используя PyGame в течение почти 10 лет, и я разработал ProgramArcadeGames.com чтобы преподавать онлайн. PyGame-это здорово, но в конце концов я почувствовал, что трачу время на то, чтобы покрывать ошибки, которые никогда не исправлялись.
Я беспокоился о преподавании таких вещей, как цикл событий, который больше не был тем, как мы кодируем. У меня был целый раздел, в котором я объяснил, почему координаты Y были перевернуты. Поскольку PyGame редко обновлялся, и он основан на старой библиотеке SDL 1, а не на чем-то вроде более современного, такого как OpenGL, у меня не было большой надежды на будущее.

Я хотел создать библиотеку, которая была бы проще в использовании, более мощной и использовал некоторые из новых функций Python 3, такие как декораторы и подсказки типов. Это Аркада. И вот как надо начинать.

Установка

Arcade, как и многие другие пакеты, доступна через PyPi, что означает, что вы можете установить Arcade с помощью pip команды (или команды pipenv). Если у вас уже установлен Python, вы, вероятно, можете просто открыть командную строку в Windows и набрать:

Читайте также:  Как правильно пишется вылазиешь

Или на MacOS и Linux типе:

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

Простой рисунок

Вы можете открыть окно и создать простые рисунки с помощью всего лишь нескольких строк кода. Давайте создадим пример, который рисует смайлик, как показано на рисунке ниже:

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

Использование функции

Конечно, написание кода в глобальном контексте не очень хорошая форма. К счастью, улучшить вашу программу с помощью функций легко. Здесь мы можем увидеть пример рисования сосны в определенном (x, y) месте с использованием функции:

Полный пример см. в разделе рисование с функциями.

Более опытный программист будет знать, что современные графические программы сначала загружают графическую информацию на видеокарту, а затем просят видеокарту нарисовать ее позже в виде пакета. Аркада также поддерживает это. Рисование 10 000 прямоугольников по отдельности занимает около 0,800 секунды. Рисование их в виде пакета занимает менее 0,001 секунды.

класс Window

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

Класс Window имеет несколько методов, которые ваши программы могут переопределять для обеспечения функциональности программы. Вот некоторые из наиболее часто используемых:

on_draw: весь код для рисования экрана идет сюда.
Обновление: весь код для перемещения ваших предметов и выполнения игровой логики находится здесь. Это называется около 60 раз в секунду.
on_key_press: обрабатывать события при нажатии клавиши, например, давать игроку скорость.
on_key_release: обрабатывает при отпускании ключа, здесь вы можете остановить движение игрока.
on_mouse_motion: вызывается каждый раз, когда движется мышь.
on_mouse_press: вызывается при нажатии кнопки мыши.
set_viewport: эта функция используется в играх с прокруткой, когда ваш мир намного больше, чем то, что можно увидеть на одном экране. Вызов set_viewport позволяет программисту установить, какая часть этого мира видна в данный момент.

Спрайты

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

Создание спрайта

Создать экземпляр класса Sprite Arcade из графики легко. Программисту нужно только имя файла изображения, чтобы спрайт был основан, и, необязательно, число, чтобы масштабировать изображение вверх или вниз. Например:

Этот код создаст спрайт, используя изображение, хранящееся в coin_01.png. Изображение будет уменьшено до 20% от его первоначальной высоты и ширины.

Списки спрайтов

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

Мы можем легко нарисовать все монеты в списках монет:

Обнаружение столкновений спрайтов

Обнаружение столкновений спрайтов
Функция check_for_collision_with_list позволяет нам увидеть, встречается ли спрайт с другим спрайтом в списке. Мы можем использовать это, чтобы увидеть все монеты, с которыми спрайт игрока соприкасается. Используя простой цикл for, мы можем избавиться от монеты из игры и увеличить наш счет.

Полный пример см. В разделе collect_coins.py.

Игровая физика

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

Игры сверху вниз

Для простых игр сверху вниз аркадной программе нужен список стен, через которые игрок (или что-либо еще) не может пройти. Я обычно называю это wall_list. Затем физический движок создается в коде установки класса Window с помощью:

Player_sprite получает вектор движения с двумя атрибутами: change_x и change_y. Простым примером этого может быть перемещение игрока с помощью клавиатуры. Например, это может быть в настраиваемом дочернем элементе класса Window:

Хотя этот код устанавливает скорость игрока, он не перемещает игрока. В методе обновления класса Window при вызове Physics_engine.update () игрок будет перемещаться, но не через стены.

Полный пример см. В разделе sprite_move_walls.py.

Платформеры

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

Вы можете использовать такую программу, как Tiled чтобы заложить плитки / блоки, которые составляют ваш уровень.

Для полной 2D физики вы можете интегрировать библиотеку PyMunk.

Учись на примере

Один из лучших способов обучения — это пример. В библиотеке Аркад есть длинный список примеров программ, которые человек может использовать для создания игр. Каждый из этих примеров показывает концепцию игры, которую студенты просили на моих уроках или в Интернете на протяжении многих лет.

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

Краткие сведения

Arcade позволяет начать программирование графики и игр с помощью простого для понимания кода. Многие новые программисты создали отличные игры вскоре после начала. Попробуйте!

Источник

Разработка игры под Android на Python на базе Kivy. От А до Я: подводные камни и неочевидные решения. Часть 1

Некоторое время тому назад я решил попробовать написать что-то на Python под Android. Такой странный для многих выбор обусловлен тем, что я люблю Python и люблю Android, а ещё люблю делать необычное (ну хорошо, не самое обычное). В качестве фреймворка был выбран Kivy — фактически, безальтернативный вариант, но он мне очень понравился. Однако, по нему не так уж много информации (нет, документация отличная, но иногда её недостаточно), особенно на русском языке, а некоторые вещи хоть и можно реализовать, но их то ли никто раньше не делал, то ли не счёл нужным поделиться информацией. Ну а я счёл 🙂 И этот пост тому результатом.

Под катом я расскажу обо всех этапах разработки, о том, как развивалась простая идея и как для этого приходилось искать новые возможности, о возникших подводных камнях и багах, о неочевидных решениях и устаревшей документации 🙂 Цель — описать в одном тексте основные пункты, чтобы человеку, решившему написать что-то немного сложнее игры Pong из официального туториала, не приходилось перерывать официальный форум поддержки и StackOverflow и тратить часы на то, что делается за пару минут, если знаешь, как.

0. Если вы впервые слышите о Kivy.

… то всё зависит от того, любите ли вы Python и Android, и интересно ли вам в этом разобраться. Если нет — проще забить 🙂 А если да, то начать нужно с официальной документации, гайдов, и уже упомянутого официального туториала по игре Pong — это даст базовое представление о фреймворке и его возможностях. Я же не буду останавливаться на столь тривиальных вещах (тем более, для понимания базовых принципов туториал отлично подходит) и сразу пойду дальше. Будем считать, что это было вступление 🙂

1. Немного о моей игре

Для начала нужна была идея. Мне хотелось что-то достаточно простое, чтобы оценить возможности фреймворка, но и достаточно интересное и оригинальное, чтобы не программировать ради программирования (это здорово, но когда это не единственная цель — это ещё лучше). Я неплохо проектирую интерфейсы, но не умею рисовать, поэтому игра должна была быть простая графически, или вообще текстовая. И тут так уж сложилось, что у меня есть заброшенный сайт с цитатами, с которого я когда-то начинал свой путь в web-разработке (я о нём даже писал на Хабре много лет назад). Поэтому идея возникла такая: игра-викторина «Угадай цитату». В русскоязычном Google Play ничего подобного не было, а в англоязычном была пара поделок низкого качества с сотней скачиваний.

Читайте также:  Примеры падежи русского языка таблица с вопросами

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

Так всё начиналось (кликабельно):

Ну ладно, ладно, больше не буду показывать такой ужас 🙂 Кстати, вот так оно выглядит сейчас (тоже кликабельно, скрины взяты с Google Play):

Первые проблемы начались с первого же экрана…

2. Kivy тормоз или я что-то делаю не так?

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

Так как цитаты и темы хранятся в БД, то, само собой, кнопки с пакетами генерируются динамически. И вот тут-то я обнаружил, что происходит это очень медленно: примерно полсекунды на список из 20 кнопок. Возможно, это и не очень много при загрузке приложения, но при переходе на главный экран из других внутренних экранов приложения — непозволительно много. Здесь стоит отметить, что кнопка к тому моменту уже представляла собой, на самом деле, набор из нескольких элементов, визуально составляющих одну кнопку:

Первым моим побуждением было тем или иным образом закешировать их, и, действительно, опыт показал, что если создать все виджеты заранее, и сохранить их как свойство объекта StartScreen, то всё (кроме первой генерации) работает достаточно быстро. Однако же, данные в кнопках нужно периодически обновлять (хотя бы то же количество отгаданных цитат). Да и загрузку новых пакетов я уже тогда планировал. Конечно, не проблема реализовать и это, но я решил не изобретать велосипед и подумать.

Сначала стоило убедиться, что проблема именно в создании виджетов, поэтому я за несколько минут набросал простенькое приложение на два экрана, в каждом из которых генерировался набор строк из лейбла и чекбокса количеством 50 шт. 🙂

Запустил на своём стареньком Moto G (gen3) и получил:

И далее в том же духе. Поиск по этому вопросу ничего не дал, поэтому я обратился к разработчикам. И получил ответ: «Создание виджетов относительно медленное, особенно в зависимости от того, что они содержат. Для создания больших списков лучше использовать RecycleView». Здесь хочу пояснить, почему я вообще описываю этот момент, ведь описание RecycleView есть в документации. Да, действительно, есть, но мало кто способен изучить и запомнить всю документацию перед тем, как начнёт разработку, и найти нужный инструмент бывает непросто, особенно если он нигде не описан в контексте решения конкретной проблемы. Теперь же он описан 🙂

Более чем в 100 раз быстрее. Впечатляет, не правда ли?

В завершение следует упомянуть, что RecycleView — не панацея. Он не подходит, если размер элемента зависит от содержимого (например, Label, размер которого меняется в зависимости от количества текста).

3. Сервисы. Автозапуск и перезапуск

Следующая проблема, с которой я столкнулся, не поддавалась решению так долго, что я уже малодушно подумывал счесть данный фреймворк непригодным и забить 🙂 Проблема была с сервисами (в Android так называется процессы, выполняющиеся в фоновом режиме). Создать сервис не так уж и сложно — немного сбивает с толку устаревшая документация, но и только. Однако, в большинстве случаев, много ли толку от сервиса, который, во-первых, не запускается автоматически при загрузке телефона, а во-вторых, не перезапускается, если «выбросить» приложение свайпом из диспетчера задач? По-моему, нет.

На тот момент по этой теме была всего лишь одна статья в официальной wiki, но она, хоть и называлась «Starting Kivy service on bootup», на самом деле всего лишь рассказывала, как при загрузке телефона запустить приложение, но не его сервис (да, такое тоже бывает полезно, но значительно реже, как по мне). Ту статью я, в итоге, переписал, а здесь расскажу подробности.

Допустим, у нас есть примитивный сервис, который всего-то и делает, что периодически выводит в лог строку (этим мы заранее исключаем баги, которые могут возникать из-за особенностей самого сервиса).

Из приложения мы запускаем его методом основного класса при помощи PyJnius:

Если APK собран правильно, при запуске приложения сервис будет стартовать, но этого недостаточно.

Для начала, попробуем сделать так, чтобы он перезапускался при остановке приложения (например, при снятии его из диспетчера задач). Конечно, можно было бы использовать startForeground, но это уже не совсем фоновое выполнение задачи 🙂 Для него потребуется, как минимум, уведомление — это не всегда подходит. В данном случае идеально подходит флаг START_STICKY, но мы же пишем на Python, что делает задачу не столь тривиальной — по крайней мере, при помощи PyJnius она уже не решается.

Ура, сервис рестартится. Всё? Конечно, нет 🙂 Потому что он тут же валится с ошибкой:

Проблема в функции onStartCommand(Intent intent, int flags, int startId), поскольку после перезапуска intent у нас null. Что ж, перепишем и её:

Проблема в том, что функция nativeStart() не получает нужных Extras. К сожалению, два из них мне пришлось захардкодить. В итоге выглядит это так:

Перейдём к автозапуску сервиса при запуске телефона. После предыдущей проблемы это будет уже проще. (На самом деле же всё было наоборот — я очень долго не мог понять, что именно нужно добавить, поскольку информации об этом не было вообще нигде, и сами разработчики тоже не знали, как решить данную задачу. И только разобравшись параллельно с вопросом перезапуска, я понял, что нужно сделать.)

Для начала понадобится разрешение RECEIVE_BOOT_COMPLETED — это просто. А затем — BroadcastReceiver, его придётся добавить в AndroidManifest вручную, но это тоже не проблема. Проблема в том, что в нём писать 🙂

Решение для запуска приложения (не сервиса) выглядит так:

Сначала я попытался просто переписать его для сервиса:

Думаю, вам уже понятно, что проблема в тех самых Extras. Мне же тогда об этом было узнать неоткуда. Но не буду тянуть, рабочий код выглядит так:

Локализация и мультиязычность

В целом, для локализации можно использовать gettext, или же поступить ещё проще — создать папку lang, в ней по файлу на каждый язык (например, en.py и ru.py), определить там все слова и фразы в виде переменных/констант, и далее подключить нужный модуль. Примерно так:

Статическая переменная использована для того, чтобы языковые константы было удобно использовать в kv-файле:

Это, в общем-то, довольно тривиально, а основное, о чём я хотел рассказать в аспекте локализации — как задать константы в res/values/strings.xml и отдельных локализациях. Зачем это нужно? Как минимум, чтобы задать название приложения на разных языках, а также чтобы прописать такие константы, как app_id для сервисов Google Play и facebook_app_id для сервисов Facebook.

По-умолчанию P4A генерирует strings.xml следующего содержания:

Продолжение следует

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

Источник

Простые слова
Adblock
detector