Ejemplo n.º 1
0
    def syn_client(self):
        """
        Synchronise the client
        :return: None
        """
        Server.log("Synchronise client", "GamePanel")
        if self.is_server:
            grid_state = ''
            for line in self.game.grid:
                for e in line:
                    grid_state += str(e.value)
                grid_state += SUB_SEPARATOR
            self.ui.server.send_message_to_all(Server.encode_message(PARAMETER_SEPARATOR.join((
                MESSAGE_SYN, SYN_GRID, str(self.game.current_turn.value), grid_state))))

            if self.game.is_win():
                self.ui.server.send_message_to_all(Server.encode_message(PARAMETER_SEPARATOR.join((
                    MESSAGE_SYN,
                    SYN_WIN, str(self.game.winner.value),
                    SUB_SEPARATOR.join(
                        (str(self.game.score[0]), str(self.game.score[1]))),
                    SUB_SEPARATOR.join((
                        ''.join(str(self.game.win_tokens_coord[0])),
                        ''.join(str(self.game.win_tokens_coord[1]))
                    ))
                    ))))
        else:
            self.ui.client.send_message(Server.encode_message(MESSAGE_SYN))
Ejemplo n.º 2
0
    def button_play_command(self):
        """
        When the button play (or ready is press)
        :return: None
        """

        if self.is_server:
            if self.player_2_is_connected:
                if self.player_2_is_ready:
                    self.export_last_game_settings()
                    self.ui.server.send_message_to_all(Server.encode_message(MESSAGE_PLAY))

                    self.ui.change_panel(
                        ServerGamePanel.ServerGamePanel,
                        player_1=Player.Player(TokenState.Player_1, self.players_tokens[0],
                                               self.players_entry_string_variable[0].get()),
                        player_2=Player.Player(TokenState.Player_2, self.players_tokens[1],
                                               self.players_entry_string_variable[1].get()),
                        is_server=self.is_server
                    )
                else:
                    self.player_1_want_to_start()
        else:
            self.set_player_2_ready(not self.player_2_is_ready)
            self.ui.client.send_message(Server.encode_message(PARAMETER_SEPARATOR.join((MESSAGE_SEND_READY,
                                                                                        str(self.player_2_is_ready)))))
Ejemplo n.º 3
0
class UI(tkinter.tix.Tk):
    """
    The UI
    """
    def __init__(self):
        """
        Constructor
        """

        super().__init__()
        self.current_panel = None
        self.is_alive = True

        self.server = Server(max_clients_connected=1)
        self.client = None

        self.preference = Preferences.Preferences(
            default_preferences=Preferences.DEFAULT_PREFERENCES)
        self.translation = Translation.Translation(self.preference)
        self.image_getter = ImageGetter.ImageGetter(self.translation)
        # Configure
        self.title(self.translation.get_translation("connect_four"))
        # noinspection SpellCheckingInspection
        self.iconphoto(True, self.image_getter.logo_image)  # set the logo
        self.geometry("{}x{}".format(WIDTH, HEIGHT))
        self.minsize(MIN_WIDTH, MIN_HEIGHT)
        self.protocol("WM_DELETE_WINDOW", self.destroy)

    def change_panel(self, new_panel, **kwargs):
        """
        Change the panel
        :param new_panel: the new panel
        :return: None
        """
        if self.current_panel is not None:
            self.current_panel.destroy()

        new_panel = new_panel(master=self, ui=self, **kwargs)

        self.current_panel = new_panel
        self.current_panel.pack(expand=True, fill=tkinter.tix.BOTH)
        self.update()
        self.current_panel.on_create_finish()

    def mainloop(self, n=0):
        self.is_alive = True
        super().mainloop(n)

    def destroy(self):
        self.is_alive = False

        if self.server.server_is_on:
            self.server.stop_server()

        if self.client is not None and self.client.connected:
            self.client.close_connection()

        super().destroy()
