From 58e0b2c82cafdb756d0507186c668d9a35d1ebfd Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Sat, 5 Mar 2022 06:53:01 -0500 Subject: [PATCH] New Demo Program - Wordle GUI --- DemoPrograms/Demo_Game_Wordle.py | 98 ++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 DemoPrograms/Demo_Game_Wordle.py diff --git a/DemoPrograms/Demo_Game_Wordle.py b/DemoPrograms/Demo_Game_Wordle.py new file mode 100644 index 00000000..05f51965 --- /dev/null +++ b/DemoPrograms/Demo_Game_Wordle.py @@ -0,0 +1,98 @@ +import PySimpleGUI as sg +import copy + +""" + Wordle GUI Demo + + Enter characters for each position + Press enter or click enter to submit a row + + This is a prototype GUI of the front-end for WORDL + It currently: + * Takes input + * Makes sure only characters + * Automatically converts to upper case + * Handles backspace + * Checks for Enter key + * Compares against a word (the constant "answer") + * Color codes the submitted guess + + To complete an application, you'll need to: + * Supply a word to guess from list of words + * Check if user's submission is a word (I think this is how WORDLE works) + + Copyright 2022 PySimpleGUI +""" + +# Insert code to generate a word here +answer = 'WORDS' + + +def TextChar(value, key): + return sg.Input(value, key=key, font='Courier 22', size=(1,1), disabled_readonly_background_color='gray', border_width=1, p=1, enable_events=True, disabled=True) + +def main(): + layout = [[sg.Text('Wordle', font='_ 20')], + [[TextChar('', (row, col)) for col in range(5)]for row in range(6)], + [sg.B('Enter', bind_return_key=True)], + [sg.Text('Or press enter', font='_ 10')]] + + window = sg.Window("Wordle", layout, finalize=True, element_justification='c') + + cur_row, correct = 0, False + [window[(cur_row, col)].update(disabled=False) for col in range(5)] + window.bind('', '-BACKSPACE-') + while True: + event, values = window.read() + if event == sg.WIN_CLOSED: + break + if isinstance(event, tuple): + if len(values[event]): + row, col = event + char_input = values[event][-1] + if not char_input.isalpha(): # if not a character input, remove the input + window[event].update('') + else: + window[event].update(char_input.upper()[0]) # convert to uppercase + if col < 4: + window[(row, col+1)].set_focus() # Move to next position + elif event == 'Enter' and cur_row < 5: + guess = ''.join([values[(cur_row, j)] for j in range(5)]) + answer2 = copy.copy(answer) + for i, letter in enumerate(guess): + if letter == answer2[i]: + window[(cur_row, i)].update(background_color='green', text_color='white') + answer2 = answer2.replace(letter, '*') + elif letter in answer2: + window[(cur_row, i)].update(background_color='#C9B359', text_color='white') + answer2 = answer2.replace(letter, '*') + else: + window[(cur_row, i)].update(background_color='gray', text_color='white') + if guess == answer: + correct = True + break + cur_row += 1 # Move to the next row + [window[(cur_row, col)].update(disabled=False) for col in range(5)] # Enable inputs on next row + window[(cur_row, 0)].set_focus() # Move to first position on row + elif event == 'Enter' and cur_row == 5: + correct = False + break + elif event == '-BACKSPACE-': + current_focus = window.find_element_with_focus() + current_key = current_focus.Key + if isinstance(current_key, tuple): + window[current_key].update('') + if current_key[1] > 0: + window[(current_key[0], current_key[1]-1)].set_focus() + window[(current_key[0], current_key[1]-1)].update('') + + + if correct: + sg.popup('You win!') + else: + sg.popup(f'Sorry... the answer was {answer}') + + window.close() + +if __name__ == '__main__': + main() \ No newline at end of file