3838import queue
3939import copy
4040import time
41- import random
4241from datetime import datetime
4342import pyperclip
4443import chess
5352
5453
5554APP_NAME = 'Python Easy Chess GUI'
56- APP_VERSION = 'v0.67 '
55+ APP_VERSION = 'v0.68 '
5756BOX_TITLE = '{} {}' .format (APP_NAME , APP_VERSION )
5857
5958
@@ -983,16 +982,11 @@ def play_game(self, engine_id_name, board):
983982 logging .info ('Backup current engine list and file.' )
984983 logging .info ('Current engine list: {}' .format (current_engine_list ))
985984 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 ))
991985
992986 layout = [
993- [sg .T ('Engine file' , size = (12 ,1 )),
994- sg .Drop ( self .engine_list , size = (32 , 1 ), key = ecbk ,
995- enable_events = True )],
987+ [sg .T ('Engine file' , size = (12 ,1 ))] ,
988+ [ sg .Listbox ( values = self .engine_list , size = (48 , 6 ) ,
989+ bind_return_key = True , key = 'engine_file_k' )],
996990 [sg .T ('Engine name' , size = (12 ,1 )), sg .T (
997991 self .get_engine_id_name (), key = 'engine_name_k' )],
998992 [sg .T ('Threads' , size = (12 , 1 )),
@@ -1011,6 +1005,7 @@ def play_game(self, engine_id_name, board):
10111005 e , v = w .Read (timeout = 10 )
10121006
10131007 if e is None or e == 'Cancel' :
1008+ # Restore current engine list and file
10141009 logging .info ('User cancels engine selection. ' +
10151010 'We restore the current engine data.' )
10161011 self .engine_list = current_engine_list
@@ -1020,8 +1015,8 @@ def play_game(self, engine_id_name, board):
10201015 logging .info ('current engine file: {}' .format (self .engine_file ))
10211016 break
10221017
1023- if e == ecbk :
1024- self .engine_file = v [ecbk ]
1018+ if e == 'engine_file_k' :
1019+ self .engine_file = v ['engine_file_k' ][ 0 ]
10251020 engine_id_name = self .get_engine_id_name ()
10261021 w .FindElement ('engine_name_k' ).Update (engine_id_name )
10271022 self .update_engine_list ()
@@ -1033,11 +1028,15 @@ def play_game(self, engine_id_name, board):
10331028
10341029 threads_value = int (v ['threads_k' ])
10351030 self .threads = min (MAX_THREADS , max (MIN_THREADS , threads_value ))
1031+
1032+ self .engine_file = v ['engine_file_k' ][0 ]
1033+ engine_id_name = self .get_engine_id_name ()
1034+ w .FindElement ('engine_name_k' ).Update (engine_id_name )
1035+ self .update_engine_list ()
10361036 break
10371037
10381038 w .Close ()
10391039 self .window .UnHide ()
1040-
10411040 self .update_labels_and_game_tags (human = 'Human' ,
10421041 engine_id = self .get_engine_id_name ())
10431042 continue
@@ -1122,16 +1121,11 @@ def play_game(self, engine_id_name, board):
11221121 logging .info ('Backup current engine list and file.' )
11231122 logging .info ('Current engine list: {}' .format (current_engine_list ))
11241123 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 ))
11301124
11311125 layout = [
1132- [sg .T ('Engine file' , size = (12 ,1 )),
1133- sg .Drop ( self .engine_list , size = (32 , 1 ), key = ecbk ,
1134- enable_events = True )],
1126+ [sg .T ('Engine file' , size = (12 ,1 ))] ,
1127+ [ sg .Listbox ( values = self .engine_list , size = (48 , 6 ) ,
1128+ bind_return_key = True , key = 'engine_file_k' )],
11351129 [sg .T ('Engine name' , size = (12 ,1 )), sg .T (
11361130 self .get_engine_id_name (), key = 'engine_name_k' )],
11371131 [sg .T ('Threads' , size = (12 , 1 )),
@@ -1150,6 +1144,7 @@ def play_game(self, engine_id_name, board):
11501144 e , v = w .Read (timeout = 10 )
11511145
11521146 if e is None or e == 'Cancel' :
1147+ # Restore current engine list and file
11531148 logging .info ('User cancels engine selection. ' +
11541149 'We restore the current engine data.' )
11551150 self .engine_list = current_engine_list
@@ -1159,8 +1154,8 @@ def play_game(self, engine_id_name, board):
11591154 logging .info ('current engine file: {}' .format (self .engine_file ))
11601155 break
11611156
1162- if e == ecbk :
1163- self .engine_file = v [ecbk ]
1157+ if e == 'engine_file_k' :
1158+ self .engine_file = v ['engine_file_k' ][ 0 ]
11641159 engine_id_name = self .get_engine_id_name ()
11651160 w .FindElement ('engine_name_k' ).Update (engine_id_name )
11661161 self .update_engine_list ()
@@ -1172,11 +1167,15 @@ def play_game(self, engine_id_name, board):
11721167
11731168 threads_value = int (v ['threads_k' ])
11741169 self .threads = min (MAX_THREADS , max (MIN_THREADS , threads_value ))
1170+
1171+ self .engine_file = v ['engine_file_k' ][0 ]
1172+ engine_id_name = self .get_engine_id_name ()
1173+ w .FindElement ('engine_name_k' ).Update (engine_id_name )
1174+ self .update_engine_list ()
11751175 break
11761176
11771177 w .Close ()
11781178 self .window .UnHide ()
1179-
11801179 self .update_labels_and_game_tags (human = 'Human' ,
11811180 engine_id = self .get_engine_id_name ())
11821181 continue
@@ -1823,16 +1822,11 @@ def main_loop(self):
18231822 logging .info ('Backup current engine list and file.' )
18241823 logging .info ('Current engine list: {}' .format (current_engine_list ))
18251824 logging .info ('Current engine file: {}' .format (current_engine_file ))
1826-
1827- # Vary Combo box or sg.Drop key, to avoid duplicate key error.
1828- # Tkinter does not like PySimpleGUI v3.37 so far.
1829- # ecbk = engine_combo_box_key
1830- ecbk = str (random .randint (0 ,1000000 ))
18311825
18321826 layout = [
1833- [sg .T ('Engine file' , size = (12 ,1 )),
1834- sg .Drop ( self .engine_list , size = (32 , 1 ), key = ecbk ,
1835- enable_events = True )],
1827+ [sg .T ('Engine file' , size = (12 ,1 ))] ,
1828+ [ sg .Listbox ( values = self .engine_list , size = (48 , 6 ) ,
1829+ bind_return_key = True , key = 'engine_file_k' )],
18361830 [sg .T ('Engine name' , size = (12 ,1 )), sg .T (
18371831 self .get_engine_id_name (), key = 'engine_name_k' )],
18381832 [sg .T ('Threads' , size = (12 , 1 )),
@@ -1862,9 +1856,9 @@ def main_loop(self):
18621856 logging .info ('current engine file: {}' .format (self .engine_file ))
18631857 break
18641858
1865- # If user changes the engine file via the combo or drop box
1866- if e == ecbk :
1867- self .engine_file = v [ecbk ]
1859+ # If user double-clicked the engine or select and press enter key
1860+ if e == 'engine_file_k' :
1861+ self .engine_file = v ['engine_file_k' ][ 0 ]
18681862 engine_id_name = self .get_engine_id_name ()
18691863 w .FindElement ('engine_name_k' ).Update (engine_id_name )
18701864 self .update_engine_list ()
@@ -1876,6 +1870,12 @@ def main_loop(self):
18761870
18771871 threads_value = int (v ['threads_k' ])
18781872 self .threads = min (MAX_THREADS , max (MIN_THREADS , threads_value ))
1873+
1874+ # In case the user did not double-click the engine selection
1875+ self .engine_file = v ['engine_file_k' ][0 ]
1876+ engine_id_name = self .get_engine_id_name ()
1877+ w .FindElement ('engine_name_k' ).Update (engine_id_name )
1878+ self .update_engine_list ()
18791879 break
18801880
18811881 # Close the new window and restore/unhide the main window
0 commit comments