Ejemplo n.º 4
0
    def manual_connexion_button_command(self):
        """
        When the button manual connexion is clicked
        :return: None
        """
        try:
            host = socket.gethostbyname(
                self.manual_connexion_host_string_var.get())
        except socket.gaierror:
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_list_dialog_host_error_title"),
                self.ui.translation.get_translation(
                    "server_list_dialog_host_error_message").format(
                        Server.get_ip()))
            return None
        port = self.manual_connexion_port.get()

        try:
            port = int(port)
        except ValueError:
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_title"),
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_message"))
            return None

        if not (3000 <= port <= 3020):
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_title"),
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_message"))
            return None

        if Server.exist(host, port):
            self.ui.client = Client(host, port)
            if self.ui.client.connect():
                self.ui.change_panel(
                    ServerGameConfigurationPanel.ServerGameConfigurationPanel,
                    create_game=False)
        else:
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_list_dialog_unreachable_title"),
                self.ui.translation.get_translation(
                    "server_list_dialog_unreachable_message"))
            return
Ejemplo n.º 5
0
 def send_add_token(self, x, y):
     """
     Send add token to the player
     :param x: The x coord of the new token
     :param y: The y coord of the new token
     :return: None
     """
     if self.is_server:
         self.ui.server.send_message_to_all(
             Server.encode_message(PARAMETER_SEPARATOR.join((MESSAGE_NEW_TOKEN, str(x), str(y))))
         )
     else:
         self.ui.client.send_message(Server.encode_message(
             PARAMETER_SEPARATOR.join((MESSAGE_NEW_TOKEN, str(x), str(y))))
         )
Ejemplo n.º 6
0
    def __init__(self,
                 port_min=3000,
                 port_max=3020,
                 max_thread=100,
                 list_update_function=lambda add_remove, host_port: None):
        """
        Constructor
        """
        super().__init__()

        self.setDaemon(True)

        self.server_detected_list = []
        self.stop_scan = False

        self.list_update_function = list_update_function

        self.port_min = port_min
        self.port_max = port_max

        socket.setdefaulttimeout(TIMEOUT)

        self.max_thread = max_thread
        self.thread_running = 0
        self.threads = Queue()

        self.list_in_queue = []

        self.disable_local_loop = Server.get_ip() != LOCAL_LOOP
Ejemplo n.º 7
0
 def server_send_token(self):
     """
     Send the token of the client
     :return: None
     """
     self.ui.server.send_message_to_all(Server.encode_message(
         PARAMETER_SEPARATOR.join((MESSAGE_SEND_TOKEN_SELECTED, str(self.players_tokens[self.player_id].value))))
     )
Ejemplo n.º 8
0
 def client_on_connection_function(self):
     """
     When the client is connect
     :return: None
     """
     self.ui.client.send_message(Server.encode_message(MESSAGE_NEED_STATE))
     self.client_send_player_name()
     self.client_send_token()
Ejemplo n.º 9
0
 def client_send_player_name(self):
     """
     Send the name of the client player
     :return:
     """
     self.ui.client.send_message(Server.encode_message(
         PARAMETER_SEPARATOR.join((MESSAGE_SEND_NAME_SELECTED,
                                   self.players_entry_string_variable[self.player_id].get()))))
Ejemplo n.º 10
0
 def server_send_player_name(self):
     """
     Send the name of the host player
     :return: None
     """
     self.ui.server.send_message_to_all(Server.encode_message(
         PARAMETER_SEPARATOR.join((MESSAGE_SEND_NAME_SELECTED,
                                   self.players_entry_string_variable[self.player_id].get())))
     )
Ejemplo n.º 11
0
 def player_1_want_to_start(self):
     """
     When the player click on the button play and the second player isn't ready
     :return: None
     """
     self.player_1_label.configure(
         text=self.ui.translation.get_translation("server_configuration_player_1_want_start"), bg="#ee2e31"
     )
     if self.is_server:
         self.ui.server.send_message_to_all(Server.encode_message(MESSAGE_PLAYER_1_WANT_START))
Ejemplo n.º 12
0
 def button_restart_command(self):
     """
     The command of the button restart
     :return: None
     """
     if self.is_server:
         self.ui.server.send_message_to_all(Server.encode_message(MESSAGE_RESTART_GAME))
     self.game.reset()
     self.ui.change_panel(ServerGamePanel,
                          player_1=self.players[TokenState.TokenState.Player_1],
                          player_2=self.players[TokenState.TokenState.Player_2],
                          game=self.game, is_server=self.is_server)
