- Guide »
- Getting started »
- QPython’s main features
QPython’s main features¶
With QPython, you could build android applications with android application and script language now.
Why should I choose QPython¶
The smartphone is becomming people’s essential information & technical assitant, so an flexiable script engine could help people complete most jobs efficiently without complex development.
QPython offer an amazing developing experience, with it’s help, you could implement the program easily without complex installing IDE, compiling, package progress etc.
QPython’s main features¶
You can do most jobs through QPython just like the way that Python does on PC/Laptop.
Libraries
QPython supports most stardard Python libraries.
QPython supports many 3rd Python libraries which implemented with pure Python code.
QPython supports some Python libraries mixed with C/C++ code which pre-compiled by QPython develop team.
QPython allows you put on the libraries by yourself.
Besides these, QPython offers some extra features which Python doesn’t offer, Like:
Android APIs Access(Like SMS, GPS, NFC, BLUETOOTH etc)
Why QPython require so many permissions?
QPython need these permissions to access Android’s API.
Runtime modes
QPython supports several runtime modes for android.
Console mode
It’s the default runtime mode in QPython, it’s very common in PC/laptop.
Kivy mode
QPython supports Kivy as the GUI programming solution.
Kivy is an open source Python library for rapid development of applications that make use of innovative user interfaces, such as multi-touch apps.
Your device should support opengl2.0 for supporting kivy mode.
By insert into the following header in your script, you can let your script run with kivy mode.
#qpy:kivy
An kivy program in QPython sample
#qpy:kivy
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
return Button(text='Hello World')
TestApp().run()
If your library require the opengl driver, you shoule declare the kivy mode header in your script, like the jnius.
NOTE: QPython3 didn’t support kivy mode yet, we have plan to support it in the future
WebApp mode
We recommend you implement WebApp with QPython for it offer the easy to accomplish UI and Take advantage of Python’s fast programming strong point.
WebApp will start a webview in front, and run a python web service background. You could use bottle*(QPython built-in library) to implement the web service, or you could install *django / flask framework also.
By insert into the following header in your script, you can let your script run with webapp mode.
#qpy:webapp:<app title>
#qpy:<fullscreen or remove this line>
#qpy://<ip:port:path>
For example
#qpy:webapp:Hello QPython
#qpy://localhost:8080/hello
The previous should start a webview which should load the http://localhost:8080/hello as the default page, and the webview will keep the titlebar which title is “Hello QPython”, if you add the #qpy:fullscreen it will hide the titlebar.
#qpy:webapp:Hello Qpython
#qpy://127.0.0.1:8080/
"""
This is a sample for qpython webapp
"""
from bottle import Bottle, ServerAdapter
from bottle import run, debug, route, error, static_file, template
######### QPYTHON WEB SERVER ###############
class MyWSGIRefServer(ServerAdapter):
server = None
def run(self, handler):
from wsgiref.simple_server import make_server, WSGIRequestHandler
if self.quiet:
class QuietHandler(WSGIRequestHandler):
def log_request(*args, **kw): pass
self.options['handler_class'] = QuietHandler
self.server = make_server(self.host, self.port, handler, **self.options)
self.server.serve_forever()
def stop(self):
#sys.stderr.close()
import threading
threading.Thread(target=self.server.shutdown).start()
#self.server.shutdown()
self.server.server_close() #<--- alternative but causes bad fd exception
print "# qpyhttpd stop"
######### BUILT-IN ROUTERS ###############
@route('/__exit', method=['GET','HEAD'])
def __exit():
global server
server.stop()
@route('/assets/<filepath:path>')
def serverstatic(filepath):
return static_file(filepath, root='/sdcard')
######### WEBAPP ROUTERS ###############
@route('/')
def home():
return template('<h1>Hello {{name}} !</h1>'+ \
'<a href="/assets/qpython/projects/WebApp Sample/main.py">View source</a>',name='QPython')
######### WEBAPP ROUTERS ###############
app = Bottle()
app.route('/', method='GET')(home)
app.route('/__exit', method=['GET','HEAD'])(__exit)
app.route('/assets/<filepath:path>', method='GET')(serverstatic)
try:
server = MyWSGIRefServer(host="127.0.0.1", port="8080")
app.run(server=server,reloader=False)
except Exception,ex:
print "Exception: %s" % repr(ex)
If you want the webapp could be close when you exit the webview, you have to define the @route(‘/__exit’, method=[‘GET’,’HEAD’]) method , for the qpython will request the http://localhost:8080/__exit when you exit the webview. So you can release other resource in this function.

Running screenshot
In the other part of the code, you could implement a webserver whish serve on localhost:8080 and make the URL /hello implement as your webapp’s homepage.
Q mode
If you don’t want the QPython display some UI, pelase try to use the QScript mode, it could run a script background, just insert the following header into your script:
#qpy:qpyapp