2022-06-30 16:53:32 +03:00
import tkinter
import tkinter . messagebox
import customtkinter
customtkinter . set_appearance_mode ( " System " ) # Modes: "System" (standard), "Dark", "Light"
customtkinter . set_default_color_theme ( " blue " ) # Themes: "blue" (standard), "green", "dark-blue"
class App ( customtkinter . CTk ) :
def __init__ ( self ) :
super ( ) . __init__ ( )
2022-11-06 16:40:15 +03:00
# configure window
2022-06-30 16:53:32 +03:00
self . title ( " CustomTkinter complex_example.py " )
2022-10-10 01:48:08 +03:00
self . geometry ( f " { 1100 } x { 580 } " )
2022-06-30 16:53:32 +03:00
# configure grid layout (4x4)
self . grid_columnconfigure ( 1 , weight = 1 )
2022-11-01 02:37:30 +03:00
self . grid_columnconfigure ( ( 2 , 3 ) , weight = 0 )
2022-06-30 16:53:32 +03:00
self . grid_rowconfigure ( ( 0 , 1 , 2 ) , weight = 1 )
2022-07-02 15:10:41 +03:00
# create sidebar frame with widgets
2022-10-15 02:02:54 +03:00
self . sidebar_frame = customtkinter . CTkFrame ( self , width = 140 , corner_radius = 0 )
2022-06-30 16:53:32 +03:00
self . sidebar_frame . grid ( row = 0 , column = 0 , rowspan = 4 , sticky = " nsew " )
self . sidebar_frame . grid_rowconfigure ( 4 , weight = 1 )
2022-10-03 01:33:06 +03:00
self . logo_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " CustomTkinter " , font = ( " Roboto " , - 16 ) )
2022-06-30 16:53:32 +03:00
self . logo_label . grid ( row = 0 , column = 0 , padx = 20 , pady = ( 20 , 10 ) )
self . sidebar_button_1 = customtkinter . CTkButton ( self . sidebar_frame , command = self . sidebar_button_callback )
self . sidebar_button_1 . grid ( row = 1 , column = 0 , padx = 20 , pady = 10 )
self . sidebar_button_2 = customtkinter . CTkButton ( self . sidebar_frame , command = self . sidebar_button_callback )
self . sidebar_button_2 . grid ( row = 2 , column = 0 , padx = 20 , pady = 10 )
self . sidebar_button_3 = customtkinter . CTkButton ( self . sidebar_frame , command = self . sidebar_button_callback )
self . sidebar_button_3 . grid ( row = 3 , column = 0 , padx = 20 , pady = 10 )
2022-07-02 15:10:41 +03:00
self . appearance_mode_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " Appearance Mode: " , anchor = " w " )
2022-06-30 16:53:32 +03:00
self . appearance_mode_label . grid ( row = 5 , column = 0 , padx = 20 , pady = ( 10 , 0 ) )
self . appearance_mode_optionemenu = customtkinter . CTkOptionMenu ( self . sidebar_frame , values = [ " Light " , " Dark " , " System " ] ,
command = self . change_appearance_mode )
2022-07-02 15:10:41 +03:00
self . appearance_mode_optionemenu . grid ( row = 6 , column = 0 , padx = 20 , pady = ( 10 , 10 ) )
2022-07-23 20:09:53 +03:00
self . scaling_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " UI Scaling: " , anchor = " w " )
2022-07-02 15:10:41 +03:00
self . scaling_label . grid ( row = 7 , column = 0 , padx = 20 , pady = ( 10 , 0 ) )
2022-07-18 14:02:39 +03:00
self . scaling_optionemenu = customtkinter . CTkOptionMenu ( self . sidebar_frame , values = [ " 80 % " , " 90 % " , " 100 % " , " 110 % " , " 120 % " ] ,
2022-07-02 15:10:41 +03:00
command = self . change_scaling )
self . scaling_optionemenu . grid ( row = 8 , column = 0 , padx = 20 , pady = ( 10 , 20 ) )
2022-06-30 16:53:32 +03:00
# create main entry and button
self . entry = customtkinter . CTkEntry ( self , placeholder_text = " CTkEntry " )
2022-11-01 02:37:30 +03:00
self . entry . grid ( row = 3 , column = 1 , columnspan = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 20 ) , sticky = " nsew " )
2022-06-30 16:53:32 +03:00
2022-11-11 01:27:55 +03:00
self . main_button_1 = customtkinter . CTkButton ( master = self , fg_color = " transparent " , border_width = 2 )
2022-11-01 02:37:30 +03:00
self . main_button_1 . grid ( row = 3 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 20 ) , sticky = " nsew " )
2022-06-30 16:53:32 +03:00
2022-10-10 01:48:08 +03:00
# create textbox
2022-11-01 02:37:30 +03:00
self . textbox = customtkinter . CTkTextbox ( self , width = 250 )
self . textbox . grid ( row = 0 , column = 1 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# create tabview
self . tabview = customtkinter . CTkTabview ( self , width = 250 )
self . tabview . grid ( row = 0 , column = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
self . tabview . add ( " CTkTabview " )
self . tabview . add ( " Tab 2 " )
self . tabview . add ( " Tab 3 " )
2022-11-06 16:40:15 +03:00
self . tabview . tab ( " CTkTabview " ) . grid_columnconfigure ( 0 , weight = 1 ) # configure grid of individual tabs
self . tabview . tab ( " Tab 2 " ) . grid_columnconfigure ( 0 , weight = 1 )
2022-11-01 02:37:30 +03:00
2022-11-06 16:40:15 +03:00
self . optionmenu_1 = customtkinter . CTkOptionMenu ( self . tabview . tab ( " CTkTabview " ) , dynamic_resizing = False ,
2022-11-01 02:37:30 +03:00
values = [ " Value 1 " , " Value 2 " , " Value Long Long Long " ] )
self . optionmenu_1 . grid ( row = 0 , column = 0 , padx = 20 , pady = ( 20 , 10 ) )
self . combobox_1 = customtkinter . CTkComboBox ( self . tabview . tab ( " CTkTabview " ) ,
values = [ " Value 1 " , " Value 2 " , " Value Long..... " ] )
self . combobox_1 . grid ( row = 1 , column = 0 , padx = 20 , pady = ( 10 , 10 ) )
2022-11-06 16:40:15 +03:00
self . string_input_button = customtkinter . CTkButton ( self . tabview . tab ( " CTkTabview " ) , text = " Open CTkInputDialog " ,
2022-11-01 02:37:30 +03:00
command = self . open_input_dialog )
self . string_input_button . grid ( row = 2 , column = 0 , padx = 20 , pady = ( 10 , 10 ) )
2022-11-06 16:40:15 +03:00
self . label_tab_2 = customtkinter . CTkLabel ( self . tabview . tab ( " Tab 2 " ) , text = " CTkLabel on Tab 2 " )
self . label_tab_2 . grid ( row = 0 , column = 0 , padx = 20 , pady = 20 )
2022-06-30 16:53:32 +03:00
2022-10-10 01:48:08 +03:00
# create radiobutton frame
self . radiobutton_frame = customtkinter . CTkFrame ( self )
2022-11-01 02:37:30 +03:00
self . radiobutton_frame . grid ( row = 0 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
2022-10-10 01:48:08 +03:00
self . radio_var = tkinter . IntVar ( value = 0 )
self . label_radio_group = customtkinter . CTkLabel ( master = self . radiobutton_frame , text = " CTkRadioButton Group: " )
self . label_radio_group . grid ( row = 0 , column = 2 , columnspan = 1 , padx = 10 , pady = 10 , sticky = " " )
self . radio_button_1 = customtkinter . CTkRadioButton ( master = self . radiobutton_frame , variable = self . radio_var , value = 0 )
self . radio_button_1 . grid ( row = 1 , column = 2 , pady = 10 , padx = 20 , sticky = " n " )
self . radio_button_2 = customtkinter . CTkRadioButton ( master = self . radiobutton_frame , variable = self . radio_var , value = 1 )
self . radio_button_2 . grid ( row = 2 , column = 2 , pady = 10 , padx = 20 , sticky = " n " )
self . radio_button_3 = customtkinter . CTkRadioButton ( master = self . radiobutton_frame , variable = self . radio_var , value = 2 )
self . radio_button_3 . grid ( row = 3 , column = 2 , pady = 10 , padx = 20 , sticky = " n " )
2022-06-30 16:53:32 +03:00
# create checkbox and switch frame
self . checkbox_slider_frame = customtkinter . CTkFrame ( self )
2022-11-01 02:37:30 +03:00
self . checkbox_slider_frame . grid ( row = 1 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
2022-06-30 16:53:32 +03:00
self . checkbox_1 = customtkinter . CTkCheckBox ( master = self . checkbox_slider_frame )
self . checkbox_1 . grid ( row = 1 , column = 0 , pady = ( 20 , 10 ) , padx = 20 , sticky = " n " )
self . checkbox_2 = customtkinter . CTkCheckBox ( master = self . checkbox_slider_frame )
self . checkbox_2 . grid ( row = 2 , column = 0 , pady = 10 , padx = 20 , sticky = " n " )
2022-09-16 00:55:55 +03:00
self . switch_1 = customtkinter . CTkSwitch ( master = self . checkbox_slider_frame , command = lambda : print ( " switch 1 toggle " ) )
2022-06-30 16:53:32 +03:00
self . switch_1 . grid ( row = 3 , column = 0 , pady = 10 , padx = 20 , sticky = " n " )
self . switch_2 = customtkinter . CTkSwitch ( master = self . checkbox_slider_frame )
self . switch_2 . grid ( row = 4 , column = 0 , pady = ( 10 , 20 ) , padx = 20 , sticky = " n " )
# create slider and progressbar frame
2022-11-11 01:27:55 +03:00
self . slider_progressbar_frame = customtkinter . CTkFrame ( self , fg_color = " transparent " )
2022-11-01 02:37:30 +03:00
self . slider_progressbar_frame . grid ( row = 1 , column = 1 , columnspan = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
2022-06-30 16:53:32 +03:00
self . slider_progressbar_frame . grid_columnconfigure ( 0 , weight = 1 )
2022-10-08 02:50:09 +03:00
self . slider_progressbar_frame . grid_rowconfigure ( 4 , weight = 1 )
2022-10-22 16:14:23 +03:00
self . seg_button_1 = customtkinter . CTkSegmentedButton ( self . slider_progressbar_frame )
2022-10-10 01:48:08 +03:00
self . seg_button_1 . grid ( row = 0 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
2022-06-30 16:53:32 +03:00
self . progressbar_1 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame )
2022-10-08 02:50:09 +03:00
self . progressbar_1 . grid ( row = 1 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
2022-09-17 01:18:31 +03:00
self . progressbar_2 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame )
2022-10-08 02:50:09 +03:00
self . progressbar_2 . grid ( row = 2 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
2022-09-17 01:18:31 +03:00
self . slider_1 = customtkinter . CTkSlider ( self . slider_progressbar_frame , from_ = 0 , to = 1 , number_of_steps = 4 )
2022-10-08 02:50:09 +03:00
self . slider_1 . grid ( row = 3 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
2022-10-03 01:33:06 +03:00
self . slider_2 = customtkinter . CTkSlider ( self . slider_progressbar_frame , orientation = " vertical " )
2022-10-08 02:50:09 +03:00
self . slider_2 . grid ( row = 0 , column = 1 , rowspan = 5 , padx = ( 10 , 10 ) , pady = ( 10 , 10 ) , sticky = " ns " )
2022-10-03 01:33:06 +03:00
self . progressbar_3 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame , orientation = " vertical " )
2022-10-08 02:50:09 +03:00
self . progressbar_3 . grid ( row = 0 , column = 2 , rowspan = 5 , padx = ( 10 , 20 ) , pady = ( 10 , 10 ) , sticky = " ns " )
2022-06-30 16:53:32 +03:00
# set default values
self . sidebar_button_3 . configure ( state = " disabled " , text = " Disabled CTkButton " )
self . checkbox_2 . configure ( state = " disabled " )
self . switch_2 . configure ( state = " disabled " )
self . checkbox_1 . select ( )
self . switch_1 . select ( )
self . radio_button_3 . configure ( state = " disabled " )
self . appearance_mode_optionemenu . set ( " Dark " )
2022-07-02 15:10:41 +03:00
self . scaling_optionemenu . set ( " 100 % " )
2022-06-30 16:53:32 +03:00
self . optionmenu_1 . set ( " CTkOptionmenu " )
self . combobox_1 . set ( " CTkComboBox " )
2022-09-17 01:18:31 +03:00
self . slider_1 . configure ( command = self . progressbar_2 . set )
self . slider_2 . configure ( command = self . progressbar_3 . set )
self . progressbar_1 . configure ( mode = " indeterminnate " )
self . progressbar_1 . start ( )
2022-10-10 01:48:08 +03:00
self . textbox . insert ( " 0.0 " , " CTkTextbox \n \n " + " Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. \n \n " * 20 )
self . seg_button_1 . configure ( values = [ " CTkSegmentedButton " , " Value 2 " , " Value 3 " ] )
self . seg_button_1 . set ( " Value 2 " )
2022-06-30 16:53:32 +03:00
def open_input_dialog ( self ) :
2022-11-11 02:06:25 +03:00
dialog = customtkinter . CTkInputDialog ( text = " Type in a number: " * 500 , title = " CTkInputDialog " )
2022-06-30 16:53:32 +03:00
print ( " CTkInputDialog: " , dialog . get_input ( ) )
2022-07-02 15:10:41 +03:00
def change_appearance_mode ( self , new_appearance_mode : str ) :
2022-06-30 16:53:32 +03:00
customtkinter . set_appearance_mode ( new_appearance_mode )
2022-07-02 15:10:41 +03:00
def change_scaling ( self , new_scaling : str ) :
new_scaling_float = int ( new_scaling . replace ( " % " , " " ) ) / 100
customtkinter . set_widget_scaling ( new_scaling_float )
2022-06-30 16:53:32 +03:00
def sidebar_button_callback ( self ) :
print ( " sidebar_button click " )
2022-10-02 04:23:10 +03:00
2022-06-30 16:53:32 +03:00
if __name__ == " __main__ " :
app = App ( )
app . mainloop ( )