From 97b1f3ccaea366fdac63e5ce416746f7d0c3f681 Mon Sep 17 00:00:00 2001 From: Taiko2k Date: Fri, 4 Feb 2022 10:17:51 +1300 Subject: [PATCH] add spacing section --- README.md | 44 +++++++++++++++++++++++++++++--------------- spacing.png | Bin 0 -> 22665 bytes 2 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 spacing.png diff --git a/README.md b/README.md index 39be97c..0dbfd6d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,28 @@ # Taiko's GTK4 Python tutorial Wanna make apps for Linux but not sure how to start with GTK? This guide will hopefully help! -The intent is to show you how to do common things with basic code examples so that you can get up and running making your own GTK app quickly. +The intent is to show you how to do some common things with basic code examples so that you can get up and running making your own GTK app quickly. -Ultimately you want to be able to refer to the official documentation [here](https://docs.gtk.org/gtk4/) yourself. But it can be hard getting started -without an initial understanding of what you're supposed to do and how you do things. The code examples here should help. +Ultimately you want to be able to refer to the official documentation [here](https://docs.gtk.org/gtk4/) yourself. But I find it can be hard getting started +without an initial understanding of how to do things. The code examples here should hopefully help. How to use this tutorial: You can either follow along or just use it to refer to specific examples. -Prerequisite: You have learnt the basics of Python. Ideally have some idea of how classes work. +Prerequisites: You have learnt the basics of Python. Ideally have some idea of how classes work. You will also need the following packages installed on your system: GTK4, PyGObject and Libadwaita. Topics covered: - A basic GTK window - Widgets: Button, check button, switch, slider - Layout: Box layout - - Adding a custom header bar + - Adding a header bar - Showing an open file dialog - - Adding a menu button with a menu + - Adding a menu-button with a menu - Custom drawing with Cairo - Handling mouse input - Setting the cursor - Setting dark colour theme + - Spacing and padding - Custom drawing with Snapshot For beginners, I suggest walking through each example and try to understand what each line is doing. I also recommend taking a look at the docs for each widget. @@ -97,7 +98,7 @@ Soo we have an instance of an app class and a window which we extend! We run our > **Tip:** For a serious app, you'll need to think of your own application id. It should be the reverse of a domain or page you control. If you don't have your own domain you can do like "com.github.me.myproject". -### So! Whats next? +### So! What's next? Well, we want to add something to our window. That would likely be a ***layout*** of some sort! @@ -219,7 +220,8 @@ You can handle the toggle signal like this: radio1.connect("toggled", self.radio_toggled) ``` -When connecting a signal its helpful to pass additional paramiters like as follows. This way you can have one functon handle events from multiple widgets. Just don't forget to handle the extra paramiter in your handler function. +When connecting a signal it's helpful to pass additional parameters like as follows. This way you can have one function handle events from multiple widgets. Just don't forget to handle +the extra parameter in your handler function. ```python @@ -250,7 +252,7 @@ For our switch, we'll want to put our switch in a ***Box***, otherwise it'll loo Try it out! -Our switch is looking rather nondescript, so lets add a label to it! +Our switch is looking rather nondescript, so let's add a label to it! ## ...with a Label @@ -272,7 +274,7 @@ The file `part1.py` is an example of the code so far. ## Adding a slider (Aka scale) -Here's an example of adding a [Scale](https://docs.gtk.org/gtk4/ctor.Scale.new.html) with a range from 0 - 10 +Here's an example of adding a [Scale](https://docs.gtk.org/gtk4/ctor.Scale.new.html) with a range from 0 to 10 ```python self.slider = Gtk.Scale() @@ -305,7 +307,7 @@ Now add a button self.header.pack_start(self.open_button) ``` -We already know how to connect a function to the button, so i've omitted that. +We already know how to connect a function to the button, so I've omitted that. Done! But... it would look nicer with an icon rather than text. @@ -558,6 +560,22 @@ We can use: See [here](https://gnome.pages.gitlab.gnome.org/libadwaita/doc/1.0.0/styles-and-appearance.html) for more details. + +# Spacing and padding + +For a better look we can add spacing to our **layout**. We can also add a margin to any widget, here I've added a +margin to our **box** layout. + +```python + self.box2.set_spacing(10) + self.box2.set_margin_top(10) + self.box2.set_margin_bottom(10) + self.box2.set_margin_start(10) + self.box2.set_margin_end(10) +``` + +![Spacing and padding](spacing.png) + # Custom drawing with Snapshot As mentioned in the Cairo section, Snapshot uses fast hardware accelerated drawing, but it's a little more complicated to @@ -691,10 +709,6 @@ Number changer: [SpinButton](https://docs.gtk.org/gtk4/class.SpinButton.html) Picture. -Layout and spacing. - -Snapshot drawing. - UI from XML. Custom Styles. diff --git a/spacing.png b/spacing.png new file mode 100644 index 0000000000000000000000000000000000000000..79392ffefb840577d7d2303ee400660724d9a6d3 GIT binary patch literal 22665 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 GZvGdQn=*p{ literal 0 HcmV?d00001