如何编写python中的按钮(没有Tkinter)?

时间:2018-03-24 18:53:16

标签: python python-3.x pygame

我最近开始学习Python3,我试图通过导入onload来使用Python3制作游戏。我试着做一个菜单,我正在努力解决它。我只是试图让它看起来像一个按钮,当你将鼠标悬停在它上面时让矩形改变颜色,但它不起作用。我已经尝试了一些东西,但它不起作用。无论如何这里是完整的代码:hastebin link.

这是我尝试制作按钮的部分:

pygame

3 个答案:

答案 0 :(得分:2)

这里的问题是你只在函数开始时进行一次鼠标悬停测试。如果鼠标稍后移动到您的矩形中,则无关紧要,因为您再也不会进行测试。

您要做的是将其移至事件循环中。 PyGame事件循环中的一个棘手问题是每个事件要运行一次的代码(内部for event in…循环),并且每个批次只需要运行一次(外部while intro循环)。在这里,我假设您希望每次活动都这样做一次。所以:

def game_intro():
    intro = True

    # ... other setup stuff 

    while intro:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()

            mouse = pygame.mouse.get_pos()

            if 150+100 > mouse[0] > 150 and 430+50 > mouse[1] > 430:
                pygame.draw.rect(gameDisplay, bright_green, (150,430,100,50))
            else:
                pygame.draw.rect(gameDisplay, green, (150, 430, 100, 50))

看起来你做的其他一些东西也只属于循环内部,所以你的游戏可能仍有一些问题。但这应该会让你超越你所困扰的障碍,并向你展示如何开始解决其他问题。

答案 1 :(得分:1)

这是一个符合您需求的按钮:

class Button(object):
    global screen_width,screen_height,screen
    def __init__(self,x,y,width,height,text_color,background_color,text):
        self.rect=pygame.Rect(x,y,width,height)
        self.x=x
        self.y=y
        self.width=width
        self.height=height
        self.text=text
        self.text_color=text_color
        self.background_color=background_color

    def check(self):
        return self.rect.collidepoint(pygame.mouse.get_pos())

    def draw(self):
        pygame.draw.rect(screen, self.background_color,(self.rect),0)
        drawTextcenter(self.text,font,screen,self.x+self.width/2,self.y+self.height/2,self.text_color)  
        pygame.draw.rect(screen,self.text_color,self.rect,3)

使用绘图功能绘制按钮,并使用检查功能查看按钮是否被按下。

实现为主循环:

button=Button(x,y,width,height,text_color,background_color,text)
while not done:
    for event in pygame.event.get():
            if event.type==QUIT:
                terminate()
            elif event.type==pygame.MOUSEBUTTONDOWN:
                if button.check():
                       #what to do when button is pressed

    #fill screen with background
    screen.fill(background)

    button.draw()

    pygame.display.flip()
    clock.tick(fps)

答案 2 :(得分:1)

This is what i did and it works now:

def game_intro():
    intro = True

    while intro:
        for event in pygame.event.get():
            # print(event)
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

    gameDisplay.fill(white)
    largeText = pygame.font.Font('freesansbold.ttf', 90)
    TextSurf, TextRect = text_objects("Run Abush Run!", largeText)
    TextRect.center = ((display_width / 2), (display_height / 2))
    gameDisplay.blit(TextSurf, TextRect)

    mouse = pygame.mouse.get_pos()

    # print(mouse)

    if 150 + 100 > mouse[0] > 150 and 450 + 50 > mouse[1] > 450:
        pygame.draw.rect(gameDisplay, bright_green, (150, 450, 100, 50))
    else:
        pygame.draw.rect(gameDisplay, green, (150, 450, 100, 50))
    pygame.draw.rect(gameDisplay, red, (550, 450, 100, 50))
    pygame.display.update()
    clock.tick(15)

Thank you for the help @abarnert