From fa0b0e258aff23dded18aa3705791299a63d7b9a Mon Sep 17 00:00:00 2001 From: Mat Date: Thu, 1 Dec 2022 23:59:27 +0200 Subject: Update docs and code examples to GTK 4 --- docs/further.rst | 5 +- docs/getting_started.rst | 45 +++++--- docs/guide/code/cairo-demo.py | 234 ++++++++++++++++++++---------------------- docs/guide/gtk_template.rst | 21 ---- docs/guide/threading.rst | 84 ++++++++------- docs/index.rst | 41 +++++--- docs/packagingguide.rst | 4 +- 7 files changed, 220 insertions(+), 214 deletions(-) diff --git a/docs/further.rst b/docs/further.rst index 69223f50..e28c1291 100644 --- a/docs/further.rst +++ b/docs/further.rst @@ -2,8 +2,11 @@ Further Resources ================= +`GNOME Developer Documentation `__ + Tutorials for creating a GNOME application using PyGObject, GTK 4 and Libadwaita. + `Python GTK 3 Tutorial `__ - Many examples showing how to build an application using PyGObject and GTK. + Many examples showing how to build an application using PyGObject and GTK 3. `Python GI API Reference `__ Auto generated API documentation for many libraries accessible through diff --git a/docs/getting_started.rst b/docs/getting_started.rst index e6921af8..01874efa 100644 --- a/docs/getting_started.rst +++ b/docs/getting_started.rst @@ -13,14 +13,27 @@ the following content and save it somewhere: .. code:: python + import sys + import gi - gi.require_version("Gtk", "3.0") - from gi.repository import Gtk - window = Gtk.Window(title="Hello World") - window.show() - window.connect("destroy", Gtk.main_quit) - Gtk.main() + gi.require_version("Gtk", "4.0") + from gi.repository import GLib, Gtk + + + class MyApplication(Gtk.Application): + def __init__(self): + super().__init__(application_id="com.example.MyGtkApplication") + GLib.set_application_name('My Gtk Application') + + def do_activate(self): + window = Gtk.ApplicationWindow(application=self, title="Hello World") + window.present() + + + app = MyApplication() + exit_status = app.run(sys.argv) + sys.exit(exit_status) Before we can run the example application we need to install PyGObject, GTK and their dependencies. Follow the instructions for your platform below. @@ -45,8 +58,8 @@ libraries. There are also typing stubs available here `PyGObject-stubs `` #) In the mingw32 terminal execute ``python3 hello.py`` - a window should appear. @@ -61,13 +74,13 @@ libraries. There are also typing stubs available here `PyGObject-stubs - - - - Subclasses that declare ``__gtype_name__`` can be used as objects in the XML: .. code-block:: python diff --git a/docs/guide/threading.rst b/docs/guide/threading.rst index fea26d18..da3cd7f6 100644 --- a/docs/guide/threading.rst +++ b/docs/guide/threading.rst @@ -31,37 +31,38 @@ while still showing feedback on the progress in a window. import threading import time + import gi + gi.require_version('Gtk', '4.0') from gi.repository import GLib, Gtk, GObject - def app_main(): - win = Gtk.Window(default_height=50, default_width=300) - win.connect("destroy", Gtk.main_quit) + class Application(Gtk.Application): - progress = Gtk.ProgressBar(show_text=True) - win.add(progress) + def do_activate(self): + window = Gtk.ApplicationWindow(application=self) + self.progress = Gtk.ProgressBar(show_text=True) - def update_progess(i): - progress.pulse() - progress.set_text(str(i)) + window.set_child(self.progress) + window.present() + + thread = threading.Thread(target=self.example_target) + thread.daemon = True + thread.start() + + def update_progess(self, i): + self.progress.pulse() + self.progress.set_text(str(i)) return False - def example_target(): + def example_target(self): for i in range(50): - GLib.idle_add(update_progess, i) + GLib.idle_add(self.update_progess, i) time.sleep(0.2) - win.show_all() - - thread = threading.Thread(target=example_target) - thread.daemon = True - thread.start() - - if __name__ == "__main__": - app_main() - Gtk.main() + app = Application() + app.run() The example shows a simple window containing a progress bar. After everything @@ -167,15 +168,17 @@ operation. .. code:: python import time + import gi + gi.require_version('Gtk', '4.0') from gi.repository import Gio, GLib, Gtk - class DownloadWindow(Gtk.Window): + class DownloadWindow(Gtk.ApplicationWindow): - def __init__(self): - super(DownloadWindow, self).__init__( - default_width=500, default_height=400, title="Async I/O Example") + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs, default_width=500, default_height=400, + title="Async I/O Example") self.cancellable = Gio.Cancellable() @@ -186,22 +189,22 @@ operation. self.start_button = Gtk.Button(label="Load") self.start_button.connect("clicked", self.on_start_clicked) - textview = Gtk.TextView() + textview = Gtk.TextView(vexpand=True) self.textbuffer = textview.get_buffer() scrolled = Gtk.ScrolledWindow() - scrolled.add(textview) + scrolled.set_child(textview) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6, - border_width=12) - box.pack_start(self.start_button, False, True, 0) - box.pack_start(self.cancel_button, False, True, 0) - box.pack_start(scrolled, True, True, 0) + margin_start=12, margin_end=12, margin_top=12, margin_bottom=12) + box.append(self.start_button) + box.append(self.cancel_button) + box.append(scrolled) - self.add(box) + self.set_child(box) def append_text(self, text): iter_ = self.textbuffer.get_end_iter() - self.textbuffer.insert(iter_, "[%s] %s\n" % (str(time.time()), text)) + self.textbuffer.insert(iter_, f"[{time.time()}] {text}\n") def on_start_clicked(self, button): button.set_sensitive(False) @@ -221,22 +224,25 @@ operation. try: succes, content, etag = source_object.load_contents_finish(result) except GLib.GError as e: - self.append_text("Error: " + e.message) + self.append_text(f"Error: {e.message}") else: content_text = content[:100].decode("utf-8") - self.append_text("Got content: " + content_text + "...") + self.append_text(f"Got content: {content_text}...") finally: self.cancellable.reset() self.cancel_button.set_sensitive(False) self.start_button.set_sensitive(True) - if __name__ == "__main__": - win = DownloadWindow() - win.show_all() - win.connect("destroy", Gtk.main_quit) + class Application(Gtk.Application): + + def do_activate(self): + window = DownloadWindow(application=self) + window.present() + - Gtk.main() + app = Application() + app.run() The example uses the asynchronous version of :meth:`Gio.File.load_contents` to @@ -249,7 +255,7 @@ the content of the web page we wanted. .. code:: python - file = Gio.File.new_for_uri("http://python-gtk-3-tutorial.readthedocs.org/") + file = Gio.File.new_for_uri("https://developer.gnome.org/documentation/tutorials/beginners.html") try: status, contents, etag_out = file.load_contents(None) except GLib.GError: diff --git a/docs/index.rst b/docs/index.rst index f6823031..1addb839 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -30,21 +30,34 @@ If you want to write a Python application for `GNOME `__ or a Python GUI application using GTK, then -PyGObject is the way to go. For more information on specific libraries check -out the "`Python GTK 3 Tutorial -`__" and the "`Python GI API +PyGObject is the way to go. To get started, check out the "`GNOME Developer Documentation +`__". For more +information on specific libraries, check out the "`Python GI API Reference `__". .. code:: python + import sys + import gi - gi.require_version("Gtk", "3.0") - from gi.repository import Gtk - window = Gtk.Window(title="Hello World") - window.show() - window.connect("destroy", Gtk.main_quit) - Gtk.main() + gi.require_version("Gtk", "4.0") + from gi.repository import GLib, Gtk + + + class MyApplication(Gtk.Application): + def __init__(self): + super().__init__(application_id="com.example.MyGtkApplication") + GLib.set_application_name("My Gtk Application") + + def do_activate(self): + window = Gtk.ApplicationWindow(application=self, title="Hello World") + window.present() + + + app = MyApplication() + exit_status = app.run(sys.argv) + sys.exit(exit_status) How does it work? @@ -55,12 +68,12 @@ How does it work? :height: 222px :align: center -PyGObject uses `glib `__, `gobject -`__, `girepository -`__, `libffi +PyGObject uses `glib `__, `gobject +`__, `girepository +`__, `libffi `__ and other libraries to access the C -library (libgtk-3.so) in combination with the additional metadata from the -accompanying typelib file (Gtk-3.0.typelib) and dynamically provides a Python +library (libgtk-4.so) in combination with the additional metadata from the +accompanying typelib file (Gtk-4.0.typelib) and dynamically provides a Python interface based on that information. diff --git a/docs/packagingguide.rst b/docs/packagingguide.rst index e1715eb9..d9536388 100644 --- a/docs/packagingguide.rst +++ b/docs/packagingguide.rst @@ -4,7 +4,7 @@ Packaging Guide Some notes on how to package PyGObject Source packages can be found at -https://ftp.gnome.org/pub/GNOME/sources/pygobject +https://download.gnome.org/sources/pygobject Existing Packages: @@ -40,6 +40,6 @@ Build dependencies: Test Suite dependencies: * The runtime dependencies - * GTK 3 (optional) + * GTK 4 (optional) * pango (optional) * pycairo (optional) -- cgit v1.2.1