Ejemplo n.º 13
0
    def server_on_message(self, message):
        """
        When the server receive a message
        :param message: The message receive
        :return: None
        """
        message = message.split(PARAMETER_SEPARATOR)

        if message[0] == MESSAGE_NEW_TOKEN and len(message) == 3:
            if self.game.current_turn == TokenState.TokenState.Player_1:
                self.syn_client()

            try:
                x = int(message[1])
                y = int(message[2])

                if 0 <= x < self.game.grid_width and \
                        0 <= y < self.game.grid_height:

                    if not self.add_token_with_coord(x, y)[0]:
                        Server.warn("Can't place a token at this coord", "GamePanel")
                        self.syn_client()
                else:
                    Server.warn("X or y is not valid", "GamePanel")
                    self.syn_client()
            except ValueError:
                Server.warn("X or y coord NaN", "GamePanel")
                self.syn_client()

        elif message[0] == MESSAGE_SYN:
            self.syn_client()
Ejemplo n.º 14
0
    def __init__(self):
        """
        Constructor
        """

        super().__init__()
        self.current_panel = None
        self.is_alive = True

        self.server = Server(max_clients_connected=1)
        self.client = None

        self.preference = Preferences.Preferences(default_preferences=Preferences.DEFAULT_PREFERENCES)
        self.translation = Translation.Translation(self.preference)
        self.image_getter = ImageGetter.ImageGetter(self.translation)
        # Configure
        self.title(self.translation.get_translation("connect_four"))
        # noinspection SpellCheckingInspection
        self.iconphoto(True, self.image_getter.logo_image)  # set the logo
        self.geometry("{}x{}".format(WIDTH, HEIGHT))
        self.minsize(MIN_WIDTH, MIN_HEIGHT)
        self.protocol("WM_DELETE_WINDOW", self.destroy)
Ejemplo n.º 15
0
    def manual_connexion_button_command(self):
        """
        When the button manual connexion is clicked
        :return: None
        """
        try:
            host = socket.gethostbyname(
                self.manual_connexion_host_string_var.get())
        except socket.gaierror:
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_list_dialog_host_error_title"),
                self.ui.translation.get_translation(
                    "server_list_dialog_host_error_message").format(
                        Server.get_ip()))
            return None
        port = self.manual_connexion_port.get()

        try:
            port = int(port)
            if port < 1 or port > 65535:
                raise ValueError
        except ValueError:
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_title"),
                self.ui.translation.get_translation(
                    "server_configuration_dialog_port_error_message"))
            return None

        if not (GAME_PORT_MIN <= port <= GAME_PORT_MAX):
            if not tkinter.messagebox.askokcancel(
                    self.ui.translation.get_translation(
                        "server_configuration_dialog_port_warning_title"),
                    self.ui.translation.get_translation(
                        "server_configuration_dialog_port_warning_message")):
                return None

        self.ui.client = Client(host, port)
        if self.ui.client.connect():
            self.ui.change_panel(
                ServerGameConfigurationPanel.ServerGameConfigurationPanel,
                is_server=False)
        else:
            self.ui.client = None
            tkinter.messagebox.showerror(
                self.ui.translation.get_translation(
                    "server_list_dialog_unreachable_title"),
                self.ui.translation.get_translation(
                    "server_list_dialog_unreachable_message"))
            return
Ejemplo n.º 16
0
 def button_play_server_command(self, host_port):
     """
     When the button to play with a server
     :param host_port: host and port of the server
     :return: None
     """
     if Server.exist(host_port[0], host_port[1]):
         self.ui.client = Client(host_port[0], host_port[1])
         if self.ui.client.connect():
             self.ui.change_panel(
                 ServerGameConfigurationPanel.ServerGameConfigurationPanel,
                 is_server=False)
     else:
         self.server_scanner_server_detection(ServerScanner.SERVER_REMOVE,
                                              host_port)
Ejemplo n.º 17
0
 def button_back_command(self):
     """
     The command of the button back
     :return: None
     """
     if self.is_server:
         from UI.ServerGameConfigurationPanel import ServerGameConfigurationPanel
         self.ui.change_panel(ServerGameConfigurationPanel, is_server=self.is_server)
         self.ui.server.send_message_to_all(Server.encode_message(MESSAGE_BACK_MENU))
     else:
         if tkinter.messagebox.askquestion(
                 self.ui.translation.get_translation("server_dialog_quit_title"),
                 self.ui.translation.get_translation("server_dialog_quit_message")
         ) == tkinter.messagebox.YES:
             from UI.ServerListPanel import ServerListPanel
             self.ui.client.close_connection()
             self.ui.change_panel(ServerListPanel)
