(Python) Закрытие pygame.display в теме - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать поток, который будет непрерывно работать в фоновом режиме моей программы, и проверить, нажал ли пользователь кнопку 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()

Проблема с моим кодом сейчас заключается в том, что когда я его запускаю, программа не может определить, была ли нажата кнопка закрытия или нет, и окно висит, пока не падает.Я не уверен, есть ли более простой способ выполнить мою задачу.

Я пытался найти похожий вопрос, но я также не знаю, что я ищу.Любая помощь приветствуется:)

1 Ответ

0 голосов
/ 11 февраля 2019

Обычно вы закрываете 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...