【问题标题】:Kivy make button in grid blinkKivy 使网格中的按钮闪烁
【发布时间】:2014-04-17 20:57:06
【问题描述】:

我为此尝试了多种不同的解决方案,但我没有想法。我是 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()

【问题讨论】:

    标签: python kivy


    【解决方案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()
    

    这只会使第一个按钮闪烁,但我相信您可以扩展它以完全按照您的意愿行事。

    您可能会发现使用颜色重置功能创建自己的按钮子类最简洁,而不是每次都创建一个新函数。

    【讨论】:

    • 谢谢。这使正方形像我想要的那样闪烁。现在我只需要弄清楚如何让它在没有任何点击的情况下做到这一点。 (基本上我希望它播放模式,以便玩家可以重复该模式)。你的建议应该很容易。然而,我对函数内部的函数有点困惑。
    • 我使用 functools.partial 添加了一个替代方法
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多