Ejemplo n.º 18
0
    def __init__(self, master, ui, is_server=False,
                 player_1=Player.Player(TokenState.TokenState.Player_1, TokenStyle.TokenStyle.Blue),
                 player_2=Player.Player(TokenState.TokenState.Player_2, TokenStyle.TokenStyle.Green),
                 game=None):
        """
        Constructor
        """
        super().__init__(master, ui, player_1, player_2, game, disable_end_button=not is_server)

        self.is_server = is_server

        self.button_syn = tkinter.tix.Button(
            self, image=self.ui.image_getter.syn_icon, command=self.button_syn_command)
        self.button_syn.place(relx=1., rely=0., x=0, y=0, anchor=tkinter.N + tkinter.E)
        self.button_syn_lock = False

        if self.is_server:
            self.after(100, lambda: self.ui.server.send_message_to_all(Server.encode_message(
                PARAMETER_SEPARATOR.join((MESSAGE_SET_TURN, str(self.game.current_turn.value))))))
            self.button_main_menu.configure(
                text=self.ui.translation.get_translation("quit"), command=self.button_back_dialog_command
            )

            # Set server functions
            self.ui.server.on_message_function = self.server_on_message
            self.ui.server.on_client_connect_function = self.server_on_client_connect_function
            self.ui.server.on_client_disconnect_function = self.server_on_client_disconnect_function

        else:
            tkinter.tix.Label(
                self.win_text_frame,
                text=self.ui.translation.get_translation("server_game_wait_host")
            ).grid(row=1, column=0)

            # Set client functions
            self.ui.client.on_message_function = self.client_on_message
            self.ui.client.on_connection_function = self.client_on_connection_function
            self.ui.client.on_disconnection_function = self.client_on_disconnection_function
Ejemplo n.º 19
0
    def __init__(self, master, ui):
        """
        Constructor
        """
        super().__init__(master, ui)

        for r in range(1, 2):
            self.grid_rowconfigure(r, weight=1)

        for c in range(0, 2):
            self.grid_columnconfigure(c, weight=1)

        tkinter.tix.Label(self,
                          text=self.ui.translation.get_translation(
                              "server_list_server_detected")).grid(
                                  row=0, column=0, sticky=tkinter.tix.W)

        self.scrolled_window_server_detected = tkinter.tix.ScrolledWindow(self)
        self.scrolled_window_server_detected.grid(row=1,
                                                  column=0,
                                                  columnspan=2,
                                                  sticky=tkinter.tix.NSEW)

        self.window_server_detected = self.scrolled_window_server_detected.window

        self.window_server_detected.grid_columnconfigure(0, weight=1)

        self.dict_server_detected = {}

        self.manual_connexion_frame = tkinter.tix.Frame(self)
        self.manual_connexion_frame.grid(row=2,
                                         column=0,
                                         columnspan=2,
                                         sticky=tkinter.tix.NSEW)

        for c in range(0, 3):
            self.manual_connexion_frame.columnconfigure(c, weight=1)

        tkinter.tix.Label(self.manual_connexion_frame,
                          text=self.ui.translation.get_translation(
                              "server_list_manual_connexion_frame_text")).grid(
                                  row=0,
                                  column=0,
                                  rowspan=2,
                                  sticky=tkinter.tix.NSEW)

        tkinter.tix.Label(self.manual_connexion_frame,
                          text=self.ui.translation.get_translation(
                              "server_list_manual_connexion_frame_host")).grid(
                                  row=0, column=1, sticky=tkinter.tix.E)

        self.manual_connexion_host_string_var = tkinter.tix.StringVar()
        self.manual_connexion_host_string_var.set(Server.get_ip())
        self.manual_connexion_host_entry = tkinter.tix.Entry(
            self.manual_connexion_frame,
            textvariable=self.manual_connexion_host_string_var)
        self.manual_connexion_host_entry.grid(row=0,
                                              column=2,
                                              sticky=tkinter.tix.NSEW)

        tkinter.tix.Label(self.manual_connexion_frame,
                          text=self.ui.translation.get_translation(
                              "server_list_manual_connexion_frame_port")).grid(
                                  row=1, column=1, sticky=tkinter.tix.E)

        self.manual_connexion_port = tkinter.tix.Spinbox(
            self.manual_connexion_frame, from_=1, to=65535, increment=1)
        self.manual_connexion_port.delete(0, 1)
        self.manual_connexion_port.insert(0, GAME_PORT_MIN)
        self.manual_connexion_port.grid(row=1,
                                        column=2,
                                        sticky=tkinter.tix.NSEW)

        self.play_button = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation("play"),
            state=tkinter.tix.DISABLED)
        self.play_button.grid(row=3, column=0, sticky=tkinter.tix.NSEW)

        self.manual_connexion_button = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation(
                "server_list_manual_connexion"),
            command=self.manual_connexion_button_command)
        self.manual_connexion_button.grid(row=3,
                                          column=1,
                                          sticky=tkinter.tix.NSEW)

        self.back_button = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation("back"),
            command=self.button_back_command)

        self.back_button.grid(row=4, column=0, sticky=tkinter.tix.NSEW)

        self.create_game_button = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation(
                "server_list_create_game"),
            command=self.button_create_game_command)

        self.create_game_button.grid(row=4, column=1, sticky=tkinter.tix.NSEW)

        self.server_scanner = ServerScanner.ServerScanner(
            list_update_function=self.server_scanner_server_detection)
