(Python)在线程中关闭pygame.display

(Python)在线程中关闭pygame.display,python,multithreading,pygame,Python,Multithreading,Pygame,我正在尝试创建一个线程,该线程将在我的程序的后台连续运行,并检查用户是否按下了窗口右上角的X按钮,如果用户确实按下了该按钮,则退出该程序。这样,无论发生什么,用户都可以随时关闭程序 我不知道线是怎么工作的,所以请容忍我。下面是我的代码的简化版本,但它不起作用: from threading import Thread import pygame, sys def checkForQuit(): while True: for event in pygame.event.

我正在尝试创建一个线程,该线程将在我的程序的后台连续运行,并检查用户是否按下了窗口右上角的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()
我的代码现在的问题是,当我运行它时,程序无法判断是否按下了关闭按钮,窗口会一直挂起,直到崩溃。我不确定是否有更简单的方法来完成我的任务


我试图寻找一个类似的问题,但我也不知道我在寻找什么。感谢您的帮助:)

通常您可以通过这种方式关闭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()

我认为这是一个XY问题。为什么要在另一个线程上检查退出事件?顺便说一下,必须在主线程上调用pygame.event.get(),否则它将无法正常工作。