Kivy 实现网格中按钮闪烁

0 投票
1 回答
1761 浏览
提问于 2025-04-18 03:11

我试过很多不同的方法,但现在真的没主意了。我刚开始接触Kivy,还在学习中。我正在制作一个非常简单的记忆游戏。我需要网格中的按钮按照特定的顺序闪烁。我相信我能做到这一点,但我就是不知道怎么让其中一个按钮闪烁。有没有人能给我指个方向?我知道我只需要让它的颜色变一下,持续一秒钟,然后再变回来。

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from random import random
import time


class MemorizeGame(GridLayout):
    def __init__(self, **kwargs):
        super(MemorizeLayout, self).__init__(**kwargs)
        self.cols = 2

        #create buttons
        self.button1 = Button(text='', background_color=(0,0,1,1))
        self.button2 = Button(text='', background_color=(0,1,1,1))
        self.button3 = Button(text='', background_color=(1,0,1,1))
        self.button4 = Button(text='', background_color=(0,1,0,1))
        self.buttonList = [self.button1, self.button2, self.button3, self.button4]

        #add buttons to the screen
        for button in self.buttonList:
            self.add_widget(button)

    def blinkSquare(self):
        #logic to make a square blink

class MemorizeApp(App):

    def build(self):
        game= MemorizeGame()
        return game

if __name__ == "__main__":
    MemorizeApp().run()

1 个回答

1

这里有一个使用kivy的时钟来实现的例子。

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from random import random
import time

from kivy.clock import Clock
from functools import partial

def set_color(button, color, *args):
    button.color = color

class MemorizeGame(GridLayout):
    def __init__(self, **kwargs):
        super(MemorizeGame, self).__init__(**kwargs)
        self.cols = 2

        #create buttons                                                                                                                                                                                                            
        self.button1 = Button(text='', background_color=(0,0,1,1))
        self.button2 = Button(text='', background_color=(0,1,1,1))
        self.button3 = Button(text='', background_color=(1,0,1,1))
        self.button4 = Button(text='', background_color=(0,1,0,1))
        self.buttonList = [self.button1, self.button2, self.button3, self.button4]

        #add buttons to the screen                                                                                                                                                                                                 
        for button in self.buttonList:
            self.add_widget(button)

    def blinkSquare(self):
        self.button1.background_color = (1, 1, 1, 1)
        def reset_color(*args):
            self.button1.background_color = (0, 0, 1, 1)
        Clock.schedule_once(reset_color, 1)

        # alternative:
        # Clock.schedule_once(partial(set_color, self.button1, (0, 0, 1, 1)))

    def on_touch_down(self, touch):
        self.blinkSquare()


class MemorizeApp(App):

    def build(self):
        game= MemorizeGame()
        return game

if __name__ == "__main__":
    MemorizeApp().run()

这个例子只是让第一个按钮闪烁,但我相信你可以把它扩展到实现你想要的效果。

你可能会觉得,创建一个自己的按钮子类,并加入颜色重置的功能,会比每次都写一个新函数要更整洁。

撰写回答