Ejemplo n.º 20
0
    def client_on_message(self, message):
        """
        When the client receive a message
        :param message: The message receive
        :return: None
        """
        message = message.split(PARAMETER_SEPARATOR)

        if message[0] == MESSAGE_SET_TURN and len(message) == 2:
            self.game.current_turn = TokenState.TokenState(int(message[1]))
            self.update_turn_label()

        elif message[0] == MESSAGE_NEW_TOKEN and len(message) == 3:
            if self.game.current_turn == TokenState.TokenState.Player_2:
                self.syn_client()
                return

            try:
                x = int(message[1])
                y = int(message[2])

                if 0 <= x < self.game.grid_width and \
                        0 <= y < self.game.grid_height:

                    if not self.add_token_with_coord(x, y)[0]:
                        Server.warn("Can't place a token at this coord", "GamePanel")
                        self.syn_client()
                else:
                    Server.warn("X or y is not valid", "GamePanel")
                    self.syn_client()
            except ValueError:
                Server.warn("X or y coord NaN", "GamePanel")
                self.syn_client()

        elif message[0] == MESSAGE_BACK_MENU:
            from UI.ServerGameConfigurationPanel import ServerGameConfigurationPanel
            self.ui.change_panel(ServerGameConfigurationPanel, is_server=False)

        elif message[0] == MESSAGE_RESTART_GAME:
            self.button_restart_command()

        elif message[0] == MESSAGE_SYN and 3 < len(message) < 6:
            if message[1] == SYN_GRID:
                try:
                    current_token = TokenState.TokenState(int(message[2]))
                    if self.game.current_turn != current_token:
                        self.game.current_turn = current_token
                        self.update_turn_label()
                except ValueError:
                    pass

                split = message[3].split(SUB_SEPARATOR)
                if len(split) == self.game.grid_width and len(split[0]) == self.game.grid_height:
                    for x, line in enumerate(split):
                        for y, e in enumerate(line):
                            token = TokenState.TokenState(int(e))
                            if self.game.grid[x][y] != token:
                                self.game.grid[x][y] = token
                                self.update_image(x, y)
            else:
                try:
                    self.game.winner = TokenState.TokenState(int(message[2]))
                except ValueError:
                    pass

                scores = message[3].split(SUB_SEPARATOR)
                if len(scores) == 2:
                    scores[0], scores[1] = int(scores[0]), int(scores[1])
                    self.game.score = scores

                token_coord = message[4].split(SUB_SEPARATOR)  # xy|xy
                if len(token_coord) == 2 and len(token_coord[0]) == 2:
                    for i, c in enumerate(token_coord):
                        for j, xy in enumerate(c):
                            self.game.win_tokens_coord[i][j] = xy

                    self.game.win_tokens_coord = token_coord

                self.update_win()
