
Pygame на Android
Pygame Subset for Android отличная штука которая позволяет с минимальным количеством изменением кода портировать на Android,то что было написано для PC на библиотеке pygame. Помню что я как-то написал бинарные часы и сейчас меня приспичило их портировать, чтобы протестировать работоспособность.
1. Подключаем устройство по USB для режима отладки (Можно использовать виртуальную, но они достаточно сильно глючат)
После подключения к компьютеру, включите режим отладки на телефоне(планшете) Настройки --> Для разработчиков -->Отладка по USB
2. Скачиваем и распаковываем последнюю версию.
3. Тестирование на недостающие компоненты
$./android.py test
4. Установка AndroidSDK
$./android.py installsdk
5. Создаём каталог
mkdir binaryclock
6. Создаём в папке файл main.py с исходным кодом:
import pygame # Import the android module. If we can't import it, set it to None - this # lets us test it, and check to see if we want android-specific behavior. try: import android except ImportError: android = None ''' ************************************************************************ *Binary clock * *Copyright (C) 2010 Komarov Alexander * * * *This program is free software: you can redistribute it and/or modify * *it under the terms of the GNU General Public License as published by * *the Free Software Foundation, either version 3 of the License, or * *(at your option) any later version. * * * *This program is distributed in the hope that it will be useful, * *but WITHOUT ANY WARRANTY; without even the implied warranty of * *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See t * *GNU General Public License for more details. * * *You should have received a copy of the GNU General Public License * *along with this program. If not, see <http://www.gnu.org/licenses/>. * ************************************************************************''' import sys import time class Clock: screen=pygame.display.set_mode((640,480)) def __init__(self): pygame.init() pygame.display.set_caption('Binary Clock') def main(self): while True: for e in pygame.event.get(): if e.type == pygame.QUIT: exit(0) elif e.type == pygame.KEYDOWN and e.key == pygame.K_ESCAPE: exit(0) self.capture() self.logic() pygame.display.flip() time.sleep(0.5) def capture(self): #Hour #Row1 pygame.draw.circle(self.screen, (255, 255, 255), (70, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (70, 300), 30 ) #Row2 pygame.draw.circle(self.screen, (255, 255, 255), (170, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (170, 300), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (170, 200), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (170, 100), 30 ) #Min #Row1 pygame.draw.circle(self.screen, (255, 255, 255), (270, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (270, 300), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (270, 200), 30 ) #Row2 pygame.draw.circle(self.screen, (255, 255, 255), (370, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (370, 300), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (370, 200), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (370, 100), 30 ) #Sec #Row1 pygame.draw.circle(self.screen, (255, 255, 255), (470, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (470, 300), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (470, 200), 30 ) #Row2 pygame.draw.circle(self.screen, (255, 255, 255), (570, 400), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (570, 300), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (570, 200), 30 ) pygame.draw.circle(self.screen, (255, 255, 255), (570, 100), 30 ) def logic(self): #Hour if int(time.asctime( time.localtime(time.time()) )[11])==1: pygame.draw.circle(self.screen, (255, 0, 0), (70, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[11])==2: pygame.draw.circle(self.screen, (255, 0, 0), (70, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==1: pygame.draw.circle(self.screen, (255, 0, 0), (170, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==2: pygame.draw.circle(self.screen, (255, 0, 0), (170, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==3: pygame.draw.circle(self.screen, (255, 0, 0), (170, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==4: pygame.draw.circle(self.screen, (255, 0, 0), (170, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==5: pygame.draw.circle(self.screen, (255, 0, 0), (170, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==6: pygame.draw.circle(self.screen, (255, 0, 0), (170, 200), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==7: pygame.draw.circle(self.screen, (255, 0, 0), (170, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 300), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==8: pygame.draw.circle(self.screen, (255, 0, 0), (170, 100), 30 ) if int(time.asctime( time.localtime(time.time()) )[12])==9: pygame.draw.circle(self.screen, (255, 0, 0), (170, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (170, 100), 30 ) #Min if int(time.asctime( time.localtime(time.time()) )[14])==1: pygame.draw.circle(self.screen, (255, 0, 0), (270, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[14])==2: pygame.draw.circle(self.screen, (255, 0, 0), (270, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[14])==3: pygame.draw.circle(self.screen, (255, 0, 0), (270, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (270, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[14])==4: pygame.draw.circle(self.screen, (255, 0, 0), (270, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[14])==5: pygame.draw.circle(self.screen, (255, 0, 0), (270, 200), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (270, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==1: pygame.draw.circle(self.screen, (255, 0, 0), (370, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==2: pygame.draw.circle(self.screen, (255, 0, 0), (370, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==3: pygame.draw.circle(self.screen, (255, 0, 0), (370, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==4: pygame.draw.circle(self.screen, (255, 0, 0), (370, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==5: pygame.draw.circle(self.screen, (255, 0, 0), (370, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==6: pygame.draw.circle(self.screen, (255, 0, 0), (370, 200), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==7: pygame.draw.circle(self.screen, (255, 0, 0), (370, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 300), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==8: pygame.draw.circle(self.screen, (255, 0, 0), (370, 100), 30 ) if int(time.asctime( time.localtime(time.time()) )[15])==9: pygame.draw.circle(self.screen, (255, 0, 0), (370, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (370, 100), 30 ) #Sec if int(time.asctime( time.localtime(time.time()) )[17])==1: pygame.draw.circle(self.screen, (255, 0, 0), (470, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[17])==2: pygame.draw.circle(self.screen, (255, 0, 0), (470, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[17])==3: pygame.draw.circle(self.screen, (255, 0, 0), (470, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (470, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[17])==4: pygame.draw.circle(self.screen, (255, 0, 0), (470, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[17])==5: pygame.draw.circle(self.screen, (255, 0, 0), (470, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (470, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==1: pygame.draw.circle(self.screen, (255, 0, 0), (570, 400), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==2: pygame.draw.circle(self.screen, (255, 0, 0), (570, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==3: pygame.draw.circle(self.screen, (255, 0, 0), (570, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==4: pygame.draw.circle(self.screen, (255, 0, 0), (570, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==5: pygame.draw.circle(self.screen, (255, 0, 0), (570, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==6: pygame.draw.circle(self.screen, (255, 0, 0), (570, 200), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 300), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==7: pygame.draw.circle(self.screen, (255, 0, 0), (570, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 300), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 200), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==8: pygame.draw.circle(self.screen, (255, 0, 0), (570, 100), 30 ) if int(time.asctime( time.localtime(time.time()) )[18])==9: pygame.draw.circle(self.screen, (255, 0, 0), (570, 400), 30 ) pygame.draw.circle(self.screen, (255, 0, 0), (570, 100), 30 ) start=Clock() start.main()
Вы можите убедиться, что изминения с оригиналом минимальны. Сравнить.
7.Конфигурирование проекта (нужно ответить на вопросы)
./android.py configure binaryclock
8. Сборка пакета и установка пакета на устройство
./android.py build binaryclock release install
Возможная ошибка error: insufficient permissions for device Устройство не определено, чтобы оно корректно определилось, нужно сделать некоторые действия:
#usb-devices
T: Bus=02 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 15 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=18d1 ProdID=0003 Rev=02.30
S: Manufacturer=USB Developer
S: Product=Android
S: SerialNumber=20080411
C: #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=42 Prot=01 Driver=usbfs
В вашем случае может быть немного не такие параметры, из всего списка нам нужен Vendor=18d1
Добавляем строки: #nano /etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", <---Vendor
SYMLINK+="android_adb", MODE="0666"
# chmod a+r /etc/udev/rules.d/51-android.rules
9.Отладка
./android.py logcat