如何在python / pygame中制作按钮?

时间:2012-04-16 03:38:24

标签: python button pygame

我正在玩pygame游戏,在第一个屏幕上我希望有按钮可以按下(i)启动游戏,(ii)加载带有说明的新屏幕,以及(iii)退出程序

我已经在网上找到了这个用于按钮制作的代码,但我并不是真的理解它(我在面向对象编程方面并不擅长)。如果我能得到一些关于它正在做什么的解释那将是伟大的。此外,当我使用它并尝试使用文件路径在我的计算机上打开文件时,我得到错误sh:filepath:Permission denied,我不知道如何解决。

#load_image is used in most pygame programs for loading images
def load_image(name, colorkey=None):
    fullname = os.path.join('data', name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'Cannot load image:', fullname
        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):
    """Class used to create a button, use setCords to set 
        position of topleft corner. Method pressed() returns
        a boolean and should be called inside the input loop."""
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = load_image('button.png', -1)

    def setCords(self,x,y):
        self.rect.topleft = x,y

    def pressed(self,mouse):
        if mouse[0] > self.rect.topleft[0]:
            if mouse[1] > self.rect.topleft[1]:
                if mouse[0] < self.rect.bottomright[0]:
                    if mouse[1] < self.rect.bottomright[1]:
                        return True
                    else: return False
                else: return False
            else: return False
        else: return False
def main():
    button = Button() #Button class is created
    button.setCords(200,200) #Button is displayed at 200,200
    while 1:
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                mouse = pygame.mouse.get_pos()
                if button.pressed(mouse):   #Button's pressed method is called
                    print ('button hit')
if __name__ == '__main__': main()

感谢任何可以帮助我的人。

5 个答案:

答案 0 :(得分:12)

我没有适合你的代码示例,但我将如何做到:

  1. 创建一个Button类,使用文本将按钮作为构造函数参数
    1. 创建PyGame表面,可以是图像,也可以是填充的Rect
    2. 使用Pygame中的Font.Render内容渲染文本
  2. Blit to game screen,保存那个rect。
  3. 点击鼠标,查看mouse.get_pos()是否与矩形中的坐标相匹配,该坐标由按钮的blit返回到主曲面。
  4. 这类似于你的例子,尽管仍然不同。

答案 1 :(得分:0)

&#39;代码&#39;你在网上找到的并不是那么好。你需要做一个按钮就是这个。把它放在代码的开头附近:

def Buttonify(Picture, coords, surface):
    image = pygame.image.load(Picture)
    imagerect = image.get_rect()
    imagerect.topright = coords
    surface.blit(image,imagerect)
    return (image,imagerect)

将以下内容放入游戏循环中。也在游戏循环的某个地方:

Image = Buttonify('YOUR_PICTURE.png',THE_COORDS_OF_THE_BUTTON'S_TOP_RIGHT_CORNER, THE_NAME_OF_THE_SURFACE)

在您完成for event in pygame.event.get

的任何地方,也将其放入游戏循环中
if event.type == MOUSEBUTTONDOWN and event.button == 1:
     mouse = pygame.mouse.getpos
     if Image[1].collidrect(mouse):
        #code if button is pressed goes here

因此,buttonify会加载按钮上的图像。此图像必须是.jpg文件或与代码位于同一目录中的任何其他PICTURE文件。图片就是它的名字。该名称必须包含.jpg或其后的任何内容,并且名称必须使用引号。 Buttonify中的coords参数是从pygame打开的屏幕或窗口的右上角坐标。表面就是这个:

blahblahblah = pygame.surface.set_mode((WindowSize))
 /|\
  |
  Surface's Name

因此,该功能会生成名为“图像”的内容。这是一个pygame表面,它在它周围放了一个矩形,称为&#39; imagerect&#39; (将其设置在某个位置,然后设置为blitting时的第二个参数),然后设置它的位置,并在倒数第二个到最后一行上将其点亮。

下一段代码会使&#39; Image&#39;两个&#39;图像&#39;的元组。并且&#39; imagerect。&#39;

最后一个代码有if event.type == MOUSEBUTTONDOWN and event.button == 1:,这基本上意味着如果按下鼠标左键。此代码必须位于for event in pygame.event.get中。下一行使鼠标成为鼠标位置的元组。最后一行检查鼠标是否与Image [1]相撞,而Image [1]正如我们知道的那样是&#39; imagerect。&#39;代码如下。

告诉我是否需要进一步解释。

答案 2 :(得分:0)

所以你必须创建一个名为button的函数,它接收8个参数。 1)按钮消息 2)按钮左上角的X位置 3)按钮左上角的Y位置 4)按钮的宽度 5)按钮的高度 6)非活动颜色(背景颜色) 7)活动颜色(悬停时的颜色) 8)您要执行的操作的名称

result.data.info = {};

console.log(result.data);

result.data.info.UUID = uuid;

result.data.info.totalStressValue = totalValue;

console.log(result.data);

因此,当您创建游戏循环并调用按钮功能时:

按钮(&#34;开始&#34;,600,120,120,25,蓝色,青色,&#34;开始&#34;)

答案 3 :(得分:0)

这是我很久以前制作的按钮类: https://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl=0 据我所知,按钮是Windows 7风格,我最近无法测试它,因为我在我使用的计算机上没有pygame。希望这有帮助!

答案 4 :(得分:0)

另一种在pygame上创建按钮的好方法(在Python中)是安装名为 pygame_widgets pip3 install pygame_widgets)的软件包。

# Importing modules
import pygame as pg
import pygame_widgets as pw

# Creating screen
pg.init()
screen = pg.display.set_mode((800, 600))
running = True
button = pw.Button(
    screen, 100, 100, 300, 150, text='Hello',
    fontSize=50, margin=20,
    inactiveColour=(255, 0, 0),
    pressedColour=(0, 255, 0), radius=20,
    onClick=lambda: print('Click')
)

正在运行:

events = pg.event.get()
for event in events:
    if event.type == pg.QUIT:
        running = False
button.listen(events)
button.draw()
pg.display.update()