Cross-platform game and app development for new programmers

Dynamic Screens

Ren'Py supports custom screen layouts that can have labels, text, buttons, and bar charts. In a visual novel, a custom screen could be a small box at the top of the application that shows items like inventory, money, or percent complete.

For the next example, I use Python code with Ren'Py to find some PC hardware readings and present the information on a large custom screen.

The Linux sensors [5] command can be used to show current hardware information:

$ sensors
dell_smm-virtual-0
Adapter: Virtual device
Processor Fan: 2721 RPM
CPU:            +46.0 C
Ambient:        +39.0 C
...

By adding some Bash/Awk code, the CPU and ambient temperature values can be extracted:

# use show Bash/Awk code to get temps
$ sensors | grep CPU | awk '{ printf "%d\n" , $2}'
46
$ sensors | grep Ambient | awk '{ printf "%d\n" , $2}'
39

Python calls Bash scripts with the subprocess.check_output method, which is part of the subprocess library (Listing 2).

Listing 2

subprocess.check_output

$ python
Python 2.7.15+ (default, Oct  7 2019, 17:39:04)
[GCC 7.4.0] on linux2
>>> import subprocess
>>> subprocess.check_output("sensors | grep CPU | awk '{ printf \"%d\" , $2}'", shell=True)
'46'
>>>
>>> subprocess.check_output("sensors | grep Ambient | awk '{ printf \"%d\" , $2}'", shell=True)
'39'

Listing 3 shows the code required for the CPU statistics application (Figure 8). The screen cpu_data(): statement creates a user interface (line 3) that can contain both Python blocks and display elements.

Listing 3

Dynamic CPU Stats Screen

01 # script.rpy - create a Ren'Py screen that shows CPU sensor information
02
03 screen cpu_data():
04
05     python:  # Use Python to get sensor variables
06         now = datetime.now()
07         nowtime = now.strftime("%H:%M:%S")
08         ctemp = subprocess.check_output("sensors | grep CPU | awk '{ printf \"%d\" , $2}'", shell=True)
09         atemp = subprocess.check_output("sensors | grep Ambient | awk '{ printf \"%d\" , $2}'", shell=True)
10
11     frame:   # create a frame with text, values and a bar
12         has vbox
13         label "CPU Stats" text_size 120
14
15         vbox:
16             text "Time : [nowtime]" size 80
17             text "Ambient temp: [atemp] C \n" size 80
18             text "   CPU temp : [ctemp] C " size 60
19         hbox:
20             vbox:
21                 text "0 " size 40
22             vbox:
23                 bar value atemp range 60 xalign 50 yalign 50 xmaximum 600 ymaximum 50 left_bar "#FF0000"
24             vbox:
25                 text " 60 " size 40
26
27 init python:
28     # Define Libaries and any system variables
29     import subprocess
30     from datetime import datetime
31
32 label start:
33
34     # Start with Weather screen
35     show screen cpu_data()
36
37     define cycle = "True"
38     # Cycle every 2 seconds
39     while cycle == "True" :
40         $ renpy.pause(2)
41
42     return
Figure 8: CPU stats screen.

The Python block (lines 5-9), start with a python: statement, and the succeeding lines are indented per the Python standard. CPU and ambient temperature variables (lines 8-9) are created with the subprocess.check_output() call and the earlier Bash sensors statements.

For this screen, a frame: (line 11) is used to group the elements together. Vertical boxes (vbox:) and horizontal boxes (hbox:) are used for further groupings. Python variables are inserted into text output strings with square brackets (lines 16-18). A horizontal bar (line 23) shows the ambient temperature (atemp) with a range of 0-60.

The application begins at label start: (line 32) by showing the cpu_data screen (line 35). An inline Python statement (line 40) pauses the execution for two seconds within a while loop. The screen logic is refreshed after each renpy.pause() iteration.

Building Applications

The Ren'Py IDE has a Launch Project button that allows testing in the native operating system environment. The IDE's Build option allows you to create a variety of different packages (Figure 9).

Figure 9: Ren'Py build options.

The HTML5 build is still in beta; it appears to work well for standard visual novel apps, but I found that it had issues with some Python library calls. The HTML5 build creates a separate directory structure for the Ren'Py application that needs to be mapped into your web server configuration.

If you are looking to do some simple testing, a Python standalone web server (Figure 10) can be run from the project's web directory:

# Run a python standalone server on port 8042
python3 -m http.server 8042
Figure 10: Ren'Py web application.

Final Thoughts

If you're looking to create some simple cross-platform visual presentation apps, Ren'Py is a good fit, it is super easy to learn, and doesn't require strong programming skills. I found the first-time call-up for Android was longer than expected, but I was impressed with the final result.

Ren'Py supports simple screens that can have dynamic bars and text; however, if you're looking to incorporate gauges or line charts. Ren'Py probably isn't the best fit.

Infos

  1. Ren'Py: https://www.renpy.org
  2. Download Ren'Py: https://www.renpy.org/latest.html
  3. Character Creator: https://charactercreator.org
  4. Bruce Peninsula, Ontario: https://visitbrucepeninsula.ca
  5. lm_sensors (sensors) documentation: https://wiki.archlinux.org/title/lm_sensors

The Author

You can investigate more neat projects by Pete Metcalfe and his daughters at https://funprojects.blog.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • Xonsh

    Create lightweight Raspberry Pi scripts with Xonsh, a Python shell that lets you write scripts in Python with Bash commands mixed in.

  • curses

    When you need some quick graphical output, the old school curses library can save you some time and effort.

  • Nerf Target Game

    A cool Nerf gun game for a neighborhood party provides a lesson in Python coding with multiple processors.

  • Tutorials – Cordova Sensor

    Frameworks like Cordova make creating simple mobile apps quite easy. Making apps that use your phone's sensor is slightly trickier, but, thanks to a new universal standard, things are not as hard as you may think.

  • Whiptail

    Whiptail interfaces add menus and information pages to your Raspberry Pi projects.

comments powered by Disqus