Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pygame多线程客户端套接字GUI阻止_Python_Sockets_User Interface_Pygame_Blocking - Fatal编程技术网

Python pygame多线程客户端套接字GUI阻止

Python pygame多线程客户端套接字GUI阻止,python,sockets,user-interface,pygame,blocking,Python,Sockets,User Interface,Pygame,Blocking,我想写一个与服务器和客户端,终端版本工作良好,但pygame版本只是封锁,不能撕裂任何东西 这里是游戏执行功能 首先,它启动一个套接字连接 self.\u running=True在init中,从服务器获取的包类似于{“网格”:网格(带0和1的字符串),“x”:x,“y”:y,“玩家”:最后一个玩家,“下一个玩家”:当前玩家,“gameover”:is\u gameover} 在循环中: 解析包 检查是否gameover,如果是,则显示有关gameover的信息并关闭套接字 如果当前播放

我想写一个与服务器和客户端,终端版本工作良好,但pygame版本只是封锁,不能撕裂任何东西

这里是游戏执行功能

  • 首先,它启动一个套接字连接

  • self.\u running=True
    init
    中,从服务器获取的包类似于
    {“网格”:网格(带0和1的字符串),“x”:x,“y”:y,“玩家”:最后一个玩家,“下一个玩家”:当前玩家,“gameover”:is\u gameover}

  • 在循环中:

    • 解析包
    • 检查是否gameover,如果是,则显示有关gameover的信息并关闭套接字
    • 如果当前播放机是我,请在_event上调用
      ,让用户移动(我怀疑此步骤错误,因此解析包步骤阻止了主线程?但我应该如何修复此问题),然后将新的移动包发送到服务器
    • 若当前玩家不是我,那个么向我正在等待的服务器发送一个特殊的包(我知道这有点愚蠢)
这是环形的

        while self._running:
            data = self.client_thread.reply_q.get(True)
            
            if data:
                self.last_player = data["player"]
                self.grid = self.grid_str_2_matrix(data["grid"])
                self.lastPosition = [data["x"], data["y"]]
                self.gomoku_board_init()
                
                if data["gameover"] == -1:
                    if data["next_player"] != self.player:
                        self.client_thread.cmd_q.put(ClientCommand(ClientCommand.SEND, {"wait": True}))
                        print("waiting")
                    else:
                        for event in pygame.event.get():
                            self.on_event(event)

                        print("new move")
                else:
                    print("game over")
                    self._running = False
                    if data["gameover"] == 0:
                        self.winner = 0
                    else:
                        self.winner = data["player"]
                    self.client_thread.cmd_q.put(ClientCommand(ClientCommand.CLOSE))
                    break
            self.on_render()
        self.on_cleanup()

和<代码> OnEngult函数在中间被调用到接受用户的下一个动作

if data["gameover"] == -1:
    if data["next_player"] != self.player:
        ...
    else:    
        for event in pygame.event.get():
            self.on_event(event)
代码如下

def on_event(self, event):
    print(event.type == pygame.MOUSEBUTTONUP)
    

    if event.type == pygame.MOUSEBUTTONUP:
        pos = pygame.mouse.get_pos()
        r = (pos[0] - PADDING + WIDTH // 2) // (WIDTH + MARGIN)
        c = (pos[1] - PADDING + WIDTH // 2) // (WIDTH + MARGIN)
        print(r, c)
        if 0 <= r < self.board_row and 0 <= c < self.board_column and self.grid[r][c] == 0:
            self.grid[r][c] = self.player
            data = {"grid":self.grid, "x":r, "y":c, "player":self.player}
            self.client_thread.cmd_q.put(ClientCommand(ClientCommand.SEND, data))
结果是包运行正常,但GUI仍然阻塞,甚至我在while循环中添加了
sleep
,只有当
gameover


我是python多线程新手,也是使用socket的pygame新手,我只写了pygame的一部分,它工作得很好,terminal+socket也很好。

你能把这个问题简化成一个问题吗?这将使人们有可能帮助你。我怀疑您的问题在于处理事件。@Eric感谢您的建议,如果您不处理,我将编辑它。您的操作系统将报告您的应用程序没有响应。这就是您所说的GUI被阻止的意思吗?不幸的是,我无法运行您的代码,因为它不完整。也许您可以让另一个线程生成事件,然后由主循环一致地处理这些事件。这表示您可以从另一个线程安全地使用。
#for event in pygame.event.get():
#    self.on_event(event)
x, y = self.random_position()
self.grid[x][y] = self.player
data = {"grid":self.grid, "x":x, "y":y, "player":self.player}
self.client_thread.cmd_q.put(ClientCommand(ClientCommand.SEND, data))