【问题标题】:Same callback to multiple buttons in kivy对kivy中多个按钮的相同回调
【发布时间】:2016-07-05 04:35:40
【问题描述】:

我正在尝试对多个按钮使用相同的回调,我想要返回布尔值的东西来使用回调,就像在这里完成的那样,但我找不到这样的东西。有没有办法在不为每个按钮绑定不同功能的情况下做到这一点?

import kivy
from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button

kivy.require('1.9.2')


class VelhaGame(GridLayout, Screen):
    def __init__(self, **kwargs):
        super(VelhaGame, self).__init__(**kwargs)
        self.cols = 3
        self.rows = 3
        self.font_size = 100

        self.button1 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button1)
        self.button1.bind(on_press=self.player_turn)

        self.button2 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button2)
        self.button2.bind(on_release=self.player_turn)

        self.button3 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button3)
        self.button3.bind(on_release=self.player_turn)

        self.button4 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button4)
        self.button4.bind(on_release=self.player_turn)

        self.button5 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button5)
        self.button5.bind(on_release=self.player_turn)

        self.button6 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button6)
        self.button6.bind(on_release=self.player_turn)

        self.button7 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button7)
        self.button7.bind(on_release=self.player_turn)

        self.button8 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button8)
        self.button8.bind(on_release=self.player_turn)

        self.button9 = Button(text='', font_size=self.font_size)
        self.add_widget(self.button9)
        self.button9.bind(on_release=self.player_turn)

        self.player1 = True

    def player_turn(self, *args):
        if self.player1:
            self.player1 = False
            if self.button1:
                self.button1.text = 'X'
            elif self.button2:
                self.button2.text = 'X'
            elif self.button3:
                self.button3.text = 'X'
            elif self.button4:
                self.button4.text = 'X'
            elif self.button5:
                self.button5.text = 'X'
            elif self.button6:
                self.button6.text = 'X'
            elif self.button7:
                self.button7.text = 'X'
            elif self.button8:
                self.button8.text = 'X'
            elif self.button9:
                self.button9.text = 'X'
        elif not self.player1:
            self.player1 = True
            if self.button1:
                self.button1.text = 'O'
            elif self.button2:
                self.button2.text = 'O'
            elif self.button3:
                self.button3.text = 'O'
            elif self.button4:
                self.button4.text = 'O'
            elif self.button5:
                self.button5.text = 'O'
            elif self.button6:
                self.button6.text = 'O'
            elif self.button7:
                self.button7.text = 'O'
            elif self.button8:
                self.button8.text = 'O'
            elif self.button9:
                self.button9.text = 'O'


class VelhaGameApp(App):
    def build(self):
        game = Screen()
        table_screen = VelhaGame()
        game.add_widget(table_screen)
        return game

if __name__ == '__main__':
    VelhaGameApp().run()

【问题讨论】:

    标签: python kivy python-3.5


    【解决方案1】:

    如果您发现自己在重复代码,这通常意味着您需要一个循环。此外,您要绑定的方法作为调用它的按钮的第一个参数实例接收。

    import kivy
    from kivy.app import App
    from kivy.uix.screenmanager import Screen
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.button import Button
    
    
    class VelhaGame(GridLayout, Screen):
        def __init__(self, **kwargs):
            super(VelhaGame, self).__init__(**kwargs)
            self.cols = 3
            self.rows = 3
            self.font_size = 100
    
            self.buttons = []
    
            for i in range(1, 10):
                button = Button(text='', font_size=self.font_size)
                button.bind(on_press=self.player_turn)
                self.add_widget(button)
                self.buttons.append(button)
    
            self.player1 = True
    
        def player_turn(self, instance, *args):
            if self.player1:
                self.player1 = False
                instance.text = 'X'
            elif not self.player1:
                self.player1 = True
                instance.text = '0'
    
    class VelhaGameApp(App):
        def build(self):
            game = Screen()
            table_screen = VelhaGame()
            game.add_widget(table_screen)
            return game
    
    if __name__ == '__main__':
        VelhaGameApp().run()
    

    您也可以创建Button 类的子类,但这在此处有点过头了。

    【讨论】:

    • 这对我真的很有帮助,直到现在我才知道该怎么做。我不习惯这样使用 for 循环,谢谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多