繁体   English   中英

如何在python中编程按钮(没有Tkinter)?

[英]How do i program a button in python (without Tkinter)?

我最近开始学习Python3,并且尝试通过导入pygame使用Python3制作游戏。 我试图制作菜单,但与此同时有些挣扎。 我只是试图通过将矩形悬停在矩形上来改变颜色,但看起来却不起作用,从而使其看起来像一个按钮。 我已经尝试了一些方法,但是没有用。 无论如何,这里是完整的代码: hastebin链接。

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

def game_intro():
    intro = True

    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()

    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))

    smallText = pygame.font.Font('freesansbold.ttf' ,20)
    textSurf, textRect = text_objects("START!", smallText)
    textRect.center = ( (150+(100/2)), (450+(430/2)) )
    gameDisplay.blit(textSurf, textRect)

    pygame.draw.rect(gameDisplay, red, (550, 430, 100, 50))

    pygame.display.update()
    clock.tick(15)

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

这里的问题是,在该功能开始时,您只需进行一次鼠标悬停测试。 如果鼠标稍后移入矩形,则没有关系,因为您再也不需要进行测试。

您要做的就是将其移到事件循环中。 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))

看起来您只执行一次的其他一些操作也属于循环内,因此您的游戏可能仍然存在一些问题。 但这应该使您摆脱遇到的障碍,并向您展示如何开始处理其他问题。

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

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)

这是我所做的,现在可以工作:

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)

谢谢你的帮助@abarnert

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM