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()
添加回答
舉報
