Open In App

Build a Basic Form GUI using CustomTkinter module in Python

In this article, we are going to learn how to build a simple form GUI using CustomTkinter in Python.

CustomTkinter: It is an extension of the Tkinter module in python. It provides additional UI elements compared to Tkinter and they can be customized in various possible ways. For example, we can customize a button using CustomTkinter, we can make customizations like adding an image, making the edges round, adding borders around it, etc.



To install the customtkinter module in Python execute the below command in the terminal:

pip install customtkinter

Designing the form

Design phase is an important phase in the cycle of development of an application. To design the layout of our form we can use paint application or any other online tool to design the page as given below.



 

Building the initial application

Here we are going to create a simple blank application page using customtkinter module and setting its appreance as same as of system (Dark or light mode). Defining a App class in which we have defined the __init__ function and sets the title and its size.




# Import customtkinter module
import customtkinter as ctk
 
# Sets the appearance mode of the application
# "System" sets the appearance same as that of the system
ctk.set_appearance_mode("System")       
 
# Sets the color of the widgets
# Supported themes: green, dark-blue, blue
ctk.set_default_color_theme("green")   
 
# Create App class
class App(ctk.CTk):
# Layout of the GUI will be written in the init itself
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
# Sets the title of our window to "App"
        self.title("App")   
# Dimensions of the window will be 200x200
        self.geometry("200x200")   
 
 
if __name__ == "__main__":
    app = App()
    # Runs the app
    app.mainloop()   

Output :

 

Desiging the form using the customtkinter module in Python

Here we are going to build the form that we have design above. we are going to use labels using CTkLabel() function, text field using CTkEntry() function, radio button using CTkRadioButton() function, etc.

All the widgets are created and placed in the following manner

Syntax of grid():

grid( grid_options )

Parameters:

  • row: Specifies the row at which the widget must be placed.
  • column: Specifies the column at which the widget must be placed.
  • rowspan: Specifies the height of the widget (number of rows the widget spans).
  • columnspan: Specifies the length of the widget (number of columns the widget spans).
  • padx, pady: Specifies the padding of the widget along x and y axes respectively.
  • sticky: Specifies how the widget elongates with respect to the changes in its corresponding row and column.




# Python program to create a basic GUI
# application using the customtkinter module
 
import customtkinter as ctk
import tkinter as tk
 
# Basic parameters and initializations
# Supported modes : Light, Dark, System
ctk.set_appearance_mode("System")
 
# Supported themes : green, dark-blue, blue
ctk.set_default_color_theme("green")   
 
appWidth, appHeight = 600, 700
 
