maxbot 2019.09.24

master
Max Yao 2019-10-02 01:52:13 +08:00
parent b4057d5d06
commit bbcc7eb21f
2 changed files with 3550 additions and 0 deletions

2838
chrome_tixcraft.py Normal file

File diff suppressed because it is too large Load Diff

712
settings.py Normal file
View File

@ -0,0 +1,712 @@
#!/usr/bin/env python
#encoding=utf-8
try:
# for Python2
from Tkinter import *
import ttk
import tkMessageBox as messagebox
except ImportError:
# for Python3
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
import os
import sys
import json
CONST_APP_VERSION = u"MaxBot (2019.09.24)"
CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom"
CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top"
CONST_RANDOM = u"random"
CONST_SELECT_ORDER_DEFAULT = CONST_FROM_TOP_TO_BOTTOM
CONST_SELECT_OPTIONS_DEFAULT = (CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM)
CONST_SELECT_OPTIONS_ARRAY = [CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP, CONST_RANDOM]
config_filepath = None
config_dict = None
window = None
btn_save = None
btn_exit = None
def load_json():
# 讀取檔案裡的參數值
basis = ""
if hasattr(sys, 'frozen'):
basis = sys.executable
else:
basis = sys.argv[0]
app_root = os.path.dirname(basis)
global config_filepath
config_filepath = os.path.join(app_root, 'settings.json')
global config_dict
config_dict = None
if os.path.isfile(config_filepath):
with open(config_filepath) as json_data:
config_dict = json.load(json_data)
def btn_save_clicked():
btn_save_act()
def btn_save_act(slience_mode=False):
is_all_data_correct = True
global config_filepath
global config_dict
if not config_dict is None:
# read user input
global combo_homepage
global combo_browser
global txt_ticket_number
#global txt_facebook_account
global chk_state_auto_press_next_step_button
global chk_state_auto_fill_ticket_number
global txt_kktix_area_keyword
global txt_kktix_answer_dictionary
global chk_state_date_auto_select
global txt_date_keyword
global chk_state_area_auto_select
global txt_area_keyword
global combo_date_auto_select_mode
global combo_area_auto_select_mode
if is_all_data_correct:
if combo_homepage.get().strip()=="":
is_all_data_correct = False
messagebox.showerror("Error", "Please enter homepage")
else:
config_dict["homepage"] = combo_homepage.get().strip()
if is_all_data_correct:
if combo_browser.get().strip()=="":
is_all_data_correct = False
messagebox.showerror("Error", "Please enter browser: chrome or firefox")
else:
config_dict["browser"] = combo_browser.get().strip()
if is_all_data_correct:
if txt_ticket_number.get().strip()=="":
is_all_data_correct = False
messagebox.showerror("Error", "Please enter text")
else:
config_dict["ticket_number"] = int(txt_ticket_number.get().strip())
if is_all_data_correct:
#config_dict["facebook_account"] = txt_facebook_account.get().strip()
pass
if is_all_data_correct:
config_dict["kktix"]["auto_press_next_step_button"] = bool(chk_state_auto_press_next_step_button.get())
config_dict["kktix"]["auto_fill_ticket_number"] = bool(chk_state_auto_fill_ticket_number.get())
config_dict["kktix"]["area_mode"] = combo_kktix_area_mode.get().strip()
config_dict["kktix"]["area_keyword"] = txt_kktix_area_keyword.get().strip()
config_dict["kktix"]["answer_dictionary"] = txt_kktix_answer_dictionary.get().strip()
config_dict["tixcraft"]["date_auto_select"]["enable"] = bool(chk_state_date_auto_select.get())
config_dict["tixcraft"]["date_auto_select"]["date_keyword"] = txt_date_keyword.get().strip()
config_dict["tixcraft"]["area_auto_select"]["enable"] = bool(chk_state_area_auto_select.get())
config_dict["tixcraft"]["area_auto_select"]["area_keyword"] = txt_area_keyword.get().strip()
config_dict["tixcraft"]["date_auto_select"]["mode"] = combo_date_auto_select_mode.get().strip()
config_dict["tixcraft"]["area_auto_select"]["mode"] = combo_area_auto_select_mode.get().strip()
# save config.
if is_all_data_correct:
import json
with open(config_filepath, 'w') as outfile:
json.dump(config_dict, outfile)
if slience_mode==False:
messagebox.showinfo("File Save", "Done ^_^")
return is_all_data_correct
def btn_run_clicked():
if btn_save_act(slience_mode=True):
import subprocess
if hasattr(sys, 'frozen'):
import platform
# check platform here.
# for windows.
if platform.system() == 'Darwin':
subprocess.Popen("./chrome_tixcraft", shell=True)
if platform.system() == 'Windows':
subprocess.Popen("chrome_tixcraft.exe", shell=True)
else:
subprocess.Popen("python chrome_tixcraft.py", shell=True)
def btn_exit_clicked():
root.destroy()
def callbackHomepageOnChange(event):
showHideBlocks()
def callbackDateAutoOnChange():
showHideTixcraftBlocks()
def showHideBlocks(all_layout_visible=False):
global UI_PADDING_X
global frame_group_kktix
global frame_group_kktix_index
global frame_group_tixcraft
global frame_group_tixcraft_index
# for kktix only.
global lbl_kktix_area_mode
global lbl_kktix_answer_dictionary
global txt_kktix_answer_dictionary
global txt_kktix_answer_dictionary_index
global combo_kktix_area_mode
global combo_kktix_area_mode_index
new_homepage = combo_homepage.get().strip()
#print("new homepage value:", new_homepage)
show_block_index = 0
if u'tixcraft' in new_homepage:
show_block_index = 1
if u'famiticket' in new_homepage:
show_block_index = 1
# all_layout_visible==true, means enter function when onload().
#print("all_layout_visible:", all_layout_visible)
if all_layout_visible:
if show_block_index==0:
frame_group_tixcraft.grid_forget()
if u'kktix' in new_homepage:
#combo_kktix_area_mode.grid(column=1, row=combo_kktix_area_mode_index, sticky = W)
#txt_kktix_answer_dictionary.grid(column=1, row=txt_kktix_answer_dictionary_index, sticky = W)
pass
else:
combo_kktix_area_mode.grid_forget()
txt_kktix_answer_dictionary.grid_forget()
else:
frame_group_kktix.grid_forget()
else:
if show_block_index == 0:
frame_group_kktix.grid(column=0, row=frame_group_kktix_index, padx=UI_PADDING_X)
frame_group_tixcraft.grid_forget()
if u'kktix' in new_homepage:
combo_kktix_area_mode.grid(column=1, row=combo_kktix_area_mode_index, sticky = W)
txt_kktix_answer_dictionary.grid(column=1, row=txt_kktix_answer_dictionary_index, sticky = W)
else:
combo_kktix_area_mode.grid_forget()
txt_kktix_answer_dictionary.grid_forget()
else:
frame_group_tixcraft.grid(column=0, row=frame_group_tixcraft_index, padx=UI_PADDING_X)
frame_group_kktix.grid_forget()
lbl_kktix_area_mode_default = 'Area select order'
lbl_kktix_answer_default = 'Answer Dictionary'
if u'kktix' in new_homepage:
lbl_kktix_area_mode['text'] = lbl_kktix_area_mode_default
lbl_kktix_answer_dictionary['text'] = lbl_kktix_answer_default
else:
lbl_kktix_area_mode['text'] = ''
lbl_kktix_answer_dictionary['text'] = ''
showHideTixcraftBlocks()
def showHideTixcraftBlocks():
# for tixcraft show/hide enable.
# field 1
global chk_state_date_auto_select
global date_auto_select_mode_index
global lbl_date_auto_select_mode
global combo_date_auto_select_mode
global date_keyword_index
global lbl_date_keyword
global txt_date_keyword
# field 2
global chk_area_auto_select
global area_auto_select_index
global lbl_area_auto_select_mode
global combo_area_auto_select_mode
global area_keyword_index
global lbl_area_keyword
global txt_area_keyword
new_date_enable = bool(chk_state_date_auto_select.get())
new_area_enable = bool(chk_state_area_auto_select.get())
#print("new new_date_enable value:", new_date_enable)
#print("new new_area_enable value:", new_area_enable)
if new_date_enable:
# show
lbl_date_auto_select_mode.grid(column=0, row=date_auto_select_mode_index, sticky = E)
combo_date_auto_select_mode.grid(column=1, row=date_auto_select_mode_index, sticky = W)
lbl_date_keyword.grid(column=0, row=date_keyword_index, sticky = E)
txt_date_keyword.grid(column=1, row=date_keyword_index, sticky = W)
else:
# hide
lbl_date_auto_select_mode.grid_forget()
combo_date_auto_select_mode.grid_forget()
lbl_date_keyword.grid_forget()
txt_date_keyword.grid_forget()
if new_area_enable:
# show
lbl_area_auto_select_mode.grid(column=0, row=area_auto_select_index, sticky = E)
combo_area_auto_select_mode.grid(column=1, row=area_auto_select_index, sticky = W)
lbl_area_keyword.grid(column=0, row=area_keyword_index, sticky = E)
txt_area_keyword.grid(column=1, row=area_keyword_index, sticky = W)
else:
# hide
lbl_area_auto_select_mode.grid_forget()
combo_area_auto_select_mode.grid_forget()
lbl_area_keyword.grid_forget()
txt_area_keyword.grid_forget()
def MainMenu(root):
global UI_PADDING_X
UI_PADDING_X = 15
global UI_PADDING_Y
UI_PADDING_Y = 10
lbl_homepage = None
lbl_browser = None
lbl_ticket_number = None
lbl_kktix = None
lbl_tixcraft = None
homepage = None
browser = None
ticket_number = 1
auto_press_next_step_button = None
auto_fill_ticket_number = None
kktix_area_mode = ""
kktix_area_keyword = ""
kktix_answer_dictionary = ""
date_auto_select_enable = None
date_auto_select_mode = ""
date_keyword = ""
area_auto_select_enable = None
area_auto_select_mode = ""
area_keyword = ""
global config_dict
if not config_dict is None:
# read config.
if u'homepage' in config_dict:
homepage = config_dict["homepage"]
if u'browser' in config_dict:
browser = config_dict["browser"]
# default ticket number
# 說明:自動選擇的票數
ticket_number = "2"
if u'ticket_number' in config_dict:
ticket_number = str(config_dict["ticket_number"])
facebook_account = ""
if 'facebook_account' in config_dict:
facebook_account = str(config_dict["facebook_account"])
# for ["kktix"]
if 'kktix' in config_dict:
auto_press_next_step_button = config_dict["kktix"]["auto_press_next_step_button"]
auto_fill_ticket_number = config_dict["kktix"]["auto_fill_ticket_number"]
if 'area_mode' in config_dict["kktix"]:
kktix_area_mode = config_dict["kktix"]["area_mode"]
kktix_area_mode = kktix_area_mode.strip()
if not kktix_area_mode in CONST_SELECT_OPTIONS_ARRAY:
kktix_area_mode = CONST_SELECT_ORDER_DEFAULT
if 'area_keyword' in config_dict["kktix"]:
kktix_area_keyword = config_dict["kktix"]["area_keyword"]
if kktix_area_keyword is None:
kktix_area_keyword = ""
kktix_area_keyword = kktix_area_keyword.strip()
if 'answer_dictionary' in config_dict["kktix"]:
kktix_answer_dictionary = config_dict["kktix"]["answer_dictionary"]
if kktix_answer_dictionary is None:
kktix_answer_dictionary = ""
kktix_answer_dictionary = kktix_answer_dictionary.strip()
# for ["tixcraft"]
if 'tixcraft' in config_dict:
date_auto_select_enable = config_dict["tixcraft"]["date_auto_select"]["enable"]
date_auto_select_mode = config_dict["tixcraft"]["date_auto_select"]["mode"]
if not date_auto_select_mode in CONST_SELECT_OPTIONS_ARRAY:
date_auto_select_mode = CONST_SELECT_ORDER_DEFAULT
if 'date_keyword' in config_dict["tixcraft"]["date_auto_select"]:
date_keyword = config_dict["tixcraft"]["date_auto_select"]["date_keyword"]
date_keyword = date_keyword.strip()
area_auto_select_enable = config_dict["tixcraft"]["area_auto_select"]["enable"]
area_auto_select_mode = config_dict["tixcraft"]["area_auto_select"]["mode"]
if not area_auto_select_mode in CONST_SELECT_OPTIONS_ARRAY:
area_auto_select_mode = CONST_SELECT_ORDER_DEFAULT
if 'area_keyword' in config_dict["tixcraft"]["area_auto_select"]:
area_keyword = config_dict["tixcraft"]["area_auto_select"]["area_keyword"]
area_keyword = area_keyword.strip()
# output config:
print("homepage", homepage)
print("browser", browser)
print("ticket_number", ticket_number)
print("facebook_account", facebook_account)
# for kktix
print("==[kktix]==")
print("auto_press_next_step_button", auto_press_next_step_button)
print("auto_fill_ticket_number", auto_fill_ticket_number)
print("kktix_area_mode", kktix_area_mode)
print("kktix_area_keyword", kktix_area_keyword)
print("kktix_answer_dictionary", kktix_answer_dictionary)
# for tixcraft
print("==[tixcraft]==")
print("date_auto_select_enable", date_auto_select_enable)
print("date_auto_select_mode", date_auto_select_mode)
print("date_keyword", date_keyword)
print("area_auto_select_enable", area_auto_select_enable)
print("area_auto_select_mode", area_auto_select_mode)
print("area_keyword", area_keyword)
else:
print('config is none')
row_count = 0
frame_group_header = Frame(root)
group_row_count = 0
# first row need padding Y
lbl_homepage = Label(frame_group_header, text="Homepage", pady = UI_PADDING_Y)
lbl_homepage.grid(column=0, row=group_row_count, sticky = E)
#global txt_homepage
#txt_homepage = Entry(root, width=20, textvariable = StringVar(root, value=homepage))
#txt_homepage.grid(column=1, row=row_count)
global combo_homepage
combo_homepage = ttk.Combobox(frame_group_header, state="readonly")
combo_homepage['values']= ("https://kktix.com","https://tixcraft.com","https://www.famiticket.com.tw","http://www.urbtix.hk/","https://www.cityline.com/")
combo_homepage.set(homepage)
combo_homepage.bind("<<ComboboxSelected>>", callbackHomepageOnChange)
combo_homepage.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
lbl_browser = Label(frame_group_header, text="Browser")
lbl_browser.grid(column=0, row=group_row_count, sticky = E)
#global txt_browser
#txt_browser = Entry(root, width=20, textvariable = StringVar(root, value=browser))
#txt_browser.grid(column=1, row=group_row_count)
global combo_browser
combo_browser = ttk.Combobox(frame_group_header, state="readonly")
combo_browser['values']= ("chrome","firefox")
#combo_browser.current(0)
combo_browser.set(browser)
combo_browser.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
lbl_ticket_number = Label(frame_group_header, text="Ticket Number")
lbl_ticket_number.grid(column=0, row=group_row_count, sticky = E)
global txt_ticket_number
global txt_ticket_number_value
txt_ticket_number_value = StringVar(frame_group_header, value=ticket_number)
txt_ticket_number = Entry(frame_group_header, width=20, textvariable = txt_ticket_number_value)
txt_ticket_number.grid(column=1, row=group_row_count, sticky = W)
frame_group_header.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
'''
row_count+=1
lbl_facebook_account = Label(root, text="Facebook Account")
lbl_facebook_account.grid(column=0, row=row_count, sticky = E)
global txt_facebook_account
global txt_facebook_account_value
txt_facebook_account_value = StringVar(root, value=facebook_account)
txt_facebook_account = Entry(root, width=20, textvariable = txt_facebook_account_value)
txt_facebook_account.grid(column=1, row=row_count, sticky = W)
'''
row_count+=1
global frame_group_kktix
frame_group_kktix = Frame(root)
group_row_count = 0
#lbl_kktix = Label(frame_group_kktix, text="[ KKTIX / URBTIX / Cityline]")
lbl_kktix = Label(frame_group_kktix, text="")
lbl_kktix.grid(column=0, row=group_row_count)
group_row_count+=1
lbl_auto_press_next_step_button = Label(frame_group_kktix, text="Auto Press Next Step Button")
lbl_auto_press_next_step_button.grid(column=0, row=group_row_count, sticky = E)
global chk_state_auto_press_next_step_button
chk_state_auto_press_next_step_button = BooleanVar()
chk_state_auto_press_next_step_button.set(auto_press_next_step_button)
chk_auto_press_next_step_button = Checkbutton(frame_group_kktix, text='Enable', variable=chk_state_auto_press_next_step_button)
chk_auto_press_next_step_button.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
lbl_auto_fill_ticket_number = Label(frame_group_kktix, text="Auto Fill Ticket Number")
lbl_auto_fill_ticket_number.grid(column=0, row=group_row_count, sticky = E)
global chk_state_auto_fill_ticket_number
chk_state_auto_fill_ticket_number = BooleanVar()
chk_state_auto_fill_ticket_number.set(auto_fill_ticket_number)
chk_auto_auto_fill_ticket_number = Checkbutton(frame_group_kktix, text='Enable', variable=chk_state_auto_fill_ticket_number)
chk_auto_auto_fill_ticket_number.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
global lbl_kktix_area_mode
lbl_kktix_area_mode = Label(frame_group_kktix, text="Area select order")
lbl_kktix_area_mode.grid(column=0, row=group_row_count, sticky = E)
global combo_kktix_area_mode
global combo_kktix_area_mode_index
combo_kktix_area_mode_index = group_row_count
combo_kktix_area_mode = ttk.Combobox(frame_group_kktix, state="readonly")
combo_kktix_area_mode['values']= CONST_SELECT_OPTIONS_DEFAULT
combo_kktix_area_mode.set(kktix_area_mode)
combo_kktix_area_mode.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
lbl_kktix_area_keyword = Label(frame_group_kktix, text="Area Keyword")
lbl_kktix_area_keyword.grid(column=0, row=group_row_count, sticky = E)
global txt_kktix_area_keyword
global txt_kktix_area_keyword_value
txt_kktix_area_keyword_value = StringVar(frame_group_kktix, value=kktix_area_keyword)
txt_kktix_area_keyword = Entry(frame_group_kktix, width=20, textvariable = txt_kktix_area_keyword_value)
txt_kktix_area_keyword.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
global lbl_kktix_answer_dictionary
lbl_kktix_answer_dictionary = Label(frame_group_kktix, text="Answer Dictionary")
lbl_kktix_answer_dictionary.grid(column=0, row=group_row_count, sticky = E)
global txt_kktix_answer_dictionary
global txt_kktix_answer_dictionary_index
txt_kktix_answer_dictionary_index = group_row_count
global txt_kktix_answer_dictionary_value
txt_kktix_answer_dictionary_value = StringVar(frame_group_kktix, value=kktix_answer_dictionary)
txt_kktix_answer_dictionary = Entry(frame_group_kktix, width=20, textvariable = txt_kktix_answer_dictionary_value)
txt_kktix_answer_dictionary.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
lbl_hr = Label(frame_group_kktix, text="")
lbl_hr.grid(column=0, row=group_row_count)
global frame_group_kktix_index
frame_group_kktix_index = row_count
frame_group_kktix.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
row_count+=1
global frame_group_tixcraft
frame_group_tixcraft = Frame(root)
group_row_count = 0
#lbl_tixcraft = Label(frame_group_tixcraft, text="[ tixCraft / FamiTicket]")
lbl_tixcraft = Label(frame_group_tixcraft, text="")
lbl_tixcraft.grid(column=0, row=group_row_count)
group_row_count+=1
lbl_date_auto_select = Label(frame_group_tixcraft, text="Date Auto Select")
lbl_date_auto_select.grid(column=0, row=group_row_count, sticky = E)
global chk_state_date_auto_select
chk_state_date_auto_select = BooleanVar()
chk_state_date_auto_select.set(date_auto_select_enable)
chk_date_auto_select = Checkbutton(frame_group_tixcraft, text='Enable', variable=chk_state_date_auto_select, command=callbackDateAutoOnChange)
chk_date_auto_select.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
global date_auto_select_mode_index
date_auto_select_mode_index = group_row_count
global lbl_date_auto_select_mode
lbl_date_auto_select_mode = Label(frame_group_tixcraft, text="Date select order")
lbl_date_auto_select_mode.grid(column=0, row=date_auto_select_mode_index, sticky = E)
global combo_date_auto_select_mode
combo_date_auto_select_mode = ttk.Combobox(frame_group_tixcraft, state="readonly")
combo_date_auto_select_mode['values']= (CONST_FROM_TOP_TO_BOTTOM, CONST_FROM_BOTTOM_TO_TOP)
combo_date_auto_select_mode.set(date_auto_select_mode)
combo_date_auto_select_mode.grid(column=1, row=date_auto_select_mode_index, sticky = W)
group_row_count+=1
global date_keyword_index
date_keyword_index = group_row_count
global lbl_date_keyword
lbl_date_keyword = Label(frame_group_tixcraft, text="Date Keyword")
lbl_date_keyword.grid(column=0, row=date_keyword_index, sticky = E)
global txt_date_keyword
global txt_date_keyword_value
txt_date_keyword_value = StringVar(frame_group_tixcraft, value=date_keyword)
txt_date_keyword = Entry(frame_group_tixcraft, width=20, textvariable = txt_date_keyword_value)
txt_date_keyword.grid(column=1, row=date_keyword_index, sticky = W)
group_row_count+=1
lbl_area_auto_select = Label(frame_group_tixcraft, text="Area Auto Select")
lbl_area_auto_select.grid(column=0, row=group_row_count, sticky = E)
global chk_state_area_auto_select
chk_state_area_auto_select = BooleanVar()
chk_state_area_auto_select.set(area_auto_select_enable)
global chk_area_auto_select
chk_area_auto_select = Checkbutton(frame_group_tixcraft, text='Enable', variable=chk_state_area_auto_select, command=callbackDateAutoOnChange)
chk_area_auto_select.grid(column=1, row=group_row_count, sticky = W)
group_row_count+=1
global area_auto_select_index
area_auto_select_index = group_row_count
global lbl_area_auto_select_mode
lbl_area_auto_select_mode = Label(frame_group_tixcraft, text="Area select order")
lbl_area_auto_select_mode.grid(column=0, row=area_auto_select_index, sticky = E)
global combo_area_auto_select_mode
combo_area_auto_select_mode = ttk.Combobox(frame_group_tixcraft, state="readonly")
combo_area_auto_select_mode['values']= CONST_SELECT_OPTIONS_DEFAULT
combo_area_auto_select_mode.set(area_auto_select_mode)
combo_area_auto_select_mode.grid(column=1, row=area_auto_select_index, sticky = W)
group_row_count+=1
global area_keyword_index
area_keyword_index = group_row_count
global lbl_area_keyword
lbl_area_keyword = Label(frame_group_tixcraft, text="Area Keyword")
lbl_area_keyword.grid(column=0, row=area_keyword_index, sticky = E)
global txt_area_keyword
global txt_ares_keyword_value
txt_ares_keyword_value = StringVar(frame_group_tixcraft, value=area_keyword)
txt_area_keyword = Entry(frame_group_tixcraft, width=20, textvariable = txt_ares_keyword_value)
txt_area_keyword.grid(column=1, row=area_keyword_index, sticky = W)
global frame_group_tixcraft_index
frame_group_tixcraft_index = row_count
frame_group_tixcraft.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
row_count+=1
lbl_hr = Label(root, text="")
lbl_hr.grid(column=0, row=row_count)
row_count+=1
frame_action = Frame(root)
btn_run = ttk.Button(frame_action, text="Run", command=btn_run_clicked)
btn_run.grid(column=0, row=0)
btn_save = ttk.Button(frame_action, text="Save", command=btn_save_clicked)
btn_save.grid(column=1, row=0)
btn_exit = ttk.Button(frame_action, text="Exit", command=btn_exit_clicked)
btn_exit.grid(column=2, row=0)
frame_action.grid(column=0, row=row_count, sticky = W, padx=UI_PADDING_X)
showHideBlocks(all_layout_visible=True)
def main():
load_json()
global root
root = Tk()
root.title(CONST_APP_VERSION)
#style = ttk.Style(root)
#style.theme_use('aqua')
#root.configure(background='lightgray')
# style configuration
#style = Style(root)
#style.configure('TLabel', background='lightgray', foreground='black')
#style.configure('TFrame', background='lightgray')
GUI = MainMenu(root)
GUI_SIZE_WIDTH = 420
GUI_SIZE_HEIGHT = 340
GUI_SIZE_MACOS = str(GUI_SIZE_WIDTH) + 'x' + str(GUI_SIZE_HEIGHT)
GUI_SIZE_WINDOWS=str(GUI_SIZE_WIDTH-60) + 'x' + str(GUI_SIZE_HEIGHT-20)
GUI_SIZE =GUI_SIZE_MACOS
import platform
if platform.system() == 'Windows':
GUI_SIZE =GUI_SIZE_WINDOWS
root.geometry(GUI_SIZE)
root.mainloop()
if __name__ == "__main__":
main()