Приложение зависает при прослушивании сокета Python

Пишу сетевую игру на Python без создания отдельных файлов для сервера и клиента, на данный момент приложение может исправно отправлять данные, но при попытке получить данные через result = s_in.recv(1024) зависает, пробовал выполнять команду до проверки ивентов второго окна, но все равно зависает

import json
import CharacterClass
import createObject
import constructor
import socket
import SpellClass
import PySimpleGUI as sg  # сторонний GUI фреймворк


def screenupdate():
    ...


s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # сокет для получение IP пользователя
# AF_INET - используется IP-протокол четвертой версии. SOCK_DGRAMM - UDP
s.connect(("gmail.com", 80))
myIP = str(s.getsockname()[0])
s.close()
s_in = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # сокет для получения данных
s_in.bind((myIP, 22003))  # резерв адреса myIP и порта 22003
s_out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # сокет для отправки данных
pvevent = ''
winstat = 0
losestat = 0
enemyturn = ''

layout = [[sg.Button('Начать игру', size=(11, 1))],  # структура главного окна
          [sg.Button('Статистика', size=(11, 1))],
          [sg.Button('Настройки', size=(11, 1))],
          [sg.Button('Выход', size=(11, 1))]]

layout2 = [[sg.Text('Сейчас ваш ход', key='TURN')],  # структура окна игры
           [sg.Text('Ваши HP', key='-hp-')],
           [sg.Text('Ваши MP', key='-mp-')],
           [sg.Button('Заклинание 1', size=(21, 1)), sg.Button('Заклинание 2', size=(21, 1)),
            sg.Button('Заклинание 3', size=(21, 1))],
           [sg.Text('Урон', key='-deh1-', size=(21, 1)), sg.Text('Урон', key='-deh2-', size=(21, 1)),
            sg.Text('Урон', key='-deh3-', size=(21, 1))],
           [sg.Text('Стоимость', key='-dam1-', size=(21, 1)), sg.Text('Стоимость', key='-dam2-', size=(21, 1)),
            sg.Text('Стоимость', key='-dam3-', size=(21, 1))],
           [sg.Text('Урон мане', key='-dem1-', size=(21, 1)), sg.Text('Урон мане', key='-dem2-', size=(21, 1)),
            sg.Text('Урон мане', key='-dem3-', size=(21, 1))],
           [sg.Text('Восстановление HP', key='-dah1-', size=(21, 1)),
            sg.Text('Восстановление HP', key='-dah2-', size=(21, 1)),
            sg.Text('Восстановление HP', key='-dah3-', size=(21, 1))],
           [sg.Text('Вероятность попадания', key='-vp1-', size=(21, 1)),
            sg.Text('Вероятность попадания', key='-vp2-', size=(21, 1)),
            sg.Text('Вероятность попадания', key='-vp3-', size=(21, 1))],
           [sg.Button('Обновить данные')]]

window = sg.Window('Дуэль магов', layout)  # объявление главного окна

while True:
    event, values = window.read()  # создание главного окна
    if event == sg.WIN_CLOSED or event == 'Выход':
        break
    if event == 'Статистика':
        event, values = sg.Window('Статистика',
                                  [[sg.Text("Победы", size=(9, 1)), sg.Text(str(winstat))],
                                   [sg.Text("Поражения", size=(9, 1)), sg.Text(str(losestat))],
                                   [sg.Button('Назад')]]).read(close=True)
        print(event, values)
    if event == 'Настройки':
        event, values = sg.Window('Настройки',
                                  [[sg.Checkbox('Включить звук', enable_events=True, key='-sound-')],
                                   [sg.Button('Назад')]]).read(close=True)
        print(event, values)
    if event == 'Начать игру':
        event, values = sg.Window('Режимы игры',
                                  [[sg.Text('Выберете режим игры')],
                                   [sg.Button('Стандартный', size=(11, 1))],
                                   [sg.Button('Расширенный', size=(11, 1))]]).read(close=True)
        spell1 = SpellClass.Spell(0, 0, 0, 0, 0)
        spell2 = SpellClass.Spell(0, 0, 0, 0, 0)
        spell3 = SpellClass.Spell(0, 0, 0, 0, 0)
        if event == 'Стандартный':
            spell1 = createObject.createclassic()
            spell2 = createObject.createclassic()
            spell3 = createObject.createclassic()
            pvevent = 'Стандартный'
        if event == 'Расширенный':
            spell1 = createObject.createmaximum()
            spell2 = createObject.createmaximum()
            spell3 = createObject.createmaximum()
            pvevent = 'Расширенный'
        print(event, values)
        event, values = sg.Window('Поиск оппонента',
                                  [[sg.Text('Введите IP оппонента')],
                                   [sg.Input(key='-IP-')],
                                   [sg.Button('OK')]]).read(close=True)
        print(event, values)
        IP = values['-IP-']
        print(IP, myIP)
        if myIP > IP:
            enemyturn = False
        player = CharacterClass.Character()
        print(player.get_hp())
        window2 = sg.Window('game', layout2)  # объявление окна с полем
        wn2 = True
        while wn2:
            event, values = window2.read()  # создание окна с полем
            screenupdate()
            if event == sg.WIN_CLOSED:
                wn2 = False
            if event == 'Заклинание 1':
                player.change_hp(spell1.delta_ally_hp)
                player.change_mp(spell1.delta_ally_mp)
                r = constructor.output(spell1.delta_enemy_hp, spell1.delta_enemy_mp, "json")
                s_out.sendto(r.encode(), (IP, 22003))
                spell1 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell2 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell3 = SpellClass.Spell(0, 0, 0, 0, 0)
                result = s_in.recv(1024)
                g = json.loads(result.decode())
                window2['TURN'].Update('Сейчас ход оппонента')
                player.change_hp(g.get('delta_enemy_hp'))
                player.change_mp(g.get('delta_enemy_mp'))
            if event == 'Заклинание 2':
                player.change_hp(spell2.delta_ally_hp)
                player.change_mp(spell2.delta_ally_mp)
                r = constructor.output(spell2.delta_enemy_hp, spell2.delta_enemy_mp, "json")
                s_out.sendto(r.encode(), (IP, 22003))
                spell1 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell2 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell3 = SpellClass.Spell(0, 0, 0, 0, 0)
                result = s_in.recv(1024)
                g = json.loads(result.decode())
                window2['TURN'].Update('Сейчас ход оппонента')
                player.change_hp(g.get('delta_enemy_hp'))
                player.change_mp(g.get('delta_enemy_mp'))
            if event == 'Заклинание 3':
                player.change_hp(spell3.delta_ally_hp)
                player.change_mp(spell3.delta_ally_mp)
                r = constructor.output(spell3.delta_enemy_hp, spell3.delta_enemy_mp, "json")
                s_out.sendto(r.encode(), (IP, 22003))
                spell1 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell2 = SpellClass.Spell(0, 0, 0, 0, 0)
                spell3 = SpellClass.Spell(0, 0, 0, 0, 0)
                result = s_in.recv(1024)
                g = json.loads(result.decode())
                window2['TURN'].Update('Сейчас ход оппонента')
                player.change_hp(g.get('delta_enemy_hp'))
                player.change_mp(g.get('delta_enemy_mp'))
        window2.close()
window.close()

Ответы (0 шт):