按钮不打印任何东西

时间:2016-06-30 04:10:34

标签: python button pygame

我为我的按钮创建了一个功能。我试图让它每次点击运行一次所以我在pygame.event.get()和pygame.MOUSEBUTTONDOWN中集成了事件的行,所以它将注册一次点击,运行一次然后停止直到下一次点击。但现在它根本不起作用。 1.我怎么让它运行 2.如何确保每次点击运行一次,然后重置直到下次点击为止。请显示示例

以下是代码:

def Button(msg, x, y, w, h, ic, ac, action=None):
    mouse = pygame.mouse.get_pos()    
        if x+w > mouse[0] > x and y+h > mouse[1] > y:
            pygame.draw.rect(window, ac, (x, y, w, h)) 
            for event in pygame.event.get():
                if event.type == pygame.MOUSEBUTTONDOWN:
                    pygame.draw.rect(window, lightgrey, (x, y, w, h))
                    if action == "undo":
                        print("hey") 
                    if action == "reset":
                        for row in range(6):
                            for column in range(7):
                                board[row][column] = 0          
                    elif action == "quit":
                        pygame.quit()
                        quit() 

1 个答案:

答案 0 :(得分:0)

您不想检查Button功能中的事件队列,而是检查主游戏循环中的某个位置,然后在发生单击时调用Button功能。它也让我觉得你的Button功能可能更合理地实现为具有不同方法的Button类,例如onClick

这是一个带有按钮类和两个按钮的代码的小例子:

import pygame
from pygame.locals import *

# Screen size
SCREEN_HEIGHT = 350
SCREEN_WIDTH = 500

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREY = (150, 150, 150)
RED = (255,0,0)


# our Button class
class Button(object):
    def __init__(self, msg, x, y, w, h, col, action=None):
        self.msg = msg
        self.rect = pygame.Rect(x, y, w, h)
        self.color = col
        self.action = action  # function that will be called on click

    def draw(self, surface):
        pygame.draw.rect(surface, self.color, self.rect)

    def onClick(self, event):
        # check whether the click was on the button
        if self.rect.collidepoint(event.pos):
            print("Button", self.msg, "clicked!")
            # if an action has been set, do that action
            if self.action:
                self.action()


# initialisation
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
done = False
clock = pygame.time.Clock()

# list to keep track of our buttons
buttons = []


# define an undo function (will be passed to a button)
def undo():
    print("I'm an undo function!")

# fill screen with background
screen.fill(WHITE)

# button with no function
btn1 = Button("btn1", 50, 50, 50, 50, GREY)
btn1.draw(screen)
buttons.append(btn1)

# button with an undo function
btn2 = Button("btn2", 150, 50, 50, 50, RED, undo)
btn2.draw(screen)
buttons.append(btn2)

pygame.display.update()

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == MOUSEBUTTONDOWN:  # mouse was clicked
            # check for every button whether the mouse click was on the button
            for button in buttons:
                button.onClick(event)

    # do whatever else needs doing

    pygame.display.flip()  #update display (currently not strictly necessary)

    clock.tick(60)  # ensures a maximum of 60 frames per second

pygame.quit()

Button对象有一个矩形。我们使用它来绘制按钮(用指定的按钮颜色填充),并检查鼠标点击何时发生是否单击按钮矩形,这意味着单击了按钮。该消息当前仅用于在单击按钮时输出按钮的名称,但您可以使用该按钮在按钮上呈现文本或其他任何需要的文本。

按钮也可以具有与之关联的功能。单击按钮时会调用此函数。 Python的一个好处是你可以将函数作为参数传递,因此你不必在Button类中指定单击一个按钮时可能采取的操作。而是在需要创建新Button时定义该函数。这使您的代码非常通用。您可以使用简单的字符串替换该部分,然后在self.action()中调用onClick,而不是像发布的代码段那样执行if else个案例。

然后在我们的主类中,我们初始化pygame,然后创建两个按钮(一个灰色没有功能,一个红色带有撤销功能)。为了更容易跟踪它们,我们将它们放在一个列表中,我们可以在以后迭代它。

现在在我们的主游戏循环中,我们检查事件队列中的任何事件,如果发生了某些事件,我们会处理它们。如果单击鼠标,我们将遍历列表中的所有按钮并调用onClick。然后每个按钮检查他们的onClick方法是否鼠标单击是否在按钮矩形内,如果是,则执行指定的功能(以及输出调试打印语句)。您可以将onClick功能修改为单击按钮时需要执行的操作,例如更改按钮的颜色。

如果您还需要在游戏中跟踪其他事件,请使用与我们已完成的主事件队列相同的方式处理它们。然后,做你需要做的其他事情,比如移动精灵或重新绘制已经改变的部分屏幕。