首页 > 解决方案 > (Python) 在线程中关闭 pygame.display

问题描述

我正在尝试创建一个将在我的程序后台连续运行的线程,并检查用户是否按下了窗口右上角的 X 按钮,如果他们按下了它,则退出程序。这样,无论发生什么,用户都可以随时关闭程序。

我对线程的工作方式不熟悉,所以请多多包涵。这是我的代码的简化版本,它不起作用:

from threading import Thread
import pygame, sys

def checkForQuit():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        pygame.time.wait(100) # 100ms

if __name__ == "__main__":
    screen = pygame.display.set_mode((300, 300))
    quitThread = Thread(target = checkForQuit)
    quitThread.start()

我的代码现在的问题是,当我运行它时,程序无法判断是否按下了关闭按钮,并且窗口一直挂起直到它崩溃。我不确定是否有更简单的方法来完成我的任务。

我试过搜索类似的问题,但我也不知道我在找什么。任何帮助表示赞赏:)

标签: pythonmultithreadingpygame

解决方案


通常你以这种方式关闭 pygame。它不应该有线程。由于始终检查 pygame 循环中的 pygame 事件,因此 pygame.QUIT 事件将始终在用户关闭其窗口时执行。

import pygame, sys

def main():
    pygame.init()
    screen = pygame.display.set_mode((300, 300))
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

if __name__ == "__main__":
    main()

如果你想用线程关闭它,你可以试试这样。

import threading
import pygame
import sys

def main():
    pygame.init()
    screen = pygame.display.set_mode((300, 300))
    global running
    running = True

    def programCheck():
        while True:
            if not running:
                sys.exit(0)
    t = threading.Thread(target=programCheck)
    t.start()

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                running = False

if __name__ == "__main__":
    main()

推荐阅读