|
53 | 53 |
|
54 | 54 |
|
55 | 55 | APP_NAME = 'Python Easy Chess GUI' |
56 | | -APP_VERSION = 'v0.65' |
| 56 | +APP_VERSION = 'v0.66' |
57 | 57 | BOX_TITLE = '{} {}'.format(APP_NAME, APP_VERSION) |
58 | 58 |
|
59 | 59 |
|
|
222 | 222 | 'User Wins::user_wins_k', |
223 | 223 | 'User Draws::user_draws_k']], |
224 | 224 | ['FEN', ['Paste']], |
225 | | - ['&Engine', ['Go', 'Set Depth', |
| 225 | + ['&Engine', ['Go', 'Set Engine', 'Set Depth', |
226 | 226 | 'Set Movetime', 'Get Settings::engine_info_k', |
227 | 227 | 'Unhide Search Info']], |
228 | 228 | ['&Book', ['Set Book::book_set_k', 'Get Settings::book_info_k']], |
@@ -964,15 +964,87 @@ def play_game(self, engine_id_name, board): |
964 | 964 |
|
965 | 965 | if button == 'Set Depth': |
966 | 966 | self.set_depth_limit() |
| 967 | + continue |
967 | 968 |
|
968 | 969 | if button == 'Set Movetime': |
969 | 970 | self.set_time_limit() |
| 971 | + continue |
970 | 972 |
|
971 | 973 | if button == 'Get Settings::engine_info_k': |
972 | 974 | self.get_engine_settings(engine_id_name) |
| 975 | + continue |
| 976 | + |
| 977 | + # Mode: Play, Side to move: Engine (first move, not thinking) |
| 978 | + # Allow user to change engine settings |
| 979 | + if button == 'Set Engine': |
| 980 | + current_engine_list = self.engine_list |
| 981 | + current_engine_file = self.engine_file |
| 982 | + |
| 983 | + logging.info('Backup current engine list and file.') |
| 984 | + logging.info('Current engine list: {}'.format(current_engine_list)) |
| 985 | + logging.info('Current engine file: {}'.format(current_engine_file)) |
| 986 | + |
| 987 | + # Vary Combo box or sg.Drop key, to avoid duplicate key error. |
| 988 | + # Tkinter does not like PySimpleGUI v3.37 so far. |
| 989 | + # ecbk = engine_combo_box_key |
| 990 | + ecbk = str(random.randint(0,1000000)) |
| 991 | + |
| 992 | + layout = [ |
| 993 | + [sg.T('Engine file', size=(12,1)), |
| 994 | + sg.Drop(self.engine_list, size=(32, 1), key=ecbk, |
| 995 | + enable_events=True)], |
| 996 | + [sg.T('Engine name', size=(12,1)), sg.T( |
| 997 | + self.get_engine_id_name(), key='engine_name_k')], |
| 998 | + [sg.T('Threads', size=(12, 1)), |
| 999 | + sg.Spin([t for t in range(1, 9)], initial_value=self.threads, |
| 1000 | + size=(8, 1), key='threads_k')], |
| 1001 | + [sg.T('Hash', size=(12, 1)), |
| 1002 | + sg.Spin([t for t in range(4, 256, 4)], initial_value=self.hash, |
| 1003 | + size=(8, 1), key='hash_k')], |
| 1004 | + [sg.OK(), sg.Cancel()] |
| 1005 | + ] |
| 1006 | + |
| 1007 | + self.window.Hide() |
| 1008 | + w = sg.Window('Engine Settings', layout) |
| 1009 | + |
| 1010 | + while True: |
| 1011 | + e, v = w.Read(timeout=10) |
| 1012 | + |
| 1013 | + if e is None or e == 'Cancel': |
| 1014 | + logging.info('User cancels engine selection. ' + |
| 1015 | + 'We restore the current engine data.') |
| 1016 | + self.engine_list = current_engine_list |
| 1017 | + self.engine_file = current_engine_file |
| 1018 | + logging.info('Current engine data were restored.') |
| 1019 | + logging.info('current engine list: {}'.format(self.engine_list)) |
| 1020 | + logging.info('current engine file: {}'.format(self.engine_file)) |
| 1021 | + break |
| 1022 | + |
| 1023 | + if e == ecbk: |
| 1024 | + self.engine_file = v[ecbk] |
| 1025 | + engine_id_name = self.get_engine_id_name() |
| 1026 | + w.FindElement('engine_name_k').Update(engine_id_name) |
| 1027 | + self.update_engine_list() |
| 1028 | + continue |
| 1029 | + |
| 1030 | + if e == 'OK': |
| 1031 | + hash_value = int(v['hash_k']) |
| 1032 | + self.hash = min(MAX_HASH, max(MIN_HASH, hash_value)) |
| 1033 | + |
| 1034 | + threads_value = int(v['threads_k']) |
| 1035 | + self.threads = min(MAX_THREADS, max(MIN_THREADS, threads_value)) |
| 1036 | + break |
| 1037 | + |
| 1038 | + w.Close() |
| 1039 | + self.window.UnHide() |
| 1040 | + |
| 1041 | + self.update_labels_and_game_tags(human='Human', |
| 1042 | + engine_id=self.get_engine_id_name()) |
| 1043 | + continue |
973 | 1044 |
|
974 | 1045 | if button == 'About': |
975 | 1046 | sg.PopupScrolled(HELP_MSG, title=BOX_TITLE) |
| 1047 | + continue |
976 | 1048 |
|
977 | 1049 | if button == 'Paste': |
978 | 1050 | try: |
@@ -1037,6 +1109,78 @@ def play_game(self, engine_id_name, board): |
1037 | 1109 | self.menu_elem.Update(new_menu) |
1038 | 1110 | continue |
1039 | 1111 |
|
| 1112 | + if button == 'Get Settings::engine_info_k': |
| 1113 | + self.get_engine_settings(engine_id_name) |
| 1114 | + break |
| 1115 | + |
| 1116 | + # Mode: Play, Side to move: User |
| 1117 | + # Allow user to change engine settings |
| 1118 | + if button == 'Set Engine': |
| 1119 | + current_engine_list = self.engine_list |
| 1120 | + current_engine_file = self.engine_file |
| 1121 | + |
| 1122 | + logging.info('Backup current engine list and file.') |
| 1123 | + logging.info('Current engine list: {}'.format(current_engine_list)) |
| 1124 | + logging.info('Current engine file: {}'.format(current_engine_file)) |
| 1125 | + |
| 1126 | + # Vary Combo box or sg.Drop key, to avoid duplicate key error. |
| 1127 | + # Tkinter does not like PySimpleGUI v3.37 so far. |
| 1128 | + # ecbk = engine_combo_box_key |
| 1129 | + ecbk = str(random.randint(0,1000000)) |
| 1130 | + |
| 1131 | + layout = [ |
| 1132 | + [sg.T('Engine file', size=(12,1)), |
| 1133 | + sg.Drop(self.engine_list, size=(32, 1), key=ecbk, |
| 1134 | + enable_events=True)], |
| 1135 | + [sg.T('Engine name', size=(12,1)), sg.T( |
| 1136 | + self.get_engine_id_name(), key='engine_name_k')], |
| 1137 | + [sg.T('Threads', size=(12, 1)), |
| 1138 | + sg.Spin([t for t in range(1, 9)], initial_value=self.threads, |
| 1139 | + size=(8, 1), key='threads_k')], |
| 1140 | + [sg.T('Hash', size=(12, 1)), |
| 1141 | + sg.Spin([t for t in range(4, 256, 4)], initial_value=self.hash, |
| 1142 | + size=(8, 1), key='hash_k')], |
| 1143 | + [sg.OK(), sg.Cancel()] |
| 1144 | + ] |
| 1145 | + |
| 1146 | + self.window.Hide() |
| 1147 | + w = sg.Window('Engine Settings', layout) |
| 1148 | + |
| 1149 | + while True: |
| 1150 | + e, v = w.Read(timeout=10) |
| 1151 | + |
| 1152 | + if e is None or e == 'Cancel': |
| 1153 | + logging.info('User cancels engine selection. ' + |
| 1154 | + 'We restore the current engine data.') |
| 1155 | + self.engine_list = current_engine_list |
| 1156 | + self.engine_file = current_engine_file |
| 1157 | + logging.info('Current engine data were restored.') |
| 1158 | + logging.info('current engine list: {}'.format(self.engine_list)) |
| 1159 | + logging.info('current engine file: {}'.format(self.engine_file)) |
| 1160 | + break |
| 1161 | + |
| 1162 | + if e == ecbk: |
| 1163 | + self.engine_file = v[ecbk] |
| 1164 | + engine_id_name = self.get_engine_id_name() |
| 1165 | + w.FindElement('engine_name_k').Update(engine_id_name) |
| 1166 | + self.update_engine_list() |
| 1167 | + continue |
| 1168 | + |
| 1169 | + if e == 'OK': |
| 1170 | + hash_value = int(v['hash_k']) |
| 1171 | + self.hash = min(MAX_HASH, max(MIN_HASH, hash_value)) |
| 1172 | + |
| 1173 | + threads_value = int(v['threads_k']) |
| 1174 | + self.threads = min(MAX_THREADS, max(MIN_THREADS, threads_value)) |
| 1175 | + break |
| 1176 | + |
| 1177 | + w.Close() |
| 1178 | + self.window.UnHide() |
| 1179 | + |
| 1180 | + self.update_labels_and_game_tags(human='Human', |
| 1181 | + engine_id=self.get_engine_id_name()) |
| 1182 | + continue |
| 1183 | + |
1040 | 1184 | # Allow user to view book settings when user is to move in Play mode |
1041 | 1185 | if button == 'Get Settings::book_info_k': |
1042 | 1186 | self.get_book_settings() |
@@ -1182,10 +1326,6 @@ def play_game(self, engine_id_name, board): |
1182 | 1326 | 'Mode Play, Engine is thinking ...') |
1183 | 1327 | break |
1184 | 1328 |
|
1185 | | - if button == 'Get Settings::engine_info_k': |
1186 | | - self.get_engine_settings(engine_id_name) |
1187 | | - break |
1188 | | - |
1189 | 1329 | if button == 'Set Depth': |
1190 | 1330 | self.set_depth_limit() |
1191 | 1331 | break |
@@ -1664,7 +1804,13 @@ def main_loop(self): |
1664 | 1804 | if button is None: |
1665 | 1805 | logging.info('Quit app from main loop, X is pressed.') |
1666 | 1806 | break |
| 1807 | + |
| 1808 | + if button == 'Get Settings::engine_info_k': |
| 1809 | + self.get_engine_settings(engine_id_name) |
| 1810 | + continue |
1667 | 1811 |
|
| 1812 | + # Mode: Neutral |
| 1813 | + # Allow user to change engine settings |
1668 | 1814 | if button == 'Set Engine': |
1669 | 1815 | # Hide the main window and build a new window for setting engine options. |
1670 | 1816 | # Unhide the main window after engine setting is completed. |
@@ -1749,10 +1895,6 @@ def main_loop(self): |
1749 | 1895 | self.set_time_limit() |
1750 | 1896 | continue |
1751 | 1897 |
|
1752 | | - if button == 'Get Settings::engine_info_k': |
1753 | | - self.get_engine_settings(engine_id_name) |
1754 | | - continue |
1755 | | - |
1756 | 1898 | # Allow user to view book settings in Neutral mode |
1757 | 1899 | if button == 'Get Settings::book_info_k': |
1758 | 1900 | self.get_book_settings() |
|
0 commit comments