Как сделать кнопки в python / 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()

Спасибо всем, кто может мне помочь.


person user1334014    schedule 16.04.2012    source источник


Ответы (5)


У меня нет для вас примера кода, но я бы сделал следующее:

  1. Make a Button class, with the text to go on the button as a constructor argument
    1. Create a PyGame surface, either of an image or filled Rect
    2. Визуализируйте текст на нем с помощью материала Font.Render в Pygame
  2. Перейдите на игровой экран, сохраните этот прямоугольник.
  3. При щелчке мыши убедитесь, что mouse.get_pos () совпадает с координатами в прямоугольнике, которые она вернула при нажатии кнопки на основную поверхность.

Это похоже на то, что делает ваш пример, хотя все еще отличается.

person TankorSmash    schedule 16.04.2012

«Код», который вы нашли в Интернете, не так хорош. Все, что вам нужно, чтобы сделать пуговицу, - это это. Поместите это в начало вашего кода:

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 или что-нибудь еще, а имя должно быть заключено в кавычки. Параметр coords в Buttonify - это координата в правом верхнем углу экрана или окна, которое открывается из pygame. Поверхность такая:

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

Таким образом, если функция создает что-то под названием 'image', которое является поверхностью pygame, она помещает вокруг него прямоугольник с именем 'imagerect' (чтобы установить его в местоположении и для второго параметра при блиттинге), а затем устанавливает его местоположение и переносит его на предпоследнюю строку.

Следующий фрагмент кода превращает Image в кортеж из image и imagerect.

Последний код имеет if event.type == MOUSEBUTTONDOWN and event.button == 1:, что в основном означает нажатие левой кнопки мыши. Этот код ДОЛЖЕН быть в for event in pygame.event.get. Следующая строка делает мышь кортежем положения мыши. Последняя строка проверяет, не столкнулась ли мышь с изображением [1], которое, как мы знаем, является «правильным с изображением». Код следует за этим.

Скажите, если мне нужно пояснить дальше.

person SnootierBaBoon    schedule 31.03.2017

Еще один хороший способ создания кнопок в 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()
person PranavKarthik    schedule 16.07.2020

Итак, вам нужно создать функцию с именем button, которая получает 8 параметров. 1) Сообщение кнопки 2) Положение X левого верхнего угла кнопки 3) Положение Y левого верхнего угла кнопки 4) Ширина кнопки 5) Высота кнопки 6) Неактивный цвет (цвет фона) 7) Активный цвет (цвет при наведении) 8) Название действия, которое вы хотите выполнить

def button (msg, x, y, w, h, ic, ac, action=None ):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if (x+w > mouse[0] > x) and (y+h > mouse[1] > y):
        pygame.draw.rect(watercycle, CYAN, (x, y, w, h))
        if (click[0] == 1 and action != None):
            if  (action == "Start"):
                game_loop()
            elif  (action == "Load"):
                 ##Function that makes the loading of the saved file##
            elif  (action == "Exit"):
                pygame.quit()

    else:
        pygame.draw.rect(watercycle, BLUE, (x, y, w, h))
        smallText = pygame.font.Font("freesansbold.ttf", 20)
        textSurf, textRect = text_objects(msg, smallText)
        textRect.center = ( (x+(w/2)), (y+(h/2)) )
        watercycle.blit(textSurf, textRect)

Итак, когда вы создаете игровой цикл и вызываете функцию кнопки:

кнопка («Старт», 600, 120, 120, 25, СИНИЙ, ГОЛУБОЙ, «Старт»)

person Scorp Y    schedule 20.07.2017

Вот класс для кнопки, которую я сделал много лет назад: https://www.dropbox.com/s/iq5djllnz0tncc1/button.py?dl=0 Насколько я помню, кнопка выполнена в стиле Windows 7, и я не мог проверить ее недавно, потому что у меня нет pygame на компьютер, который я использую. Надеюсь это поможет!

person Benjie    schedule 20.07.2017