# App Class
class App(ctk.CTk):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
 
        self.title("GUI Application")
        self.geometry(f"{appWidth}x{appHeight}")
 
        # Name Label
        self.nameLabel = ctk.CTkLabel(self,
                                      text="Name")
        self.nameLabel.grid(row=0, column=0,
                            padx=20, pady=20,
                            sticky="ew")
 
        # Name Entry Field
        self.nameEntry = ctk.CTkEntry(self,
                         placeholder_text="Teja")
        self.nameEntry.grid(row=0, column=1,
                            columnspan=3, padx=20,
                            pady=20, sticky="ew")
 
        # Age Label
        self.ageLabel = ctk.CTkLabel(self,
                                     text="Age")
        self.ageLabel.grid(row=1, column=0,
                           padx=20, pady=20,
                           sticky="ew")
 
        # Age Entry Field
        self.ageEntry = ctk.CTkEntry(self,
                            placeholder_text="18")
        self.ageEntry.grid(row=1, column=1,
                           columnspan=3, padx=20,
                           pady=20, sticky="ew")
 
        # Gender Label
        self.genderLabel = ctk.CTkLabel(self,
                                    text="Gender")
        self.genderLabel.grid(row=2, column=0,
                              padx=20, pady=20,
                              sticky="ew")
 
        # Gender Radio Buttons
        self.genderVar = tk.StringVar(value="Prefer\
                                         not to say")
 
        self.maleRadioButton = ctk.CTkRadioButton(self,
                                  text="Male",
                                  variable=self.genderVar,
                                            value="He is")
        self.maleRadioButton.grid(row=2, column=1, padx=20,
                                  pady=20, sticky="ew")
 
        self.femaleRadioButton = ctk.CTkRadioButton(self,
                                      text="Female",
                                      variable=self.genderVar,
                                      value="She is")
        self.femaleRadioButton.grid(row=2, column=2,
                                    padx=20,
                                    pady=20, sticky="ew")
         
        self.noneRadioButton = ctk.CTkRadioButton(self,
                                    text="Prefer not to say",
                                    variable=self.genderVar,
                                            value="They are")
        self.noneRadioButton.grid(row=2, column=3,
                                  padx=20, pady=20,
                                  sticky="ew")
 
        # Choice Label
        self.choiceLabel = ctk.CTkLabel(self,
                                        text="Choice")
        self.choiceLabel.grid(row=3, column=0,
                              padx=20, pady=20,
                              sticky="ew")
 
        # Choice Check boxes
        self.checkboxVar = tk.StringVar(value="Choice 1")
         
        self.choice1 = ctk.CTkCheckBox(self, text="choice 1",
                                       variable=self.checkboxVar,
                                       onvalue="choice1",
                                       offvalue="c1")
        self.choice1.grid(row=3, column=1, padx=20,
                          pady=20, sticky="ew")
 
        self.choice2 = ctk.CTkCheckBox(self, text="choice 2",
                                       variable=self.checkboxVar,
                                       onvalue="choice2",
                                       offvalue="c2")                              
        self.choice2.grid(row=3, column=2, padx=20, pady=20,
                          sticky="ew")
 
        # Occupation Label
        self.occupationLabel = ctk.CTkLabel(self,
                                            text="Occupation")
        self.occupationLabel.grid(row=4, column=0,
                                  padx=20, pady=20,
                                  sticky="ew")
 
        # Occupation combo box
        self.occupationOptionMenu = ctk.CTkOptionMenu(self,
                                        values=["Student",
                                        "Working Professional"])
        self.occupationOptionMenu.grid(row=4, column=1,
                                       padx=20, pady=20,
                                       columnspan=2, sticky="ew")
 
        # Generate Button
        self.generateResultsButton = ctk.CTkButton(self,
                                         text="Generate Results")
        self.generateResultsButton.grid(row=5, column=1,
                                        columnspan=2,
                                        padx=20, pady=20,
                                        sticky="ew")
 
        # Text Box
        self.displayBox = ctk.CTkTextbox(self, width=200,
                                         height=100)
        self.displayBox.grid(row=6, column=0, columnspan=4,
                             padx=20, pady=20, sticky="nsew")
 
if __name__ == "__main__":
    app = App()
    app.mainloop()

Output :

 

Complete application using customtkinter module in Python

In the previous step we have designed our form UI and now we are going to add some more functionality of generate result and printing the all information entered by user in the result block. For that we are going to create two function given below.




# Python program to create a basic form
# GUI application using the customtkinter module
import customtkinter as ctk
import tkinter as tk
 
# Sets the appearance of the window
# Supported modes : Light, Dark, System
# "System" sets the appearance mode to
# the appearance mode of the system
ctk.set_appearance_mode("System")  
 
# Sets the color of the widgets in the window
# Supported themes : green, dark-blue, blue   
ctk.set_default_color_theme("green")   
 
