diff --git a/chrome_tixcraft.py b/chrome_tixcraft.py index 7bb04ed..8010f15 100644 --- a/chrome_tixcraft.py +++ b/chrome_tixcraft.py @@ -39,7 +39,7 @@ warnings.simplefilter('ignore',InsecureRequestWarning) import ssl ssl._create_default_https_context = ssl._create_unverified_context -CONST_APP_VERSION = u"MaxBot (2022.12.22)" +CONST_APP_VERSION = u"MaxBot (2022.12.26)" CONST_HOMEPAGE_DEFAULT = "https://tixcraft.com" @@ -1351,13 +1351,15 @@ def tixcraft_ticket_number_auto_fill(driver, select_obj, ticket_number): return is_assign_ticket_number -def tixcraft_verify(driver): +def tixcraft_verify(driver, presale_code): show_debug_message = True # debug. #show_debug_message = False # online ret = False captcha_password_string = None + if len(presale_code) > 0: + captcha_password_string = presale_code form_select = None try: @@ -1400,10 +1402,11 @@ def tixcraft_verify(driver): is_options_in_question = False # 請輸入"YES",代表您已詳閱且瞭解並同意。 - if u'請輸入"YES"' in html_text: - if u'已詳閱' in html_text: - if u'並同意' in html_text: - captcha_password_string = 'YES' + if captcha_password_string is None: + if u'請輸入"YES"' in html_text: + if u'已詳閱' in html_text: + if u'並同意' in html_text: + captcha_password_string = 'YES' if show_debug_message: print("captcha_password_string:", captcha_password_string) @@ -1433,7 +1436,6 @@ def tixcraft_verify(driver): try: # PS: sometime may send key twice... form_input.clear() - form_input.send_keys(captcha_password_string) is_password_sent = True if show_debug_message: @@ -1474,7 +1476,6 @@ def tixcraft_verify(driver): if len(default_value)==0: try: form_input.click() - time.sleep(0.5) except Exception as exc: pass @@ -2087,7 +2088,7 @@ def kktix_check_register_status(url): #print("registerStatus:", registerStatus) return registerStatus -def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess_options): +def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div): show_debug_message = True # debug. show_debug_message = False # online @@ -2449,9 +2450,8 @@ def kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess # still no answer. if captcha_password_string is None: - if auto_guess_options: - if not is_combine_two_question: - answer_list, my_answer_delimitor = get_answer_list_by_question(captcha_text_div_text) + if not is_combine_two_question: + answer_list, my_answer_delimitor = get_answer_list_by_question(captcha_text_div_text) return captcha_password_string, answer_list, my_answer_delimitor @@ -2561,7 +2561,14 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di print("found captcha_inner_div layor.") auto_guess_options = config_dict["kktix"]["auto_guess_options"] - captcha_password_string, answer_list, my_answer_delimitor = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div, auto_guess_options) + user_guess_string = config_dict["kktix"]["user_guess_string"] + + if len(user_guess_string) > 0: + captcha_password_string = user_guess_string + else: + if auto_guess_options: + captcha_password_string, answer_list, my_answer_delimitor = kktix_reg_new_captcha(registrationsNewApp_div, captcha_inner_div) + if captcha_password_string is not None: # password is not None, try to send. @@ -2587,7 +2594,7 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di inputed_captcha_text = "" if len(inputed_captcha_text) == 0: try: - print("focus() captcha to input.") + #print("focus() captcha to input.") check_and_play_sound_for_captcha(config_dict) captcha_password_input_tag.click() time.sleep(1) @@ -2659,7 +2666,7 @@ def kktix_reg_new_main(driver, answer_index, is_finish_checkbox_click, config_di # exceed index, do nothing. pass else: - # captcha appear but we do no have answer list. + # captcha appeared, but we don't have answer list. pass @@ -3522,11 +3529,61 @@ def cityline_performance(driver, config_dict): if click_ret: break -def facebook_login(driver, facebook_account): +def facebook_login(driver, account): ret = False el_email = None try: el_email = driver.find_element(By.CSS_SELECTOR, '#email') + except Exception as exc: + pass + + is_visible = False + if el_email is not None: + try: + if el_email.is_enabled(): + is_visible = True + except Exception as exc: + pass + + is_email_sent = False + if is_visible: + try: + inputed_text = el_email.get_attribute('value') + if inputed_text is not None: + if len(inputed_text) == 0: + el_email.send_keys(account) + is_email_sent = True + except Exception as exc: + pass + + el_pass = None + if is_email_sent: + try: + el_pass = driver.find_element(By.CSS_SELECTOR, '#pass') + except Exception as exc: + pass + + is_visible = False + if el_pass is not None: + try: + if el_pass.is_enabled(): + is_visible = True + except Exception as exc: + pass + + if is_visible: + try: + el_pass.click() + except Exception as exc: + pass + + return ret + +def kktix_login(driver, account): + ret = False + el_email = None + try: + el_email = driver.find_element(By.CSS_SELECTOR, '#user_login') except Exception as exc: #print("find #email fail") #print(exc) @@ -3536,11 +3593,8 @@ def facebook_login(driver, facebook_account): if el_email is not None: try: if el_email.is_enabled(): - if el_email.is_displayed(): - is_visible = True + is_visible = True except Exception as exc: - #print("find #email fail") - #print(exc) pass is_email_sent = False @@ -3549,39 +3603,30 @@ def facebook_login(driver, facebook_account): inputed_text = el_email.get_attribute('value') if inputed_text is not None: if len(inputed_text) == 0: - el_email.send_keys(facebook_account) + el_email.send_keys(account) is_email_sent = True except Exception as exc: - #print("find #email fail") - #print(exc) pass el_pass = None if is_email_sent: try: - el_pass = driver.find_element(By.CSS_SELECTOR, '#pass') + el_pass = driver.find_element(By.CSS_SELECTOR, '#user_password') except Exception as exc: - #print("find #email fail") - #print(exc) pass is_visible = False if el_pass is not None: try: if el_pass.is_enabled(): - if el_pass.is_displayed(): - is_visible = True + is_visible = True except Exception as exc: - #print("find #email fail") - #print(exc) pass if is_visible: try: el_pass.click() except Exception as exc: - #print("find #email fail") - #print(exc) pass return ret @@ -3858,7 +3903,8 @@ def main(): tixcraft_area_auto_select(driver, url, config_dict) if '/ticket/verify/' in url: - tixcraft_verify(driver) + presale_code = config_dict["tixcraft"]["presale_code"] + tixcraft_verify(driver, presale_code) # main app, to select ticket number. if '/ticket/ticket/' in url: @@ -3870,9 +3916,12 @@ def main(): # for kktix.cc and kktix.com if 'kktix.c' in url: auto_press_next_step_button = config_dict["kktix"]["auto_press_next_step_button"] + kktix_account = config_dict["advanced"]["kktix_account"] # fix https://kktix.com/users/sign_in?back_to=https://kktix.com/events/xxxx and registerStatus: SOLD_OUT cause page refresh. - if '/users/sign_in' in url: + if '/users/sign_in?' in url: + if len(kktix_account) > 4: + kktix_login(driver, kktix_account) continue if '/registrations/new' in url: diff --git a/settings.json b/settings.json index 02b9f87..2710428 100644 --- a/settings.json +++ b/settings.json @@ -1 +1 @@ -{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "pass_1_seat_remaining": true, "auto_check_agree": true, "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true, "area_mode": "from top to bottom", "area_keyword_1": "", "area_keyword_1_and": "", "area_keyword_2": "", "area_keyword_2_and": "", "auto_guess_options": false}, "tixcraft": {"date_auto_select": {"enable": true, "date_keyword": "", "mode": "from top to bottom"}, "area_auto_select": {"enable": true, "area_keyword_1": "", "area_keyword_2": "", "area_keyword_3": "", "area_keyword_4": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": false, "auto_reload_coming_soon_page": true}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "adblock_plus_enable": false}, "debug": false} \ No newline at end of file +{"homepage": "https://tixcraft.com", "browser": "chrome", "language": "\u7e41\u9ad4\u4e2d\u6587", "ticket_number": 2, "pass_1_seat_remaining": true, "auto_check_agree": true, "kktix": {"auto_press_next_step_button": true, "auto_fill_ticket_number": true, "area_mode": "from top to bottom", "area_keyword_1": "", "area_keyword_1_and": "", "area_keyword_2": "", "area_keyword_2_and": "", "auto_guess_options": false, "user_guess_string": ""}, "tixcraft": {"date_auto_select": {"enable": true, "date_keyword": "", "mode": "from top to bottom"}, "area_auto_select": {"enable": true, "area_keyword_1": "", "area_keyword_2": "", "area_keyword_3": "", "area_keyword_4": "", "mode": "from top to bottom"}, "pass_date_is_sold_out": false, "auto_reload_coming_soon_page": true, "presale_code": ""}, "advanced": {"play_captcha_sound": {"enable": true, "filename": "ding-dong.wav"}, "facebook_account": "", "kktix_account": "", "adblock_plus_enable": false}, "debug": false} \ No newline at end of file diff --git a/settings.py b/settings.py index bfd4132..22caa8d 100644 --- a/settings.py +++ b/settings.py @@ -19,7 +19,7 @@ import json import webbrowser import pyperclip -CONST_APP_VERSION = u"MaxBot (2022.12.22)" +CONST_APP_VERSION = u"MaxBot (2022.12.26)" CONST_FROM_TOP_TO_BOTTOM = u"from top to bottom" CONST_FROM_BOTTOM_TO_TOP = u"from bottom to top" @@ -62,6 +62,7 @@ def load_translate(): en_us["area_keyword"] = 'Area Keyword' en_us["and"] = 'And with' en_us["auto_guess_options"] = 'Guess Options in Question' + en_us["user_guess_string"] = 'Fill This Answer in Question' en_us["date_auto_select"] = 'Date Auto Select' en_us["date_select_order"] = 'Date select order' @@ -83,8 +84,11 @@ def load_translate(): en_us["save"] = 'Save' en_us["exit"] = 'Close' en_us["copy"] = 'Copy' + en_us["restore_defaults"] = 'Restore Defaults' + en_us["done"] = 'Done' en_us["facebook_account"] = 'Facebook account' + en_us["kktix_account"] = 'KKTIX account' en_us["play_captcha_sound"] = 'Play sound when captcha' en_us["captcha_sound_filename"] = 'captcha sound filename' en_us["adblock_plus_enable"] = 'Adblock Plus Extension' @@ -112,6 +116,7 @@ def load_translate(): zh_tw["area_keyword"] = '區域關鍵字' zh_tw["and"] = '而且(同列)' zh_tw["auto_guess_options"] = '自動猜測驗證問題' + zh_tw["user_guess_string"] = '在驗證問題中填寫此答案' zh_tw["date_auto_select"] = '日期自動點選' zh_tw["date_select_order"] = '日期排序方式' @@ -133,8 +138,11 @@ def load_translate(): zh_tw["save"] = '存檔' zh_tw["exit"] = '關閉' zh_tw["copy"] = '複製' + zh_tw["restore_defaults"] = '恢復預設值' + zh_tw["done"] = '完成' zh_tw["facebook_account"] = 'Facebook 帳號' + zh_tw["kktix_account"] = 'KKTIX 帳號' zh_tw["play_captcha_sound"] = '輸入驗證碼時播放音效' zh_tw["captcha_sound_filename"] = '驗證碼用音效檔' zh_tw["adblock_plus_enable"] = 'Adblock 瀏覽器擴充功能' @@ -162,6 +170,7 @@ def load_translate(): zh_cn["area_keyword"] = '区域关键字' zh_cn["and"] = '而且(同列)' zh_cn["auto_guess_options"] = '自动猜测验证问题' + zh_cn["user_guess_string"] = '在验证问题中填写此答案' zh_cn["date_auto_select"] = '日期自动点选' zh_cn["date_select_order"] = '日期排序方式' @@ -183,8 +192,12 @@ def load_translate(): zh_cn["run"] = '抢票' zh_cn["save"] = '存档' zh_cn["exit"] = '关闭' + zh_cn["copy"] = '复制' + zh_cn["restore_defaults"] = '恢复默认值' + zh_cn["done"] = '完成' zh_cn["facebook_account"] = 'Facebook 帐号' + zh_cn["kktix_account"] = 'KKTIX 帐号' zh_cn["play_captcha_sound"] = '输入验证码时播放音效' zh_cn["captcha_sound_filename"] = '验证码用音效档' zh_cn["adblock_plus_enable"] = 'Adblock 浏览器扩充功能' @@ -212,6 +225,7 @@ def load_translate(): ja_jp["area_keyword"] = 'エリアキーワード' ja_jp["and"] = 'そして(同列)' ja_jp["auto_guess_options"] = '自動推測検証問題' + ja_jp["user_guess_string"] = '質問に回答を記入' ja_jp["date_auto_select"] = '日付自動選択' ja_jp["date_select_order"] = '日付のソート方法' @@ -233,8 +247,11 @@ def load_translate(): ja_jp["save"] = '保存' ja_jp["exit"] = '閉じる' ja_jp["copy"] = 'コピー' + ja_jp["restore_defaults"] = 'デフォルトに戻す' + ja_jp["done"] = '終わり' ja_jp["facebook_account"] = 'Facebookのアカウント' + ja_jp["kktix_account"] = 'KKTIXのアカウント' ja_jp["play_captcha_sound"] = 'キャプチャ時に音を鳴らす' ja_jp["captcha_sound_filename"] = 'サウンドファイル名' @@ -281,6 +298,7 @@ def get_default_config(): config_dict["kktix"]["area_keyword_2"] = "" config_dict["kktix"]["area_keyword_2_and"] = "" config_dict["kktix"]["auto_guess_options"] = False + config_dict["kktix"]["user_guess_string"] = "" config_dict['tixcraft']={} config_dict["tixcraft"]["date_auto_select"] = {} @@ -298,6 +316,7 @@ def get_default_config(): config_dict["tixcraft"]["pass_date_is_sold_out"] = False config_dict["tixcraft"]["auto_reload_coming_soon_page"] = True + config_dict["tixcraft"]["presale_code"] = "" config_dict['advanced']={} @@ -306,6 +325,7 @@ def get_default_config(): config_dict["advanced"]["play_captcha_sound"]["filename"] = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT config_dict["advanced"]["facebook_account"] = "" + config_dict["advanced"]["kktix_account"] = "" config_dict["advanced"]["adblock_plus_enable"] = False config_dict['debug']=False @@ -326,10 +346,23 @@ def load_json(): config_dict = get_default_config() return config_filepath, config_dict -def btn_save_clicked(): - btn_save_act() +def btn_restore_defaults_clicked(language_code): + app_root = get_app_root() + config_filepath = os.path.join(app_root, 'settings.json') -def btn_save_act(slience_mode=False): + config_dict = get_default_config() + import json + with open(config_filepath, 'w') as outfile: + json.dump(config_dict, outfile) + messagebox.showinfo(translate[language_code]["restore_defaults"], translate[language_code]["done"]) + + global root + load_GUI(root, config_dict) + +def btn_save_clicked(language_code): + btn_save_act(language_code) + +def btn_save_act(language_code, slience_mode=False): app_root = get_app_root() config_filepath = os.path.join(app_root, 'settings.json') @@ -351,6 +384,7 @@ def btn_save_act(slience_mode=False): global txt_kktix_area_keyword_2_and # disable password brute force attack global txt_kktix_answer_dictionary + global txt_kktix_user_guess_string global chk_state_auto_guess_options @@ -367,8 +401,10 @@ def btn_save_act(slience_mode=False): global chk_state_pass_date_is_sold_out global chk_state_auto_reload_coming_soon_page + global txt_presale_code global txt_facebook_account + global txt_kktix_account global chk_state_play_captcha_sound global txt_captcha_sound_filename global chk_state_adblock_plus @@ -395,6 +431,8 @@ def btn_save_act(slience_mode=False): messagebox.showerror("Error", "Please select a language") else: config_dict["language"] = combo_language.get().strip() + # display as new language. + language_code = get_language_code_by_name(config_dict["language"]) if is_all_data_correct: if combo_ticket_number.get().strip()=="": @@ -417,6 +455,7 @@ def btn_save_act(slience_mode=False): # disable password brute force attack #config_dict["kktix"]["answer_dictionary"] = txt_kktix_answer_dictionary.get().strip() config_dict["kktix"]["auto_guess_options"] = bool(chk_state_auto_guess_options.get()) + config_dict["kktix"]["user_guess_string"] = txt_kktix_user_guess_string.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() @@ -432,11 +471,13 @@ def btn_save_act(slience_mode=False): config_dict["tixcraft"]["pass_date_is_sold_out"] = bool(chk_state_pass_date_is_sold_out.get()) config_dict["tixcraft"]["auto_reload_coming_soon_page"] = bool(chk_state_auto_reload_coming_soon_page.get()) + config_dict["tixcraft"]["presale_code"] = txt_presale_code.get().strip() config_dict["advanced"]["play_captcha_sound"]["enable"] = bool(chk_state_play_captcha_sound.get()) config_dict["advanced"]["play_captcha_sound"]["filename"] = txt_captcha_sound_filename.get().strip() config_dict["advanced"]["facebook_account"] = txt_facebook_account.get().strip() + config_dict["advanced"]["kktix_account"] = txt_kktix_account.get().strip() config_dict["advanced"]["adblock_plus_enable"] = bool(chk_state_adblock_plus.get()) @@ -446,17 +487,17 @@ def btn_save_act(slience_mode=False): with open(config_filepath, 'w') as outfile: json.dump(config_dict, outfile) - if slience_mode==False: - messagebox.showinfo("File Save", "Done ^_^") + if not slience_mode: + messagebox.showinfo(translate[language_code]["save"], translate[language_code]["done"]) return is_all_data_correct -def btn_run_clicked(): +def btn_run_clicked(language_code): import subprocess print('run button pressed.') Root_Dir = "" - save_ret = btn_save_act(slience_mode=True) + save_ret = btn_save_act(language_code, slience_mode=True) print("save config result:", save_ret) if save_ret: if hasattr(sys, 'frozen'): @@ -583,6 +624,7 @@ def applyNewLanguage(): global lbl_kktix_area_keyword_2 global lbl_kktix_area_keyword_2_and_text global lbl_auto_guess_options + global lbl_user_guess_string # for tixcraft global lbl_date_auto_select @@ -596,6 +638,7 @@ def applyNewLanguage(): global lbl_area_keyword_4 global lbl_pass_date_is_sold_out global lbl_auto_reload_coming_soon_page + global lbl_presale_code # for checkbox global chk_pass_1_seat_remaining @@ -637,6 +680,8 @@ def applyNewLanguage(): lbl_kktix_area_keyword_2.config(text=translate[language_code]["area_keyword_2"]) lbl_kktix_area_keyword_2_and_text.config(text=translate[language_code]["and"]) lbl_auto_guess_options.config(text=translate[language_code]["auto_guess_options"]) + lbl_user_guess_string.config(text=translate[language_code]["user_guess_string"]) + lbl_date_auto_select.config(text=translate[language_code]["date_auto_select"]) lbl_date_auto_select_mode.config(text=translate[language_code]["date_select_order"]) lbl_date_keyword.config(text=translate[language_code]["date_keyword"]) @@ -648,6 +693,7 @@ def applyNewLanguage(): lbl_area_keyword_4.config(text=translate[language_code]["area_keyword_4"]) lbl_pass_date_is_sold_out.config(text=translate[language_code]["pass_date_is_sold_out"]) lbl_auto_reload_coming_soon_page.config(text=translate[language_code]["auto_reload_coming_soon_page"]) + lbl_presale_code.config(text=translate[language_code]["user_guess_string"]) chk_pass_1_seat_remaining.config(text=translate[language_code]["enable"]) chk_auto_check_agree.config(text=translate[language_code]["enable"]) @@ -666,9 +712,11 @@ def applyNewLanguage(): tabControl.tab(2, text=translate[language_code]["about"]) global lbl_facebook_account + global lbl_kktix_account global lbl_play_captcha_sound global lbl_captcha_sound_filename lbl_facebook_account.config(text=translate[language_code]["facebook_account"]) + lbl_kktix_account.config(text=translate[language_code]["kktix_account"]) lbl_play_captcha_sound.config(text=translate[language_code]["play_captcha_sound"]) lbl_captcha_sound_filename.config(text=translate[language_code]["captcha_sound_filename"]) @@ -684,9 +732,13 @@ def applyNewLanguage(): global btn_run global btn_save global btn_exit + global btn_restore_defaults + btn_run.config(text=translate[language_code]["run"]) btn_save.config(text=translate[language_code]["save"]) - btn_exit.config(text=translate[language_code]["exit"]) + if btn_exit: + btn_exit.config(text=translate[language_code]["exit"]) + btn_restore_defaults.config(text=translate[language_code]["restore_defaults"]) def callbackHomepageOnChange(event): showHideBlocks() @@ -889,6 +941,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): # PS: because of the question is always variable. #kktix_answer_dictionary = "" auto_guess_options = False + user_guess_string = "" date_auto_select_enable = None date_auto_select_mode = "" @@ -903,6 +956,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): pass_date_is_sold_out_enable = False auto_reload_coming_soon_page_enable = True + presale_code = "" debugMode = False @@ -929,6 +983,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): kktix_area_keyword_2 = config_dict["kktix"]["area_keyword_2"].strip() kktix_area_keyword_2_and = config_dict["kktix"]["area_keyword_2_and"].strip() auto_guess_options = config_dict["kktix"]["auto_guess_options"] + user_guess_string = config_dict["kktix"]["user_guess_string"].strip() # disable password brute force attack # PS: feature disabled. @@ -954,6 +1009,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): area_keyword_4 = config_dict["tixcraft"]["area_auto_select"]["area_keyword_4"].strip() pass_date_is_sold_out_enable = config_dict["tixcraft"]["pass_date_is_sold_out"] auto_reload_coming_soon_page_enable = config_dict["tixcraft"]["auto_reload_coming_soon_page"] + presale_code = config_dict["tixcraft"]["presale_code"].strip() # output config: print("setting app version", CONST_APP_VERSION) @@ -975,6 +1031,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): # disable password brute force attack #print("kktix_answer_dictionary", kktix_answer_dictionary) print("auto_guess_options", auto_guess_options) + print("user_guess_string", user_guess_string) # for tixcraft print("==[tixcraft]==") @@ -992,6 +1049,7 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): print("pass_date_is_sold_out", pass_date_is_sold_out_enable) print("auto_reload_coming_soon_page", auto_reload_coming_soon_page_enable) + print("presale_code", presale_code) print("debug Mode", debugMode) @@ -1246,8 +1304,15 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): group_row_count+=1 - lbl_hr = Label(frame_group_kktix, text="") - lbl_hr.grid(column=0, row=group_row_count) + global lbl_user_guess_string + lbl_user_guess_string = Label(frame_group_kktix, text=translate[language_code]['user_guess_string']) + lbl_user_guess_string.grid(column=0, row=group_row_count, sticky = E) + + global txt_kktix_user_guess_string + txt_kktix_user_guess_string_value = StringVar(frame_group_kktix, value=user_guess_string) + txt_kktix_user_guess_string = Entry(frame_group_kktix, width=20, textvariable = txt_kktix_user_guess_string_value) + txt_kktix_user_guess_string.grid(column=1, row=group_row_count, sticky = W) + global frame_group_kktix_index frame_group_kktix_index = row_count @@ -1419,6 +1484,15 @@ def PreferenctTab(root, config_dict, language_code, UI_PADDING_X): group_row_count+=1 + global lbl_presale_code + lbl_presale_code = Label(frame_group_tixcraft, text=translate[language_code]['user_guess_string']) + lbl_presale_code.grid(column=0, row=group_row_count, sticky = E) + + global txt_presale_code + txt_presale_code_value = StringVar(frame_group_tixcraft, value=presale_code) + txt_presale_code = Entry(frame_group_tixcraft, width=20, textvariable = txt_presale_code_value) + txt_presale_code.grid(column=1, row=group_row_count, 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) @@ -1433,13 +1507,14 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X): group_row_count = 0 facebook_account = "" + kktix_account = "" play_captcha_sound = False captcha_sound_filename = CONST_CAPTCHA_SOUND_FILENAME_DEFAULT adblock_plus_enable = False if 'advanced' in config_dict: - if 'facebook_account' in config_dict["advanced"]: - facebook_account = config_dict["advanced"]["facebook_account"].strip() + facebook_account = config_dict["advanced"]["facebook_account"].strip() + kktix_account = config_dict["advanced"]["kktix_account"].strip() if 'play_captcha_sound' in config_dict["advanced"]: if 'enable' in config_dict["advanced"]["play_captcha_sound"]: play_captcha_sound = config_dict["advanced"]["play_captcha_sound"]["enable"] @@ -1451,6 +1526,7 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X): # for kktix print("==[advanced]==") print("facebook_account", facebook_account) + print("kktix_account", kktix_account) print("play_captcha_sound", play_captcha_sound) print("captcha_sound_filename", captcha_sound_filename) print("adblock_plus_enable", adblock_plus_enable) @@ -1473,6 +1549,17 @@ def AdvancedTab(root, config_dict, language_code, UI_PADDING_X): group_row_count +=1 + global lbl_kktix_account + lbl_kktix_account = Label(frame_group_header, text=translate[language_code]['kktix_account']) + lbl_kktix_account.grid(column=0, row=group_row_count, sticky = E) + + global txt_kktix_account + txt_kktix_account_value = StringVar(frame_group_header, value=kktix_account) + txt_kktix_account = Entry(frame_group_header, width=20, textvariable = txt_kktix_account_value) + txt_kktix_account.grid(column=1, row=group_row_count, sticky = W) + + group_row_count +=1 + global lbl_play_captcha_sound lbl_play_captcha_sound = Label(frame_group_header, text=translate[language_code]['play_captcha_sound']) lbl_play_captcha_sound.grid(column=0, row=group_row_count, sticky = E) @@ -1610,44 +1697,35 @@ def AboutTab(root, language_code): frame_group_header.grid(column=0, row=row_count) -def get_action_bar(root,language_code): +def get_action_bar(root, language_code): frame_action = Frame(root) global btn_run global btn_save global btn_exit + global btn_restore_defaults - btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command=btn_run_clicked) + btn_run = ttk.Button(frame_action, text=translate[language_code]['run'], command= lambda: btn_run_clicked(language_code)) btn_run.grid(column=0, row=0) - btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command=btn_save_clicked) + btn_save = ttk.Button(frame_action, text=translate[language_code]['save'], command= lambda: btn_save_clicked(language_code) ) btn_save.grid(column=1, row=0) btn_exit = ttk.Button(frame_action, text=translate[language_code]['exit'], command=btn_exit_clicked) - btn_exit.grid(column=3, row=0) + #btn_exit.grid(column=2, row=0) + + btn_restore_defaults = ttk.Button(frame_action, text=translate[language_code]['restore_defaults'], command= lambda: btn_restore_defaults_clicked(language_code)) + btn_restore_defaults.grid(column=2, row=0) return frame_action -def main(): - global translate - translate = load_translate() +def clearFrame(frame): + # destroy all widgets from frame + for widget in frame.winfo_children(): + widget.destroy() - global config_filepath - global config_dict - config_filepath, config_dict = 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') +def load_GUI(root, config_dict): + clearFrame(root) language_code="en_us" if not config_dict is None: @@ -1669,18 +1747,36 @@ def main(): row_count+=1 - frame_action = get_action_bar(root,language_code) + frame_action = get_action_bar(root, language_code) frame_action.grid(column=0, row=row_count) + global UI_PADDING_X + PreferenctTab(tab1, config_dict, language_code, UI_PADDING_X) + AdvancedTab(tab2, config_dict, language_code, UI_PADDING_X) + AboutTab(tab3, language_code) + + +def main(): + global translate + # only need to load translate once. + translate = load_translate() + + global config_filepath + global config_dict + # only need to load json file once. + config_filepath, config_dict = load_json() + + global root + root = Tk() + root.title(CONST_APP_VERSION) + global UI_PADDING_X UI_PADDING_X = 15 - GUI_SIZE_WIDTH = 460 - GUI_SIZE_HEIGHT = 550 + load_GUI(root, config_dict) - PreferenctTab(tab1, config_dict, language_code, UI_PADDING_X) - AdvancedTab(tab2, config_dict, language_code, UI_PADDING_X) - AboutTab(tab3, language_code) + GUI_SIZE_WIDTH = 460 + GUI_SIZE_HEIGHT = 575 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-90)