2012-07-10 226 views
1

我一直試圖讓這段代碼的Python代碼工作,但無濟於事。所以我試圖做的是讓我的按鈕有3個狀態:空閒,懸停和點擊。動畫按鈕

但是,由於某種原因圖像沒有改變。有人能告訴我我做錯了什麼嗎?

import pygame,sys,os 
from pygame.locals import * 

BG = "bg.jpg" 
BUTTON1 = "buttonidle.png" 
BUTTON2 = "buttonhov.png" 
BUTTON3 = "buttonclick.png" 

def load_image(name, colorkey=None): 
    fullname = os.path.join(name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error, message: 
     print "Can't load image:", name 
     raise SystemExit, message 
    image = image.convert() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 


class Button(pygame.sprite.Sprite): 

    global buttonsprite 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     if buttonsprite == 1: 
      self.image,self.rect = load_image(BUTTON1, -1) 
     screen = pygame.display.get_surface() 
     self.area = screen.get_rect() 
     self.rect.topleft = 190, 140 

     if buttonsprite == 2: 
      self.image,self.rect = load_image(BUTTON2, -1) 
     if buttonsprite == 3: 
      self.image,self.rect = load_image(BUTTON3, -1) 







buttonsprite = 1 
pygame.init() 
screen = pygame.display.set_mode((500,300)) 
pygame.display.set_caption('Window') 

background = pygame.Surface(screen.get_size()) 
background = background.convert() 
background.fill((255,255,255)) 

screen.blit(background,(0,0)) 
pygame.display.flip() 

button = Button() 
allsprites = pygame.sprite.RenderPlain((button)) 
allsprites.update() 
screen.blit(background,(0,0)) 
allsprites.draw(screen) 
pygame.display.flip() 

while True: 
    x,y = pygame.mouse.get_pos() 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
    if x >= 193 and x <= 315 and y >= 143 and y <= 171: 
     buttonsprite = 2 
     if event.type == MOUSEBUTTONDOWN: 
      buttonsprite = 3 
    else:  
     buttonsprite = 1 

謝謝!

編輯:

好的,我得到了一些幫助,我添加了更新功能。但它似乎仍然不起作用。

import pygame,sys,os 
from pygame import * 

BG = "bg.jpg" 
BUTTON1 = "buttonidle.png" 
BUTTON2 = "buttonhov.png" 
BUTTON3 = "buttonclick.png" 

buttonsprite = 1 

def load_image(name, colorkey=None): 
    fullname = os.path.join(name) 
    try: 
     image = pygame.image.load(fullname) 
    except pygame.error, message: 
     print "Can't load image:", name 
     raise SystemExit, message 
    image = image.convert() 
    if colorkey is not None: 
     if colorkey is -1: 
      colorkey = image.get_at((0,0)) 
     image.set_colorkey(colorkey, RLEACCEL) 
    return image, image.get_rect() 


class Button(pygame.sprite.Sprite): 

    global buttonsprite 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image,self.rect = load_image(BUTTON3, -1) 
     screen = pygame.display.get_surface() 
     self.area = screen.get_rect() 
     self.rect.topleft = 190, 140 

    def update(self): 
     if buttonsprite == 1: 
      self.image,self.rect = load_image(BUTTON1, -1) 
     if buttonsprite == 2: 
      self.image,self.rect = load_image(BUTTON2, -1) 
     if buttonsprite == 3: 
      self.image,self.rect = load_image(BUTTON3, -1) 




pygame.init() 
screen = pygame.display.set_mode((500,300)) 
pygame.display.set_caption('Window') 

background = pygame.Surface(screen.get_size()) 
background = background.convert() 
background.fill((255,255,255)) 

screen.blit(background,(0,0)) 
pygame.display.flip() 

button = Button() 
allsprites = pygame.sprite.RenderPlain((button)) 
allsprites.update() 
screen.blit(background,(0,0)) 
allsprites.draw(screen) 
pygame.display.flip() 

while True: 

    x,y = pygame.mouse.get_pos() 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     if event.type == MOUSEBUTTONUP: 
      if x>=193 and x<=315 and y>=143 and y<=171: 
       buttonsprite = 2 
       button.update() 
      else: 
       buttonsprite = 1 
       button.update() 
     if event.type == MOUSEBUTTONDOWN: 
      if x>=193 and x<=315 and y>=143 and y<=171: 
       buttonsprite = 3 
       button.update() 
      else: 
       pass 

回答

1

我認爲這是因爲你沒有調用某種更新函數來主動改變圖像。如果在能夠看到所需更改後重新創建按鈕。

基本上,改變價值並不足以滿足你想要做的事情,你需要讓Button知道它有一個新的價值。

壞相關的例子:

def button(): 
    global number 
    print number 

number = 1 

button() 
>>> 1   <----------------↰ 
number = 'A STRING NOW'   ↑ 
#now the printed string doesn't above change, so you'd have to call button again for it to change: 
button() 
>>> A STRING NOW # <-- BAM 
+0

謝謝,我想我取得了一些進展。但它仍然不起作用。我會在一秒鐘後發佈我的新代碼。 – 2012-07-11 00:46:46

+0

我將我的新代碼添加到原始帖子中。 – 2012-07-11 00:50:45

+0

你將不得不再次渲染圖像,類似於'allsprites = pygame.sprite.RenderPlain((button)); allsprites.update()' – TankorSmash 2012-07-11 01:35:18