在Pygame全屏窗口中跳出标签而不会崩溃

时间:2018-08-21 20:37:14

标签: python pygame

因此,我正在使用Pygame为正在编写的程序创建精美的显示。我选择Pygame是因为它很容易上手,并且在动画方面做得很好。我希望显示屏尽可能大,以便可以显示尽可能多的信息。但是,这是一个关键,我仍然希望能够进入程序的控制台。

Pygame将全屏窗口强制显示在最前面,因此您无法将其弹出,将窗口移至另一个Windows桌面会导致显示崩溃。我会做一个关键技巧来切换pygame模式,但是由于程序的线程化方式,我无法使用pygame.event.get()。

是否可以将其设置为全屏窗口,以便我可以跳出并保留在后台?我真的不希望它只是一个普通的窗口,因为它不是那样大。

在我跳出并重新进入后,显示崩溃,如下所示: enter image description here 我还得到一个非零的退出代码:-805306369(0xCFFFFFFF)

这是代码的细分版本,仍然给我这个错误,您会发现如果这是您的完整程序,则此处没有某些内容,但是我想保留尽可能多的体系结构我可以。

import pygame
import os

BACKGROUND = (9, 17, 27)

os.environ['SDL_VIDEO_WINDOW_POS'] = "0,0"
pygame.init()
pygame.font.init()

infoObject = pygame.display.Info()
SIZE = (infoObject.current_w, infoObject.current_h)
X_CENTER = SIZE[0]/2
Y_CENTER = SIZE[1]/2

# create a borderless window that's as big as the entire screen
SCREEN = pygame.display.set_mode((SIZE[0], SIZE[1]), pygame.NOFRAME)
clock = pygame.time.Clock()

TextFont = pygame.font.SysFont('Courant', 30)


class DisplayState:

    state = type(bool)

    def __init__(self):
        self.state = True

    def get_state(self):
        return self.state

    def change_state(self, new_state):
        self.state = new_state


def main(display_state_object):

    running = True

    while running:
        if display_state_object.get_state():
            SCREEN.fill(BACKGROUND)
            pygame.display.flip()
        else:
            return 1
    return

if __name__ == "__main__":
    main(DisplayState())

编辑

我认为这是一个多线程问题!看到以下代码:

产生错误

def start_display():
     display(params)

def display(params):
     pygame loop

if __name__ == "__main__":
     display_thread = threading.Thread(target=start_display)
     display_thread.start()

不产生错误

def display(params):
     pygame loop

if __name__ == "__main__":
     display_thread = threading.Thread(target=display(params))
     display_thread.start
     # marker

该版本确实存在问题,该程序似乎未在线程外继续前进(即,从未到达标记)。这是线程库的工作方式吗?它可以解释为什么我要有中间人功能。也许这是一个不同的问题,值得提出自己的问题吗?

编辑

像这样设置线程可以使主线程继续执行,但会带来pygame错误:

threading.Thread(target=display, args=(DisplayState(),))

2 个答案:

答案 0 :(得分:3)

使用真正的全屏模式在Windows / sdl上没有简单的方法,而解决此问题的常用方法是使用无边界窗口。

以下是在pygame中创建此类“假”全屏窗口的方法:

import pygame
import os  

# you can control the starting position of the window with the SDL_VIDEO_WINDOW_POS variable
os.environ['SDL_VIDEO_WINDOW_POS'] = "0,0"
pygame.init()

# now let's see how big our screen is
info = pygame.display.Info()

# and create a borderless window that's as big as the entire screen
screen = pygame.display.set_mode((info.current_w, info.current_h), pygame.NOFRAME)

答案 1 :(得分:1)

您必须每帧调用pygame事件函数之一(例如pygame.event.pump()pygame.event.get()),否则窗口将无响应,并且程序似乎崩溃了。如果您调用这些功能之一,则应该能够按Alt + Tab(在Windows中)返回桌面而不会导致程序崩溃(如果选择了桌面,则该窗口将被最小化;如果选择了另一个窗口,它将被带到最前面)。

def main(display_state_object):

    running = True

    while running:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                # Press Esc to quit.
                if event.key == pygame.K_ESCAPE:
                    running = False

        if display_state_object.get_state():
            SCREEN.fill(BACKGROUND)
            pygame.display.flip()
        else:
            return 1
    return