Search code examples
pythongtk

Libadwaita themeing is not working in python


This is my first time using pyGOObject and gtk in Python. I want to make an app with libadwaita and came up with this:

import sys
import gi

gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1')

from gi.repository import Gtk, Adw

class MainWindow(Gtk.ApplicationWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.set_title('Test')
        self.set_default_size(800, 600)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
        self.set_child(box)

        button = Gtk.Button.new_with_label("Test")
        button.connect("clicked", self.on_button_clicked)
        box.append(button)

    def on_button_clicked(self, button):
        print("Button was clicked")

class MyApp(Adw.Application):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.connect('activate', self.on_activate)

    def on_activate(self, app):
        self.win = MainWindow(application=app)
        self.win.present()

app = MyApp(application_id='com.example.GtkApplication')
app.run(sys.argv)

The code runs, but the problem is it doesn't look like libadwaita, it just looks like gtk!

The top bar should look like this:

look at the top bar

But it looks like this:

this

I assume that's not libadwaita, how can I make my app use libadwaita? The widgets and elements look like Libadwaita but not the top bar.


Solution

  • When using libadwaita you should inherit from Adw.ApplicationWindow, like so:

    import sys
    import gi
    
    gi.require_version('Gtk', '4.0')
    gi.require_version('Adw', '1')
    
    from gi.repository import Gtk, Adw
    
    class MainWindow(Adw.ApplicationWindow):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.set_title('Test')
            self.set_default_size(800, 600)
    
            # ... Your widgets here
    
    class MyApp(Adw.Application):
        def __init__(self, **kwargs):
            super().__init__(**kwargs)
            self.connect('activate', self.on_activate)
    
        def on_activate(self, app):
            self.win = MainWindow(application=app)
            self.win.present()
    
    app = MyApp(application_id='com.example.GtkApplication')
    app.run(sys.argv)