Skip to content

Commit 830b35f

Browse files
committed
Update python_easy_chess_gui.py
* Add Set Engine menu in Play mode, allowing the user to set the engine opponent of his choice in this mode not only in Neutral mode. Closes #20
1 parent 0c7dbe8 commit 830b35f

1 file changed

Lines changed: 152 additions & 10 deletions

File tree

python_easy_chess_gui.py

Lines changed: 152 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353

5454

5555
APP_NAME = 'Python Easy Chess GUI'
56-
APP_VERSION = 'v0.65'
56+
APP_VERSION = 'v0.66'
5757
BOX_TITLE = '{} {}'.format(APP_NAME, APP_VERSION)
5858

5959

@@ -222,7 +222,7 @@
222222
'User Wins::user_wins_k',
223223
'User Draws::user_draws_k']],
224224
['FEN', ['Paste']],
225-
['&Engine', ['Go', 'Set Depth',
225+
['&Engine', ['Go', 'Set Engine', 'Set Depth',
226226
'Set Movetime', 'Get Settings::engine_info_k',
227227
'Unhide Search Info']],
228228
['&Book', ['Set Book::book_set_k', 'Get Settings::book_info_k']],
@@ -964,15 +964,87 @@ def play_game(self, engine_id_name, board):
964964

965965
if button == 'Set Depth':
966966
self.set_depth_limit()
967+
continue
967968

968969
if button == 'Set Movetime':
969970
self.set_time_limit()
971+
continue
970972

971973
if button == 'Get Settings::engine_info_k':
972974
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
9731044

9741045
if button == 'About':
9751046
sg.PopupScrolled(HELP_MSG, title=BOX_TITLE)
1047+
continue
9761048

9771049
if button == 'Paste':
9781050
try:
@@ -1037,6 +1109,78 @@ def play_game(self, engine_id_name, board):
10371109
self.menu_elem.Update(new_menu)
10381110
continue
10391111

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+
10401184
# Allow user to view book settings when user is to move in Play mode
10411185
if button == 'Get Settings::book_info_k':
10421186
self.get_book_settings()
@@ -1182,10 +1326,6 @@ def play_game(self, engine_id_name, board):
11821326
'Mode Play, Engine is thinking ...')
11831327
break
11841328

1185-
if button == 'Get Settings::engine_info_k':
1186-
self.get_engine_settings(engine_id_name)
1187-
break
1188-
11891329
if button == 'Set Depth':
11901330
self.set_depth_limit()
11911331
break
@@ -1664,7 +1804,13 @@ def main_loop(self):
16641804
if button is None:
16651805
logging.info('Quit app from main loop, X is pressed.')
16661806
break
1807+
1808+
if button == 'Get Settings::engine_info_k':
1809+
self.get_engine_settings(engine_id_name)
1810+
continue
16671811

1812+
# Mode: Neutral
1813+
# Allow user to change engine settings
16681814
if button == 'Set Engine':
16691815
# Hide the main window and build a new window for setting engine options.
16701816
# Unhide the main window after engine setting is completed.
@@ -1749,10 +1895,6 @@ def main_loop(self):
17491895
self.set_time_limit()
17501896
continue
17511897

1752-
if button == 'Get Settings::engine_info_k':
1753-
self.get_engine_settings(engine_id_name)
1754-
continue
1755-
17561898
# Allow user to view book settings in Neutral mode
17571899
if button == 'Get Settings::book_info_k':
17581900
self.get_book_settings()

0 commit comments

Comments
 (0)