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