# Dimensions of the window
appWidth, appHeight = 600, 700
 
 
# App Class
class App(ctk.CTk):
    # The layout of the window will be written
    # in the init function itself
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
 
        # Sets the title of the window to "App"
        self.title("GUI Application")  
        # Sets the dimensions of the window to 600x700
        self.geometry(f"{appWidth}x{appHeight}")   
 
        # Name Label
        self.nameLabel = ctk.CTkLabel(self,
                                text="Name")
        self.nameLabel.grid(row=0, column=0,
                            padx=20, pady=20,
                            sticky="ew")
 
        # Name Entry Field
        self.nameEntry = ctk.CTkEntry(self,
                          placeholder_text="Teja")
        self.nameEntry.grid(row=0, column=1,
                            columnspan=3, padx=20,
                            pady=20, sticky="ew")
 
        # Age Label
        self.ageLabel = ctk.CTkLabel(self, text="Age")
        self.ageLabel.grid(row=1, column=0,
                           padx=20, pady=20,
                           sticky="ew")
 
        # Age Entry Field
        self.ageEntry = ctk.CTkEntry(self,
                            placeholder_text="18")
        self.ageEntry.grid(row=1, column=1,
                           columnspan=3, padx=20,
                           pady=20, sticky="ew")
 
        # Gender Label
        self.genderLabel = ctk.CTkLabel(self,
                                  text="Gender")
        self.genderLabel.grid(row=2, column=0,
                              padx=20, pady=20,
                              sticky="ew")
 
        # Gender Radio Buttons
        self.genderVar = tk.StringVar(value="Prefer \
                                         not to say")
 
        self.maleRadioButton = ctk.CTkRadioButton(self,
                                   text="Male",
                                   variable=self.genderVar,
                                         value="He is")
        self.maleRadioButton.grid(row=2, column=1,
                                  padx=20, pady=20,
                                  sticky="ew")
 
        self.femaleRadioButton = ctk.CTkRadioButton(self,
                                     text="Female",
                                     variable=self.genderVar,
                                     value="She is")
        self.femaleRadioButton.grid(row=2, column=2,
                                    padx=20, pady=20,
                                    sticky="ew")
         
        self.noneRadioButton = ctk.CTkRadioButton(self,
                                    text="Prefer not to say",
                                    variable=self.genderVar,
                                    value="They are")
        self.noneRadioButton.grid(row=2, column=3, padx=20,
                                  pady=20, sticky="ew")
 
        # Choice Label
        self.choiceLabel = ctk.CTkLabel(self,
                                        text="Choice")
        self.choiceLabel.grid(row=3, column=0,
                              padx=20, pady=20,
                              sticky="ew")
 
        # Choice Check boxes
        self.checkboxVar = tk.StringVar(value="Choice 1")
         
        self.choice1 = ctk.CTkCheckBox(self,
                             text="choice 1",
                             variable=self.checkboxVar,
                             onvalue="choice1", offvalue="c1")
        self.choice1.grid(row=3, column=1,
                          padx=20, pady=20,
                          sticky="ew")
 
        self.choice2 = ctk.CTkCheckBox(self,
                            text="choice 2",
                            variable=self.checkboxVar,
                            onvalue="choice2",
                            offvalue="c2")                              
        self.choice2.grid(row=3, column=2,
                          padx=20, pady=20,
                          sticky="ew")
 
        # Occupation Label
        self.occupationLabel = ctk.CTkLabel(self,
                                    text="Occupation")
        self.occupationLabel.grid(row=4, column=0,
                                  padx=20, pady=20,
                                  sticky="ew")
 
        # Occupation combo box
        self.occupationOptionMenu = ctk.CTkOptionMenu(self,
                                       values=["Student",
                                       "Working Professional"])
        self.occupationOptionMenu.grid(row=4, column=1,
                                       padx=20, pady=20,
                                       columnspan=2, sticky="ew")
 
        # Generate Button
        self.generateResultsButton = ctk.CTkButton(self,
                                         text="Generate Results",
                                         command=self.generateResults)
        self.generateResultsButton.grid(row=5, column=1,
                                        columnspan=2, padx=20,
                                        pady=20, sticky="ew")
 
        # Text Box
        self.displayBox = ctk.CTkTextbox(self,
                                         width=200,
                                         height=100)
        self.displayBox.grid(row=6, column=0,
                             columnspan=4, padx=20,
                             pady=20, sticky="nsew")
 
 
    # This function is used to insert the
    # details entered by users into the textbox
    def generateResults(self):
        self.displayBox.delete("0.0", "200.0")
        text = self.createText()
        self.displayBox.insert("0.0", text)
 
    # This function is used to get the selected
    # options and text from the available entry
    # fields and boxes and then generates
    # a prompt using them
    def createText(self):
        checkboxValue = ""
 
        # .get() is used to get the value of the checkboxes and entryfields
 
        if self.choice1._check_state and self.choice2._check_state:
            checkboxValue += self.choice1.get() + " and " + self.choice2.get()
        elif self.choice1._check_state:
            checkboxValue += self.choice1.get()
        elif self.choice2._check_state:
            checkboxValue += self.choice2.get()
        else:
            checkboxValue = "none of the available options"
 
        # Constructing the text variable
        text = f"{self.nameEntry.get()} : \n{self.genderVar.get()} {self.ageEntry.get()} years old and prefers {checkboxValue}\n"
        text += f"{self.genderVar.get()} currently a {self.occupationOptionMenu.get()}"
 
        return text
 
if __name__ == "__main__":
    app = App()
    # Used to run the application
    app.mainloop()     

Output :


Article Tags :