---
# System prepended metadata

title: Chapter 18 - Basic GUI Programming using `tkinter` (I)
tags: [GUI Programming]

---

---
slideOptions:
  theme: white
---

# Chapter 18 - Basic GUI Programming using `tkinter` (I)

###### tags: `GUI Programming`

---

## Window

To create GUI in Python, we need to use the `tkinter` module. The first stemp is to create a window. You can try the following Python codes.

```python=
import tkinter
root = tkinter.Tk()     # Create the window
root.mainloop()         # Display the window
```

The following windows shoule be displayed.

![](https://hackmd.io/_uploads/H1aHAf2vh.png)

In line 2, `root=  = tkinter.Tk()` creates the window **object** and the object is called `root`. The window cannot be display by just creating the object. Hence, we need to use `mainloop()` command in line 3 to dispaly the window.

### Title and size
We can use `title()` to set the title of the window, and use `geometry()` to set the size of the window, as shown below.

```python=
import tkinter
root = tkinter.Tk()             # Create the window
root.title("The first window")  # Name the title 
root.geometry("800x600")        # Configurate the size in pixel
root.mainloop()                 # Display the window
```

![](https://hackmd.io/_uploads/SkeFk73v3.png)

Notice that the size of the above window has width 800px and height 600px.

Besides `geometry()`, we can set the minimum size by `minsize()` and set the maximum size by `maxsize()`. 

Also, if we want to fix the size (no resizable), we can use `resizable()`, by controlling the resiability of `x` (horizontal) and `y` (vertical).

```python!
root.resizable(False, False)
```

## Adding Labels

Labels can be added by using the `Label()` command, and then place it on a specific position by using `place()`. 

```python=
import tkinter
root = tkinter.Tk()             # Create the window
root.title("The first label")   # Name the title
root.geometry("800x600")        # Configurate the size in pixel
label = tkinter.Label(root, text="LabelText", font=("System", 24))
label.place(x=200, y=100)       # Place label on window
root.mainloop()                 # Display the window
```

The above code will show the following window.

![](https://hackmd.io/_uploads/H18df7hv2.png)

For `font` in `Label()`, we can find the list of font in the computer by `print(tkinter.font.families)`.

The position `(0,0)` of `place()` is the top left hand corner of the window.

## Adding Buttons

Buttons can be added by `Button()`, and then place it by `place()`.

```python=
import tkinter
root = tkinter.Tk()             # Create the window
root.title("The first button")  # Name the title
root.geometry("800x600")        # Configurate the size in pixel
button = tkinter.Button(root, text="ButtonText", font=("Times New Roman", 24))
button.place(x=200, y=100)      # Place label on window
root.mainloop()                 # Display the window
```

The above code shows the following window.

![](https://hackmd.io/_uploads/rJMQEm2v3.png)

## Configuring Button Click Event

We need to program the actions after clicking the button. Python uses *functions to define the event of clicking button*. Please modify the program as follow.

```python=
import tkinter

def click_btn():
    button["text"] = "Clicked"

root = tkinter.Tk()             # Create the window
root.title("The first button")  # Name the title
root.geometry("800x600")        # Configurate the size in pixel
button = tkinter.Button(root, text="ButtonText",
                       font=("Times New Roman", 24),
                       command=click_btn)
button.place(x=200, y=100)       # Place label on window
root.mainloop()                  # Display the window
```

The `command` attribute in Line 11 refering the click button action to the `click_btn` function.

By clicking the button, the text of the button should be changed.

![](https://hackmd.io/_uploads/SyuEIQnwn.png)

## Using Canvas (畫布)

The canvas can be created by `Canvas()` command, and then use `pack()` or `place()` command. Please input the following program.

```python=
import tkinter
root = tkinter.Tk()             # Create the window
root.title("The first canvas")  # Name the title
canvas = tkinter.Canvas(root, width=400, height=600, bg="skyblue")
canvas.pack()                   # Pack canvas on window
root.mainloop()                 # Display the window
```

If `pack()` command is used, the size of the window will resize with the canvas. If just a canvas is needed for the window, we can omit the `root.geometry()` command.

![](https://hackmd.io/_uploads/r1eqwmhw3.png)

The background colour can be adjusted by assigning the colour words (`"red"`, `"green"`, `"blue"`, `"yellow"`, `"black"`, `"white"`, etc) or using [RGB hex code](https://www.rapidtables.com/web/color/RGB_Color.html). 

### Display Pictures in Canvas

To displace a picture in canvas, `PhotoImage()` command can be used to load graphics, and then use `create_image()` to draw the graphic. Please input the following program. Place [`iroha.png`](https://hackmd.io/_uploads/HkTNhX2Pn.png) inside the folder of the python program.

```python=
import tkinter
root = tkinter.Tk()             # Create the window
root.title("The first picture")  # Name the title
canvas = tkinter.Canvas(root, width=400, height=600)
canvas.pack()                   # Pack canvas on window
gazou = tkinter.PhotoImage(file="iroha.png")
canvas.create_image(200,300,image=gazou)
root.mainloop()                 # Display the window
```

After the program is run, the picture is shown on the canvas.

![](https://hackmd.io/_uploads/ByXsn7hP2.png)

The `PhotoImage()` command in line 6 assign the graphic with `file=filename`, and then assign the graphics into the variable `gazou`.

In line 7, the attribute of `create_image()` command draw the picture with x-axis, y-axis and `image=picture_variable`. Notice that *the x-axis and y-axis of `create_image()` command is the centre of the picture.* For example, `create_image(0,0,image=gazou)` will place the picture on the top left hand corner, and part of the picture will be cut.

## Lunck Draw Game

The objective of the program is to draw after clicking a button. Before programming, the [`miko.png`](https://hackmd.io/_uploads/Sy9hAQ2v3.png) should be put inside the folder of the python program.

### Step 1: Display the picture

Please input and run the following program.

```python=
import tkinter
root = tkinter.Tk()
root.title("Drawing Game")
root.resizable(False, False)
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()
gazou = tkinter.PhotoImage(file="miko.png")
canvas.create_image(400, 300, image=gazou)
root.mainloop()
```

The following window will be shown after the program is run.

![](https://hackmd.io/_uploads/rkB61Vhwh.png)

### Step 2: Add GUI components

Please input the following program to place a label and a button.

```python=
import tkinter
root = tkinter.Tk()
root.title("Drawing Game")
root.resizable(False, False)

# Pack the canvas
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()

# Display the image on canvas
gazou = tkinter.PhotoImage(file="miko.png")
canvas.create_image(400, 300, image=gazou)

# Place a label
label = tkinter.Label(root, text="???", 
                      font=("Times New Roman", 120),
                      bg="white")
label.place(x=380, y=60)

# Place a button
button = tkinter.Button(root, text="Draw",
                        font=("Times New Roman", 36),
                        fg="skyblue")
button.place(x=360, y=400)

root.mainloop()
```

The following window will be shown after the program is run.

![](https://hackmd.io/_uploads/rJHBbV2w2.png)

### Step 3: Button click event

After the button is clicked, the result of the draw would be displayed on the label. The label can be updated by `update()` command.

```python=
import tkinter
import random

def click_btn():
    label["text"] = random.choice(["***", "**", "*", "NO"])
    label.update

root = tkinter.Tk()
root.title("Drawing Game")
root.resizable(False, False)

# Pack the canvas
canvas = tkinter.Canvas(root, width=800, height=600)
canvas.pack()

# Display the image on canvas
gazou = tkinter.PhotoImage(file="miko.png")
canvas.create_image(400, 300, image=gazou)

# Place a label
label = tkinter.Label(root, text="???",
                      font=("Times New Roman", 120),
                      bg="white")
label.place(x=380, y=60)

# Place a button
button = tkinter.Button(root, text="Draw",
                        font=("Times New Roman", 36),
                        fg="skyblue",
                        command=click_btn)
button.place(x=360, y=400)

root.mainloop()
```

After the program is run, the following window would be shown.

![](https://hackmd.io/_uploads/BJ-QmV3D2.png)


## Reference

https://docs.python.org/3/library/tk.html
https://tkdocs.com/pyref/
[`iroha.png`](https://hackmd.io/_uploads/HkTNhX2Pn.png)
[`miko.png`](https://hackmd.io/_uploads/Sy9hAQ2v3.png) 