因此,我正在使用Pygame为正在编写的程序创建精美的显示。我选择Pygame是因为它很容易上手,并且在动画方面做得很好。我希望显示屏尽可能大,以便可以显示尽可能多的信息。但是,这是一个关键,我仍然希望能够进入程序的控制台。
Pygame将全屏窗口强制显示在最前面,因此您无法将其弹出,将窗口移至另一个Windows桌面会导致显示崩溃。我会做一个关键技巧来切换pygame模式,但是由于程序的线程化方式,我无法使用pygame.event.get()。
是否可以将其设置为全屏窗口,以便我可以跳出并保留在后台?我真的不希望它只是一个普通的窗口,因为它不是那样大。
在我跳出并重新进入后,显示崩溃,如下所示: 我还得到一个非零的退出代码:-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(),))
答案 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