在Pygame

时间:2016-04-29 17:32:53

标签: python user-interface pygame

我正在开发一个程序,允许用户创建和编辑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()

以下是截图:

当我启动程序时: enter image description here

当我将窗口拉出屏幕时: enter image description here

当我把它拉回来时: enter image description here

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。

  1. 您不会更新主循环中的屏幕。

  2. 您应该始终在主循环的每次迭代中调用pygame.event.get。

  3. 请勿使用time.sleep,请使用pygame.time.clock.tick