Ejemplo n.º 21
0
    def server_start_stop_command(self):
        """
        Start the server
        :return: None
        """
        if self.ui.server.server_is_on:
            if not self.player_2_is_connected or tkinter.messagebox.askquestion(
                    self.ui.translation.get_translation("server_dialog_server_stop_title"),
                    self.ui.translation.get_translation("server_dialog_server_stop_message")
            ) == tkinter.messagebox.YES:
                if self.ui.server.stop_server():
                    self.server_port_spin_box.configure(state=tkinter.tix.NORMAL, increment=1)
                    self.server_start_stop.configure(
                        text=self.ui.translation.get_translation("server_configuration_start")
                    )

                    self.server_state_label.configure(
                        text=self.ui.translation.get_translation("server_state_stopped"),
                        fg="#ee2e31"
                    )
        else:
            try:
                port = int(self.server_port_spin_box.get())
                if port < 1 or port > 65535:
                    raise ValueError
            except ValueError:
                tkinter.messagebox.showerror(
                    self.ui.translation.get_translation("server_configuration_dialog_port_error_title"),
                    self.ui.translation.get_translation("server_configuration_dialog_port_error_message")
                )

            else:
                if port < GAME_PORT_MIN or port > GAME_PORT_MAX:
                    if not tkinter.messagebox.askokcancel(
                            self.ui.translation.get_translation("server_configuration_dialog_port_warning_title"),
                            self.ui.translation.get_translation("server_configuration_dialog_port_warning_message")
                    ):
                        return
                self.ui.server = Server(
                    port=port, max_clients_connected=1,
                    on_message_function=self.server_on_message,
                    on_client_connect_function=self.server_on_client_connect_function,
                    on_client_disconnect_function=self.server_on_client_disconnect_function
                )
                result = self.ui.server.start_server()
                if result[0]:
                    self.server_port_spin_box.configure(state="readonly", increment=0)
                    self.server_start_stop.configure(
                        text=self.ui.translation.get_translation("server_configuration_stop")
                    )

                    self.server_state_label.configure(
                        text=self.ui.translation.get_translation("server_state_started"), fg="#78bc61"
                    )
                else:
                    error_name = errno.errorcode[result[1]]
                    if self.ui.translation.translation_exist(SERVER_ERROR_DIALOG_KEY_FORMAT.format(error_name)):
                        tkinter.messagebox.showerror(
                            self.ui.translation.get_translation("server_start_error_dialog_title")
                                .format(result[1]),
                            self.ui.translation.get_translation(SERVER_ERROR_DIALOG_KEY_FORMAT.format(error_name))
                        )
                    else:
                        tkinter.messagebox.showerror(
                            self.ui.translation.get_translation("server_start_error_dialog_title")
                                .format(result[1]),
                            self.ui.translation.get_translation("server_start_error_unknown_dialog_message")
                                .format(result[1], error_name, result[2].strerror)
                        )
Ejemplo n.º 22
0
    for i in range(1000):
        rtt100.append(100)
        rtt150.append(150)



    #+++++++++++++++++++++Chunks++++++++++++++++++++++++++++++++++++++++++

    for size in chunksizes:
        clientq = queue.Queue()
        serverq = queue.Queue()
        ackq = queue.Queue()

        #++++++++++++++++++++++Sequential++++++++++++++++++++++++++++++

        s = Server(size, ackq, clientq, serverq, "receive" , "sequential" , rtt100, 10)
        c = Client(size, ackq, clientq, serverq, "send", "sequential")

        s.setName("Server")
        c.setName("Client")
        s.start()
        c.start()
        c.join()

        while True:
            if not c.is_alive():
                delay = s.get_delay()
                chunkresult['value'][:,0][np.logical_and(chunkresult['scheme'] == 'seq', chunkresult['chunksize'] == size)] = delay
                s.join()

                break
