GTK Python-GUI in Raspberry Pi 5

Posted

OS image:

Debian GNU/Linux 12 (bookworm) aarch64
Linux raspberrypi 6.6.62+rpt-rpi-2712 SMP PREEMPT Debian 1:6.6.62-1+rpt1 (2024-11-25)

Ref:

  1. https://www.gtk.org/docs/language-bindings/python/
  2. https://pygobject.gnome.org/getting_started.html#ubuntu-getting-started
  3. https://python-gtk-3-tutorial.readthedocs.io/en/latest/

Setup:

sudo apt update
sudo apt list --upgradable
sudo apt upgrade
sudo apt install libopenblas-dev libblas-dev m4 cmake python3-dev python3-yaml python3-setuptools
sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-4.0
sudo apt install at-spi2-core
sudo rm /usr/lib/python3.*/EXTERNALLY-MANAGED
sudo pip install cython pygame

First Run:

Create new pyscript and,

import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk,Gdk,GLib
import threading
import time
import sys
import pygame
class MyApp(Gtk.Application):
    def __init__(self):
        super().__init__(application_id="com.example.myapp")
        GLib.set_application_name("MyApp")
        css = Gtk.CssProvider()
        css.load_from_path("./app.css")
        Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),css,
                                                 Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
        pygame.mixer.init()
        self.bgevt = threading.Event()
        self.bgthread = threading.Thread(target=loop_sleep,args=(self.bgevt,))
        self.bgthread.start()
        self.mainpg = Gtk.Box(orientation=Gtk.Orientation.VERTICAL,spacing=6)
        self.mainpg.get_style_context().add_class('mainpg')
    def do_activate(self):
        self.win = Gtk.ApplicationWindow(application=self,title="Dance Box Set v0.0.1")
        self.win.fullscreen()
        self.init_mainpg()
        self.win.add(self.mainpg)
        self.win.show_all()
    def init_mainpg(self):
        btns = Gtk.FlowBox()
        btns.set_selection_mode(Gtk.SelectionMode.NONE)
        btns.set_max_children_per_line(3)
        for i in range(1,10):
            btn = Gtk.Button(label=i)
            clsnm = 'btn' if i!=5 else 'btn-dark'
            btn.get_style_context().add_class(clsnm)
            btns.add(btn)
            print(i)
        self.mainpg.add(btns)
def loop_sleep(evt):
    i = 1
    while not evt.is_set():
        print(i)
        i = i+1
        time.sleep(0.5)
def loop_shutdown(app):
    app.bgevt.set()
app = MyApp()
app.connect("shutdown",loop_shutdown)
ex = app.run(sys.argv)
sys.exit(ex)

Author