Introduction

Installation

Limitations of the "file" protocol

Frequently asked questions

Syntax, keywords and built-in functions

Standard distribution

import implementation

Brython packages

Browser interface

Introduction - DOM API
Creating a document
Accessing elements
Attributes, properties and methods

Events
Mouse events
Keyboard events
Focus events
Drag events

Query string

Interactions with Javascript

Brython-specific built-in modules

browser
browser.aio
browser.ajax
browser.html
browser.local_storage
browser.markdown
browser.object_storage
browser.session_storage
browser.svg
browser.template
browser.timer
browser.webcomponent
browser.websocket
browser.worker

Widgets
browser.widgets.dialog
browser.widgets.menu

interpreter
javascript

Working with Brython

Execution options
Testing and debugging
Deploying an application

Cookbook

Hello world !
Insert content in an element
HTML markup (bold,italic...)
HTML table
Bind and unbind events
Handle options in a SELECT
Drag and drop
Get the content of an element
Read the content of a file
Store objects locally
Example of onmouseover
 

Implementation of import

Like in standard Python, you can install modules or packages Python in your application by putting them in the root directory, or in directories with a file __init__.py.

Note that modules must be encoded in utf-8 ; the encoding declaration at the top of the script is ignored.

For instance, the application can be made of the following files and directories :

.bundle-include
app.html
brython.js
brython_modules.js
brython_stdlib.js
index.html
users.py
utils.py
+ app
    __init__.py
    records.py
    tables.py

A Python script in app.html can run the imports

import users
import app.records

If the standard distribution has been included in the page by

<script type="text/javascript" src="brython_stdlib.js"></script>

the script can also run

import datetime
import re

To import modules or packages, Brython uses the same mechanism as CPython : to resolve "import X", the program looks for a file in several places :

  • a module X in the standard library
  • a file X.py in the script directory
  • a file __init__.py in the subdirectory X of the script directory
  • a file X.py in the directory site-packages of the standard library
  • a file __init.py__ in the directory site-packages/X of the standard library

Since the browser has no direct access to the file system, looking for a file must be done by an Ajax call, which returns an error message if there is no file at the specified url.

Additionally, if an HTML has several Brython scripts, those already executed can be imported by their id:

<script type="text/python" id="module">
def hello():
    return "world"
</script>

<script type="text/python">
from browser import document
import module

document.body <= module.hello()
</script>

Optimisation

The process described above has two main drawbacks :

  • the relatively big size of brython_stdlib.js (more than 4 Mb)
  • the time taken by Ajax calls

To optimise imports, if Brython was installed by pip, you can generate a file brython_modules.js which only holds the modules used by the application.

For that, open a console window, navigate to the application directory and execute

brython-cli make_modules

Note that this program parses the Brython code in all the scripts, modules and HTML pages of the directory and its sub-directories. The CPython version used must be compliant with this Brython code : for instance if there are match / case in the Brython code, CPython 3.10+ is required, otherwise you would get syntax errors.

You can then replace all the occurrences of

<script type="text/javascript" src="brython_stdlib.js"></script>

by

<script type="text/javascript" src="brython_modules.js"></script>