Ejemplo n.º 23
0
    def __init__(self, master, ui, is_server=False):
        """
        Constructor
        """
        super().__init__(master, ui)
        self.is_server = is_server

        self.player_2_is_ready = False
        self.player_2_is_connected = False

        for r in range(2, 3):
            self.rowconfigure(r, weight=1)

        for c in range(0, 2):
            self.columnconfigure(c, weight=1)

        self.player = (TokenState.Player_2, TokenState.Player_1)[is_server]
        self.player_id = (1, 0)[is_server]
        self.opponent = (TokenState.Player_1, TokenState.Player_2)[is_server]
        self.opponent_id = (0, 1)[is_server]

        self.ui.image_getter.resize_tokens_images(100)

        # Configure server

        if is_server:

            self.server_configure_frame = tkinter.tix.Frame(
                self, relief=tkinter.tix.SUNKEN, borderwidth=2,
                padx=10, pady=10
            )
            self.server_configure_frame.grid(row=0, column=0, columnspan=2, sticky=tkinter.tix.NSEW, padx=10, pady=10)

            for c in range(0, 2):
                self.server_configure_frame.columnconfigure(c, weight=1)

            self.server_state_label = tkinter.tix.Label(
                self.server_configure_frame, text=self.ui.translation.get_translation("server_state_stopped"),
                fg="#ee2e31"
            )
            self.server_state_label.grid(row=0, column=0, columnspan=2, sticky=tkinter.tix.NSEW)

            self.server_host = tkinter.tix.Label(
                self.server_configure_frame,
                text=self.ui.translation.get_translation("server_configuration_host_label").format(
                    Server.get_ip())
            )

            self.server_host.grid(row=1, column=0, sticky=tkinter.tix.NSEW)

            self.server_port_frame = tkinter.tix.Frame(self.server_configure_frame)
            self.server_port_frame.grid(row=1, column=1, sticky=tkinter.tix.NSEW)

            for c in range(0, 2):
                self.server_port_frame.columnconfigure(c, weight=1)

            self.server_port_label = tkinter.tix.Label(
                self.server_port_frame,
                text=self.ui.translation.get_translation("server_configuration_port_entry_title")
            )
            self.server_port_label.grid(row=0, column=0, sticky=tkinter.tix.E)

            self.server_port_spin_box = tkinter.tix.Spinbox(self.server_port_frame, from_=1, to=65535, increment=1)
            self.server_port_spin_box.delete(0, 1)
            self.server_port_spin_box.insert(0, GAME_PORT_MIN)

            self.server_port_spin_box.grid(row=0, column=1, sticky=tkinter.tix.W)

            self.server_action_frame = tkinter.tix.Frame(self.server_configure_frame)
            self.server_action_frame.grid(row=2, column=0, columnspan=2, sticky=tkinter.tix.NSEW)

            for c in range(0, 3):
                self.server_action_frame.columnconfigure(c, weight=1)

            self.server_start_stop = tkinter.tix.Button(
                self.server_action_frame, text=self.ui.translation.get_translation("server_configuration_start"),
                command=self.server_start_stop_command
            )
            self.server_start_stop.grid(row=0, column=0, sticky=tkinter.tix.NSEW)

            if self.ui.server.server_is_on:
                self.server_port_spin_box.configure(state="readonly", increment=0)
                self.server_start_stop.configure(
                    text=self.ui.translation.get_translation("server_configuration_stop")
                )

                self.server_state_label.configure(
                    text=self.ui.translation.get_translation("server_state_started"), fg="#78bc61"
                )

        # Configure game

        self.players_name_frame = [tkinter.tix.Frame(self),
                                   tkinter.tix.Frame(self)]
        self.players_name_frame[0].grid(row=1, column=0)
        self.players_name_frame[1].grid(row=1, column=1)

        tkinter.tix.Label(self.players_name_frame[0], text=self.ui.translation.get_translation(
            "configure_game_panel_name")).grid(row=0, column=0)
        tkinter.tix.Label(self.players_name_frame[1], text=self.ui.translation.get_translation(
            "configure_game_panel_name")).grid(row=0, column=0)

        self.players_entry_string_variable = [
            tkinter.tix.StringVar(),
            tkinter.tix.StringVar()
        ]

        for i in range(0, 2):
            if i == self.opponent_id:
                self.players_entry_string_variable[i].set(
                    self.ui.translation.get_translation("server_configuration_waiting"))
            else:
                self.players_entry_string_variable[i].set(
                    self.ui.translation.get_translation("default_player_name").format(str(i + 1))
                )

        self.players_entry = [tkinter.tix.Entry(self.players_name_frame[0],
                                                textvariable=self.players_entry_string_variable[0],
                                                state=("readonly", "normal")[is_server]),
                              tkinter.tix.Entry(self.players_name_frame[1],
                                                textvariable=self.players_entry_string_variable[1],
                                                state=("normal", "readonly")[is_server])]

        if is_server:
            self.players_entry_string_variable[0].trace_add("write", lambda x, y, z: self.name_string_var_trace_write())
        else:
            self.players_entry_string_variable[1].trace_add("write", lambda x, y, z: self.name_string_var_trace_write())

        self.players_entry[0].grid(row=0, column=1)
        self.players_entry[1].grid(row=0, column=1)

        self.players_settings_scrolled_window = [tkinter.tix.ScrolledWindow(self, relief=tkinter.tix.SUNKEN,
                                                                            borderwidth=3),
                                                 tkinter.tix.ScrolledWindow(self, relief=tkinter.tix.SUNKEN,
                                                                            borderwidth=3)]
        self.players_settings_scrolled_window[0].grid(row=2, column=0, sticky=tkinter.tix.NSEW, pady=10, padx=5)
        self.players_settings_scrolled_window[1].grid(row=2, column=1, sticky=tkinter.tix.NSEW, pady=10, padx=5)

        self.players_settings_window = [self.players_settings_scrolled_window[0].window,
                                        self.players_settings_scrolled_window[1].window]

        for i in range(0, 2):
            self.players_settings_window[i].grid_columnconfigure(0, weight=1)

        self.players_tokens = [
            TokenStyle.TokenStyle(random.randint(0, TokenStyle.NUMBER_STYLE - 1)),
            TokenStyle.TokenStyle(random.randint(0, TokenStyle.NUMBER_STYLE - 1))
        ]
        self.players_tokens[self.opponent_id] = TokenStyle.TokenStyle.Not_Connected

        self.players_tokens_images = [
            self.ui.image_getter.save_token_photos[TokenState.Player_1][self.players_tokens[0]],
            self.ui.image_getter.save_token_photos[TokenState.Player_2][self.players_tokens[1]]
        ]

        self.players_tokens_labels = [
            tkinter.tix.Label(self.players_settings_window[0], image=self.players_tokens_images[0]),
            tkinter.tix.Label(self.players_settings_window[1], image=self.players_tokens_images[1])
        ]

        self.players_tokens_labels[0].grid(row=1, column=0, sticky=tkinter.tix.NSEW)
        self.players_tokens_labels[1].grid(row=1, column=0, sticky=tkinter.tix.NSEW)

        self.player_1_label = tkinter.tix.Label(
            self.players_settings_window[0], fg="white", text="", wraplength=250
        )
        self.player_1_label.grid(row=2, column=0)

        self.player_2_ready_label = tkinter.tix.Label(
            self.players_settings_window[1], fg="#ee2e31",
            text=self.ui.translation.get_translation(
                ("server_configuration_player_2_not_ready",
                 "server_configuration_player_2_not_connected")
                [self.is_server])
        )
        self.player_2_ready_label.grid(row=2, column=0)

        self.button_token_choose_per_line_last = 0
        self.button_token_choose_per_line = 0

        self.token_choose_frame = tkinter.tix.Frame(self.players_settings_window[self.player_id])

        self.token_choose_frame.grid(row=3, column=0, sticky=tkinter.tix.NSEW)

        self.token_choose_buttons = []

        for index in range(0, TokenStyle.NUMBER_STYLE):
            self.token_choose_buttons.append(tkinter.tix.Button(self.token_choose_frame,
                                                                image=self.ui.image_getter.save_token_icons[self.player]
                                                                [TokenStyle.TokenStyle(index)],
                                                                command=lambda _index=index:
                                                                self.button_change_token_command(
                                                                    _index)))

        self.button_main_menu = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation("back"),
            command=self.button_main_menu_command)
        self.button_main_menu.grid(row=3, column=0, sticky=tkinter.tix.NSEW)

        self.button_play = tkinter.tix.Button(
            self,
            text=self.ui.translation.get_translation(("ready", "play")[is_server]),
            command=self.button_play_command)
        if not self.is_server:
            self.button_play.configure(fg="#ee2e31", activeforeground="#ee2e31")
        self.button_play.grid(row=3, column=1, sticky=tkinter.tix.NSEW)

        self.import_last_game_setting()

        if is_server:
            # Set server functions
            self.ui.server.on_message_function = self.server_on_message
            self.ui.server.on_client_connect_function = self.server_on_client_connect_function
            self.ui.server.on_client_disconnect_function = self.server_on_client_disconnect_function

        else:
            # Set client functions
            self.ui.client.on_message_function = self.client_on_message
            self.ui.client.on_connection_function = self.client_on_connection_function
            self.ui.client.on_disconnection_function = self.client_on_disconnection_function

            self.client_on_connection_function()  # because it is already connected