This post works through a simple example of creating a GUI in python using Tkinter. The python tkinter example goes through some simple things that a GUI would need to do such as creating new windows, text input, and labels.
This isn’t a tutorial as such, but instead I’ve tried to pick out a few of the basics of tkinter so that they are in one place. You can use this basic example as a starting point for more sophisiticated GUI applications.
This example is available on github.
Why Tkinter?
There are a number of GUI libraries available for python, so why tkinter?
- Portability – Tkinter is also designed to make use of the existing styling of the operating system it is running in, rather than bringing its own widgets.
- Simplicity – Tkinter is also fairly simple to get started with (as you will see in this example), so is good for
- Availability – Tkinter is typically packaged with python, so if package availability is a challenge for you, then Tkinter may make sense
An Example
In this example I’m going to step through the creation of a simple GUI featuring:
- A main window
- Two sub-windows
- Creating an alert box
- Creating an ‘About’ menu item
I have deliberately left out the less essential parts of the GUI design such as sizing and exact layout. This is important to consider, but for the purposes of learning I find it can distract from the truly essential parts of the code.
Create The Main Window
We’re going to be making main window that looks like this – two buttons that open sub-windows, and a Help menu.
import tkinter from tkinter import messagebox import os window = tkinter.Tk() window.title("Main Window") # create a toplevel menu menubar = tkinter.Menu(window) helpmenu = tkinter.Menu(menubar) menubar.add_cascade(label="Help", menu=helpmenu) helpmenu.add_command(label="About") # display the menu window.config(menu=menubar) btn = tkinter.Button(window, text="Sub-window 1") btn.pack(anchor='center') btn2 = tkinter.Button(window, text="Sub-window 2") btn2.pack(anchor='center') window.mainloop()
At this stage the buttons won’t do anything. We’ll add that later.
Add an ‘About’ box
Next, we add an ‘About’ option to the ‘Help’ menu:
Clicking that ‘About’ option will create an ‘About box’
We do this by first creating a function to hold the details of this new ‘About’ window, along with a corresponding reference to that function in the button click.
First, we’ll create a function to hole the ‘About’ window:
def create_about(): about_window = tkinter.Toplevel(window) about_window.title('About') lbl = tkinter.Label(about_window, text="About") lbl.config(anchor=tkinter.CENTER) lbl.pack(anchor='center') btn = tkinter.Button(about_window, text="OK", command=about_window.destroy) btn.pack(anchor='center')
And then update the ‘helpmenu’ menu bar to include a command which points to that new function.
helpmenu.add_command(label="About", command=create_about)
Add the First Sub-window
In this first sub-window, we’ll add quite a bit of functionality:
- Close a window with a click
- Add text box / label to a window
- Centering text box / label
- Get a value from a button click
- Use a button to run non-UI functionality
- Use a button to create an information box
As with the ‘about’ box, we can keep the details of this new sub-window inside its own function, and then reference this function in the button click.
First we can update the button click to reference a function:
btn = tkinter.Button(window, text="Sub-window 1", command=create_subwindow1)
And then add the function itself
def create_subwindow1(): def retrieve_input(): entryText = entry.get() if os.path.exists(entryText): lbl2.config(text='A file') else: lbl2.config(text='Not a file') sub_window = tkinter.Toplevel(window) sub_window.title('Sub-window 1') lbl = tkinter.Label(sub_window, text="Sub-window 1") lbl.config(anchor=tkinter.CENTER) lbl.pack(anchor='center') btn = tkinter.Button(sub_window, text="Close", command=sub_window.destroy) btn.pack(anchor='center') lbl2 = tkinter.Label(sub_window, text="") lbl2.pack(anchor='center') entry = tkinter.Entry(sub_window) entry.pack(anchor='center') buttonCommit=tkinter.Button(sub_window, text="Check path exists", command=retrieve_input) buttonCommit.pack(anchor='center') btn2 = tkinter.Button(sub_window, text="Functionality 2", command=lambda: messagebox.showinfo("Info","Not Yet Implemented")) btn2.pack(anchor='center')
The resulting sub-window should look like this:
And the ‘Not Yet Implemented’ info message when we click on Functionality 2 comes up as this:
Add the Second Sub-window
Finally we’ll add the code for the second sub-window, although this time we are actually going to make a warning window.
Again, we follow the same pattern of updating the button ‘command’ attribute. A difference here is that rather than creating a separate function, we instead create a inline, lambda function to hold the message box creation:
btn2 = tkinter.Button(window, text="Sub-window 2", command=lambda: tkinter.messagebox.showwarning("Warning","Warning message"))