我正在开发一个程序,允许用户创建和编辑Pygame中的GUI。程序本身将有一个很好的GUI,为此我正在制作一个模块来简化它的创建。虽然现在其他所有工作都按照我的预期运作,但我正在解决一个我无法解决的问题,也不理解:
当我启动程序时,会出现一个黑色窗口。问题是窗口应该是白色的,并且包含一个带有图像的黑色矩形。我试着点击它并移动它,但它没有显示任何东西。
首先,我认为我没有更新窗口,但我检查了脚本,发现我做了。然后我开始尝试使用窗口进行不同的操作,发现只有退出实际屏幕(监视器)的窗口部分才会更新,并且在我将其拖出屏幕后立即更新。
有人可以解释一下发生了什么,为什么会发生这种情况以及如何解决它?
修改
我发现如果我最小化它然后最大化它,窗口也会正确更新。所以这个问题不是那么重要,但却非常烦人。
以下是代码:
import pygame
import time
def initialize():
global display
global screen
pygame.init()
display = pygame.display
screen = None
class Screen():
def __init__(self, size, color=[255, 255, 255]):
global screen
self.size = size
self.color = color
self.screen = display.set_mode(self.size)
self.fill(self.color)
self.update()
screen = self
def update(self, rectangle=None):
display.update(rectangle)
def fill(self, color, rectangle=None):
self.screen.fill(color, rectangle)
def draw(self, sprite):
self.screen.blit(sprite.image, sprite.rectangle[0])
class Engine():
def __init__(self):
self.events = []
self.running = False
def update_events(self):
self.events += pygame.event.get()
def get_events(self):
events = self.events
self.events = []
return events
def start(self, function=None, args=[], kwargs={}, frequency=21, function_first=False):
self.running = True
while self.running:
if function_first and function:
function(*args, **kwargs)
self.update_events()
if not function:
for event in self.events:
if event.type == pygame.QUIT:
self.running = False
pygame.quit()
break
if not function_first and function:
function(*args, **kwargs)
if self.running:
tick = 1.0 / frequency
time.sleep(tick)
def stop(self):
self.running = False
class Sprite():
def __init__(self, rectangle, color=[0, 0, 0]):
self.rectangle = rectangle
self.color = color
self.image = None
def update(self):
global screen
screen.fill(self.color, self.rectangle)
screen.draw(self)
def load_image(self, image):
self.image = pygame.image.load(image).convert()
if __name__ == "__main__":
initialize()
s = Screen([500, 500])
e = Engine()
sprite = Sprite([[10, 10], [200, 200]])
sprite.load_image("test.png")
sprite.update()
s.update()
e.start()
以下是截图:
答案 0 :(得分:0)
您的代码中存在一些错误。
您不会更新主循环中的屏幕。
您应该始终在主循环的每次迭代中调用pygame.event.get。
请勿使用time.sleep,请使用pygame.time.clock.tick