python - (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()
我的代码现在的问题是,当我运行它时,程序无法判断是否按下了关闭按钮,并且窗口一直挂起直到它崩溃。我不确定是否有更简单的方法来完成我的任务。
我试过搜索类似的问题,但我也不知道我在找什么。任何帮助表示赞赏:)
解决方案
通常你以这种方式关闭 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()
推荐阅读
- google-apps-script - 如果所有列均为空白,则隐藏行 Google 表格应用脚本
- c# - 无法从 Azure Blob 流式传输图片
- node.js - 微服务 - 每个 CRUD 是否提供一项服务
- mongodb - 如果另一个数组的最后一个元素满足条件,Mongo如何更新字段
- django - Django:遍历模型名称
- css - CSS 灰度遮罩
- android - 迁移到 FCM 和 Android O - 启动 IntentService 仍然有效吗?
- arguments - 将参数称为“开关”或“标志”时是否有任何区别?
- cordova - 科尔多瓦应用程序中的 Ajax 请求
- php - Stripe:我在哪里可以获得成功或错误的付款?