2016-04-29 91 views
0

我正在開發一個程序,允許用戶創建和編輯Pygame中的GUI。該程序本身將有一個很好的圖形用戶界面,爲此我正在製作一個模塊來簡化它的創建。雖然現在一切正常,但我卻遇到了一個我根本無法解決的問題,都不明白:更新Pygame中的顯示問題

當我啓動程序時會出現一個黑色窗口。問題是窗戶應該是白色的,並且包含一個帶有圖像的黑色矩形。我嘗試點擊它並移動它,但它沒有顯示任何東西。

首先,我以爲我沒有更新窗口,但我檢查了腳本,發現我做了。然後我開始用窗口嘗試不同的東西,發現只有出現在我的實際屏幕(顯示器)上的窗口部分得到更新,並且在我將其拖出並返回屏幕時立即更新。

有人可以解釋我發生了什麼,爲什麼會發生,我該如何解決?

編輯

我發現窗口也將更新正確,如果我將其最小化,然後最大化。所以這個問題並不那麼重要,但它非常煩人。

下面是代碼:

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

回答

0

您的代碼中存在一些錯誤。

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

  2. 您應該在主循環的每次迭代中始終調用pygame.event.get。

  3. 不要使用time.sleep,使用pygame.time.clock.tick

+0

你是對的。我不更新循環中的顯示,但我更新它之前。從我的經驗,我知道,這應該也是一樣。至於調用pygame.event.get(),我會的。如果你看看我的代碼,你可以看到我調用engine.start()來啓動循環。在它中,我在每次迭代中調用self.update_events()。儘管如此,我所得到的行爲是一種我從未有過的行爲。 – Cosinux

+0

不,如果你想能夠在窗口周圍拖動,你必須在每次迭代中更新屏幕。沒有辦法繞過它 – Fredrik

+0

我可以拖動它。但圖像不會顯示出來。它一直如此。無論是不斷更新屏幕還是隻是一次。 – Cosinux