2 回答
TA贡献1866条经验 获得超5个赞
首先在应用程序循环之前对按钮进行初始化,而不是在循环中连续进行
def main():
# init buttons
alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
letter_x1, letter_y1 = 40, 375
letter_x2, letter_y2 = 40, 435
for i in range(13):
letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])
letters.append(letter_1)
letter_x1 += 60
for i in range(13, 26):
letter_2 = Button((255, 255, 255), letter_x2, letter_y2, 25, alphabet[i])
letters.append(letter_2)
letter_x2 += 60
# application loop
while run:
# [...]
给按钮添加一个属性clicked,用来存储按钮(类似于visible属性):
class Button:
def __init__(self, color, x, y, radius, text=""):
# [...]
self.visible = True
self.clicked = False
设置属性,点击按钮时:
def main():
# [...]
while run:
# [...]
for event in pygame.event.get():
# [...]
elif event.type == pygame.MOUSEBUTTONDOWN:
for letter in letters:
if letter.hover(pygame.mouse.get_pos()):
letter.clicked = True
现在您可以根据clicked按钮的状态绘制对象:
def main():
# [...]
def redraw_window():
window.fill((255, 255, 255))
window.blit(man[0], (20, 100))
# DRAWS LETTER BUTTONS
for letter in letters:
letter.draw(window, (0, 0, 0))
if letter.clicked:
# [...]
pygame.display.update()
# [...]
while run:
redraw_window()
# [...]
或者或另外,您可以将单击的最后一个按钮存储到变量 ( lastLetterClicked) 并根据变量绘制一些内容:
def main():
# [...]
def redraw_window():
# [...]
if lastLetterClicked:
# [...]
pygame.display.update()
lastLetterClicked = None
while run:
redraw_window()
# [...]
for event in pygame.event.get():
# [...]
elif event.type == pygame.MOUSEBUTTONDOWN:
for letter in letters:
if letter.hover(pygame.mouse.get_pos()):
# [...]
lastLetterClicked = letter
# [...]
TA贡献1847条经验 获得超11个赞
好的,让我们从第一个开始,我怀疑这里的一些变化也可能有助于解决其他问题。nonice,您正在“while run”循环中创建“初始彩色按钮”,这意味着它会一次又一次地发生,但是您在事件循环中对按钮进行了重新染色,这仅在出现新事件时才会发生。你看到问题了吗?悬停事件发生后的下一分钟,程序将绘制一个常规按钮!我会说这条线
letter.color = (0, 255, 0)
在 OOP 中被认为是一个坏习惯,因为您不想在类之外更改对象属性。相反,让我们构建一个“set_color”方法
def set_color(self , color): self.color = color
并启动按钮 letter_1 = Button((255, 255, 255), letter_x1, letter_y1, 25, alphabet[i])
在游戏开始之前,在 while 运行循环之外
在 while 循环中你可以只添加一个循环来绘制它们。
for letrer in letters: letter.draw()
添加回答
举报