|
58 | 58 |
|
59 | 59 |
|
60 | 60 | APP_NAME = 'Python Easy Chess GUI' |
61 | | -APP_VERSION = 'v0.81' |
| 61 | +APP_VERSION = 'v0.82' |
62 | 62 | BOX_TITLE = '{} {}'.format(APP_NAME, APP_VERSION) |
63 | 63 |
|
64 | 64 |
|
@@ -1020,7 +1020,7 @@ def play_game(self, engine_id_name, board): |
1020 | 1020 |
|
1021 | 1021 | try: |
1022 | 1022 | self.engine_file = v['engine_file_k'][0] |
1023 | | - engine_id_name = self.get_engine_id_name() |
| 1023 | + self.get_engine_id_name() |
1024 | 1024 | self.update_engine_list() |
1025 | 1025 | except: |
1026 | 1026 | pass |
@@ -1154,7 +1154,7 @@ def play_game(self, engine_id_name, board): |
1154 | 1154 | layout = [ |
1155 | 1155 | [sg.T('Current Opponent: {}'.format(self.opp_eng_id_name), size=(40,1))], |
1156 | 1156 | [sg.Listbox(values=self.engine_list, size=(48,6), |
1157 | | - bind_return_key = True, key='engine_file_k')], |
| 1157 | + key='engine_file_k')], |
1158 | 1158 | [sg.T('Threads', size=(12, 1)), |
1159 | 1159 | sg.Spin([t for t in range(1, 9)], initial_value=self.threads, |
1160 | 1160 | size=(8, 1), key='threads_k')], |
@@ -1190,7 +1190,7 @@ def play_game(self, engine_id_name, board): |
1190 | 1190 |
|
1191 | 1191 | try: |
1192 | 1192 | self.engine_file = v['engine_file_k'][0] |
1193 | | - engine_id_name = self.get_engine_id_name() |
| 1193 | + self.get_engine_id_name() |
1194 | 1194 | self.update_engine_list() |
1195 | 1195 | except: |
1196 | 1196 | pass |
@@ -1690,24 +1690,33 @@ def save_game(self): |
1690 | 1690 | f.write('{}\n\n'.format(self.game)) |
1691 | 1691 |
|
1692 | 1692 | def get_engine_id_name(self): |
1693 | | - """ Set the engine path and return id name """ |
| 1693 | + """ Set the engine path """ |
1694 | 1694 | cur_dir = Path.cwd() |
1695 | 1695 | eng_path = Path(cur_dir, 'Engines', self.engine_file) |
1696 | | - self.engine_path_and_name = eng_path |
1697 | | - logging.info('engine path: {}'.format(eng_path)) |
| 1696 | + self.engine_path_and_name = eng_path |
1698 | 1697 |
|
1699 | | - # Exit app if we fail to load the engine |
1700 | | - if not eng_path.is_file(): |
1701 | | - logging.info('Quit app, failed to load engine.') |
1702 | | - sys.exit(0) |
1703 | | - |
1704 | | - # Start the engine and get its id name for update to GUI |
1705 | | - engine = chess.engine.SimpleEngine.popen_uci(str(self.engine_path_and_name)) |
1706 | | - self.opp_eng_id_name = engine.id['name'] |
1707 | | - engine.quit() |
| 1698 | + p = subprocess.Popen(str(eng_path), bufsize=1, |
| 1699 | + stdin=subprocess.PIPE, stdout=subprocess.PIPE, |
| 1700 | + stderr=subprocess.STDOUT, universal_newlines=True, |
| 1701 | + creationflags=subprocess.CREATE_NO_WINDOW) |
1708 | 1702 |
|
1709 | | - return self.opp_eng_id_name |
1710 | | - |
| 1703 | + p.stdin.write('uci\n') |
| 1704 | + for eline in iter(p.stdout.readline, ''): |
| 1705 | + line = eline.strip() |
| 1706 | + if 'id name' in line: |
| 1707 | + engine_id_name = ' '.join(line.split()[2:]).strip() |
| 1708 | + if 'uciok' in line: |
| 1709 | + break |
| 1710 | + |
| 1711 | + p.stdin.write('quit') |
| 1712 | + try: |
| 1713 | + p.communicate(timeout=5) |
| 1714 | + except subprocess.TimeoutExpired: |
| 1715 | + p.kill() |
| 1716 | + p.communicate() |
| 1717 | + |
| 1718 | + self.opp_eng_id_name = engine_id_name |
| 1719 | + |
1711 | 1720 | def get_engines(self): |
1712 | 1721 | """ Returns a list of engines located in Engines dir """ |
1713 | 1722 | engine_list = [] |
@@ -1870,7 +1879,8 @@ def main_loop(self): |
1870 | 1879 |
|
1871 | 1880 | # Define the opponent engine to use, this is the first engine in the list |
1872 | 1881 | self.engine_file = self.engine_list[0] |
1873 | | - engine_id_name = self.get_engine_id_name() |
| 1882 | + self.get_engine_id_name() |
| 1883 | + engine_id_name = self.opp_eng_id_name |
1874 | 1884 |
|
1875 | 1885 | self.adviser_engine = self.engine_list[0] |
1876 | 1886 | self.adviser_engine_path = Path('Engines', self.adviser_engine) |
@@ -1913,7 +1923,7 @@ def main_loop(self): |
1913 | 1923 | layout = [ |
1914 | 1924 | [sg.T('Current Opponent: {}'.format(self.opp_eng_id_name), size=(40,1))], |
1915 | 1925 | [sg.Listbox(values=self.engine_list, size=(48,6), |
1916 | | - bind_return_key = True, key='engine_file_k')], |
| 1926 | + key='engine_file_k')], |
1917 | 1927 | [sg.T('Threads', size=(12, 1)), |
1918 | 1928 | sg.Spin([t for t in range(1, 9)], initial_value=self.threads, |
1919 | 1929 | size=(8, 1), key='threads_k')], |
@@ -1949,12 +1959,10 @@ def main_loop(self): |
1949 | 1959 | self.threads = min(MAX_THREADS, max(MIN_THREADS, threads_value)) |
1950 | 1960 |
|
1951 | 1961 | # In case the user did not select an engine and presses OK |
1952 | | - try: |
1953 | | - self.engine_file = v['engine_file_k'][0] |
1954 | | - engine_id_name = self.get_engine_id_name() |
1955 | | - self.update_engine_list() |
1956 | | - except: |
1957 | | - pass |
| 1962 | + self.engine_file = v['engine_file_k'][0] |
| 1963 | + self.get_engine_id_name() |
| 1964 | + engine_id_name = self.opp_eng_id_name |
| 1965 | + self.update_engine_list() |
1958 | 1966 | break |
1959 | 1967 |
|
1960 | 1968 | self.window.Enable() |
|
0 commit comments