import tkinter
import tkinter . messagebox
import customtkinter
from api import get_person_all
class VermögenFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Vermögen \n \n " + ' Im Vermögen fenster kannst du das Vermögen der aktuellen Person anpassen. Füge neue Konten \n mit Guthaben hinzu. ' )
self . textbox . configure ( state = ' disabled ' )
class ProjekteFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Projekte \n \n " + ' Im Projekte Fenster kannst du Projekte erstellen mit denen du Einnahmen und Ausgaben Thematisch zuordnen kannst. ' )
self . textbox . configure ( state = ' disabled ' )
class KategorieFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Kategorien \n \n " + ' Hier kannst du Kategorien erstellen um deine Einnahmen und Ausgaben noch besser nachvollziehen zu können. ' )
self . textbox . configure ( state = ' disabled ' )
class EinträgeFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Einträge \n \n " + ' Im Einträge Fenster kannst du Einträge machen. Einträge sind entweder Aussgaben oder Einnahmen einer bestimmten Person. ' )
self . textbox . configure ( state = ' disabled ' )
class ÜbersichtFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Übersicht \n \n " + ' Hier kanst du dir eine Übersicht über deine Ausgaben und Einnahmen verschaffen. Alle eingetragenen Daten werden hier für dich einfach nachvollziehbar angezeigt. ' )
self . textbox . configure ( state = ' disabled ' )
class ExportFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
self . textbox = customtkinter . CTkTextbox ( self , width = 600 , height = 100 )
self . textbox . grid ( row = 0 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set default values
self . textbox . insert ( " 0.0 " , " Export \n \n " + ' Wie der Name vermuten lässt kannst du hier deine Datenbank in verschiedenen Formen Exportieren lassen. ' )
self . textbox . configure ( state = ' disabled ' )
class PersonFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, **kwargs)
# create textbox
persons = get_person_all ( )
personNames = [ ]
if len ( personNames ) != 0 :
for person in persons :
personNames . append ( person [ ' name ' ] )
else :
personNames . append ( ' Null ' )
self . textbox = customtkinter . CTkTextbox ( self , height = 100 , )
self . textbox . grid ( row = 0 , column = 0 , columnspan = 4 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
# set active person
self . activePersonLabel = customtkinter . CTkLabel ( self , text = ' Aktive Person ' )
self . activePersonLabel . grid ( row = 1 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nw " )
self . optionMenu = customtkinter . CTkOptionMenu ( self , values = personNames , command = self . optionmenu_callback , )
self . optionMenu . grid ( row = 2 , column = 0 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nws " )
# create person
self . createPersonLabel = customtkinter . CTkLabel ( self , text = ' Person erstellen ' )
self . createPersonLabel . grid ( row = 1 , column = 1 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nw " )
self . personNameEntry = customtkinter . CTkEntry ( self , placeholder_text = ' Name ' )
self . personNameEntry . grid ( row = 2 , column = 1 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = ' nw ' )
self . createButton = customtkinter . CTkButton ( self , text = ' Erstellen ' , command = self . createPerson )
self . createButton . grid ( row = 2 , column = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = ' nw ' )
# set default values
self . textbox . insert ( " 0.0 " , " Person \n \n " + ' Hier kannst du neue Personen erstellen, und die aktuell aktive Person auswählen ' )
self . textbox . configure ( state = ' disabled ' )
def optionmenu_callback ( self , choice ) :
print ( " optionmenu dropdown clicked: " , choice )
def createPerson ( self ) :
name = self . personNameEntry . get ( )
print ( name )
class ExampleFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
customtkinter . CTkFrame . __init__ ( self , parent )
#super().__init__(*args, self, **kwargs)
# create main entry and button
self . entry = customtkinter . CTkEntry ( self , placeholder_text = " CTkEntry " )
self . entry . grid ( row = 3 , column = 1 , columnspan = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 20 ) , sticky = " nsew " )
self . main_button_1 = customtkinter . CTkButton ( master = self , fg_color = " transparent " , border_width = 2 , text_color = ( " gray10 " , " #DCE4EE " ) )
self . main_button_1 . grid ( row = 3 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 20 ) , sticky = " nsew " )
# create textbox
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 " )
self . tabview . tab ( " CTkTabview " ) . grid_columnconfigure ( 0 , weight = 1 ) # configure grid of individual tabs
self . tabview . tab ( " Tab 2 " ) . grid_columnconfigure ( 0 , weight = 1 )
self . optionmenu_1 = customtkinter . CTkOptionMenu ( self . tabview . tab ( " CTkTabview " ) , dynamic_resizing = False ,
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 ) )
self . string_input_button = customtkinter . CTkButton ( self . tabview . tab ( " CTkTabview " ) , text = " Open CTkInputDialog " ,
command = self . open_input_dialog_event )
self . string_input_button . grid ( row = 2 , column = 0 , padx = 20 , pady = ( 10 , 10 ) )
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 )
# create radiobutton frame
self . radiobutton_frame = customtkinter . CTkFrame ( self )
self . radiobutton_frame . grid ( row = 0 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
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 " )
# create checkbox and switch frame
self . checkbox_slider_frame = customtkinter . CTkFrame ( self )
self . checkbox_slider_frame . grid ( row = 1 , column = 3 , padx = ( 20 , 20 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
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 " )
self . switch_1 = customtkinter . CTkSwitch ( master = self . checkbox_slider_frame , command = lambda : print ( " switch 1 toggle " ) )
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
self . slider_progressbar_frame = customtkinter . CTkFrame ( self , fg_color = " transparent " )
self . slider_progressbar_frame . grid ( row = 1 , column = 1 , columnspan = 2 , padx = ( 20 , 0 ) , pady = ( 20 , 0 ) , sticky = " nsew " )
self . slider_progressbar_frame . grid_columnconfigure ( 0 , weight = 1 )
self . slider_progressbar_frame . grid_rowconfigure ( 4 , weight = 1 )
self . seg_button_1 = customtkinter . CTkSegmentedButton ( self . slider_progressbar_frame )
self . seg_button_1 . grid ( row = 0 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
self . progressbar_1 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame )
self . progressbar_1 . grid ( row = 1 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
self . progressbar_2 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame )
self . progressbar_2 . grid ( row = 2 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
self . slider_1 = customtkinter . CTkSlider ( self . slider_progressbar_frame , from_ = 0 , to = 1 , number_of_steps = 4 )
self . slider_1 . grid ( row = 3 , column = 0 , padx = ( 20 , 10 ) , pady = ( 10 , 10 ) , sticky = " ew " )
self . slider_2 = customtkinter . CTkSlider ( self . slider_progressbar_frame , orientation = " vertical " )
self . slider_2 . grid ( row = 0 , column = 1 , rowspan = 5 , padx = ( 10 , 10 ) , pady = ( 10 , 10 ) , sticky = " ns " )
self . progressbar_3 = customtkinter . CTkProgressBar ( self . slider_progressbar_frame , orientation = " vertical " )
self . progressbar_3 . grid ( row = 0 , column = 2 , rowspan = 5 , padx = ( 10 , 20 ) , pady = ( 10 , 10 ) , sticky = " ns " )
# set default values
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 . optionmenu_1 . set ( " CTkOptionmenu " )
self . combobox_1 . set ( " CTkComboBox " )
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 ( )
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 " )
def open_input_dialog_event ( self ) :
dialog = customtkinter . CTkInputDialog ( text = " Type in a number: " , title = " CTkInputDialog " )
print ( " CTkInputDialog: " , dialog . get_input ( ) )
class SidebarFrame ( customtkinter . CTkFrame ) :
def __init__ ( self , parent , controller ) :
#super().__init__(*args, **kwargs)
customtkinter . CTkFrame . __init__ ( self , parent )
self . sidebar_frame = customtkinter . CTkFrame ( self , width = 140 , corner_radius = 0 )
self . sidebar_frame . grid ( row = 0 , column = 0 , rowspan = 4 , sticky = " nsew " )
self . sidebar_frame . grid_rowconfigure ( 9 , weight = 1 )
# Header
self . logo_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " BudgetPy " , font = customtkinter . CTkFont ( size = 20 , weight = " bold " ) )
self . logo_label . grid ( row = 0 , column = 0 , padx = 20 , pady = ( 20 , 10 ) )
# Button Personen
self . sidebar_button_1 = customtkinter . CTkButton ( self . sidebar_frame , text = " Personen " , command = lambda : controller . show_frame ( ' personFrame ' ) )
self . sidebar_button_1 . grid ( row = 1 , column = 0 , padx = 20 , pady = 10 )
# Button Vermögen
self . sidebar_button_2 = customtkinter . CTkButton ( self . sidebar_frame , text = " Vermögen " , command = lambda : controller . show_frame ( ' vermögenFrame ' ) )
self . sidebar_button_2 . grid ( row = 2 , column = 0 , padx = 20 , pady = 10 )
# Button Projekte
self . sidebar_button_3 = customtkinter . CTkButton ( self . sidebar_frame , text = " Projekte " , command = lambda : controller . show_frame ( ' projekteFrame ' ) )
self . sidebar_button_3 . grid ( row = 3 , column = 0 , padx = 20 , pady = 10 )
# Button Kategorien
self . sidebar_button_4 = customtkinter . CTkButton ( self . sidebar_frame , text = " Kategorien " , command = lambda : controller . show_frame ( ' kategorieFrame ' ) )
self . sidebar_button_4 . grid ( row = 4 , column = 0 , padx = 20 , pady = 10 )
# Button Einträge
self . sidebar_button_4 = customtkinter . CTkButton ( self . sidebar_frame , text = " Einträge " , command = lambda : controller . show_frame ( ' einträgeFrame ' ) )
self . sidebar_button_4 . grid ( row = 6 , column = 0 , padx = 20 , pady = 10 )
# Button Übersicht
self . sidebar_button_5 = customtkinter . CTkButton ( self . sidebar_frame , text = " Übersicht " , command = lambda : controller . show_frame ( ' übersichtFrame ' ) )
self . sidebar_button_5 . grid ( row = 7 , column = 0 , padx = 20 , pady = 10 )
# Button Export
self . sidebar_button_6 = customtkinter . CTkButton ( self . sidebar_frame , text = " Export " , command = lambda : controller . show_frame ( ' exportFrame ' ) )
self . sidebar_button_6 . grid ( row = 8 , column = 0 , padx = 20 , pady = 10 )
# Example Frame
self . sidebar_button_7 = customtkinter . CTkButton ( self . sidebar_frame , text = " Example " , command = lambda : controller . show_frame ( ' exampleFrame ' ) )
self . sidebar_button_7 . grid ( row = 9 , column = 0 , padx = 20 , pady = 10 )
# Apperance Mode Label
self . appearance_mode_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " Theme: " , anchor = " w " )
self . appearance_mode_label . grid ( row = 10 , column = 0 , padx = 20 , pady = ( 10 , 0 ) )
# Apperance Mode Option Menu
self . appearance_mode_optionemenu = customtkinter . CTkOptionMenu ( self . sidebar_frame , values = [ " Light " , " Dark " , " System " ] ,
command = self . change_appearance_mode_event )
# UI Scaling Label
self . scaling_label = customtkinter . CTkLabel ( self . sidebar_frame , text = " Skalierung: " , anchor = " w " )
self . scaling_label . grid ( row = 12 , column = 0 , padx = 20 , pady = ( 10 , 0 ) )
# UI Scaling Option Menu
self . scaling_optionemenu = customtkinter . CTkOptionMenu ( self . sidebar_frame , values = [ " 80 % " , " 90 % " , " 100 % " , " 110 % " , " 120 % " ] ,
command = self . change_scaling_event )
self . scaling_optionemenu . grid ( row = 13 , column = 0 , padx = 20 , pady = ( 10 , 20 ) )
# set default values
self . appearance_mode_optionemenu . grid ( row = 11 , column = 0 , padx = 20 , pady = ( 10 , 10 ) )
self . appearance_mode_optionemenu . set ( " System " )
self . scaling_optionemenu . set ( " 100 % " )
def get_value ( self ) :
""" returns selected value as a string, returns an empty string if nothing selected """
return self . radio_button_var . get ( )
def set_value ( self , selection ) :
""" selects the corresponding radio button, selects nothing if no corresponding radio button """
self . radio_button_var . set ( selection )
def change_appearance_mode_event ( self , new_appearance_mode : str ) :
customtkinter . set_appearance_mode ( new_appearance_mode )
def change_scaling_event ( self , new_scaling : str ) :
new_scaling_float = int ( new_scaling . replace ( " % " , " " ) ) / 100
customtkinter . set_widget_scaling ( new_scaling_float )
def sidebar_button_event ( self ) :
print ( " sidebar_button click " )