Python Kivy绑定到on#u属性不';好像不行

Python Kivy绑定到on#u属性不';好像不行,python,binding,kivy,Python,Binding,Kivy,基本上,我有一个带有正方形的网格,我跟踪每个正方形上哪些正方形被布尔属性占据。下面是我代码中所有我声明为“已占用”属性的位置的简化版本: class Board(GridLayout): def __init__(self): super().__init__() self.cols = 4 self.grid = [] self.create_slots() def create_slots(self):

基本上,我有一个带有正方形的网格,我跟踪每个正方形上哪些正方形被布尔属性占据。下面是我代码中所有我声明为“已占用”属性的位置的简化版本:

class Board(GridLayout):
    def __init__(self):
        super().__init__()
        self.cols = 4
        self.grid = []
        self.create_slots()




    def create_slots(self):
        for i in range(10):
            self.grid.append([])
            for j in range(4):
                temp = Square(i,j, "sideboard")
                self.grid[i].append(temp)
                self.add_widget(temp)
                temp.bind(on_occupied = self.do_a_thing)


    def do_a_thing(self):
        for square in self.children:
            #do a thing

class Square(Button):
    def __init__(self, row, col, type):
        self.row = row
        self.col = col
        self.id = str(self.row) + "," + str(self.col)
        self.type = type
        self.occupied = BooleanProperty(False)
        super().__init__()
我的目标是绑定“do_a_thing”方法,以便在每次正方形的“已占用”属性值更改时调用该方法。因为Square类在我的应用程序的其他地方使用,所以我不想为kivy语言中占用的on_设置回调,我希望避免创建Square子类只是为了更改一个绑定


当我运行代码时,它不会抛出任何错误,并且我已经验证了“已占用”属性确实发生了更改。但是“做一件事”的方法永远不会被解雇。有人能告诉我我做错了什么吗?

请注意,对于属性
my\u属性
,更改事件也被称为
my\u属性
。回调函数接收两个参数:,如中所示。此外,如果该类在
propertyname
上有一个名为
的方法,则也将调用该方法。
下面是一个对我有用的独立示例:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.properties import BooleanProperty

class Board(GridLayout):
    def __init__(self, **kwargs):
        super(Board, self).__init__(**kwargs)
        for i in range(10):
            self.add_widget(Square())
        for square in self.children:
            print square
            square.bind(occupied=self.do_a_thing)

    def do_a_thing(self, *args):
        print "hello from {}, new state: {}".format(*args)
        for square in self.children:
            pass
            #do a thing

class Square(Button):
     occupied = BooleanProperty(False)
     def on_occupied(self, *args):
         print "Callback defined in class: from {} state {}".format(*args)


class mApp(App):
    def build(self):
        return Builder.load_string("""
Board:
    cols: 4
    rows: 3
<Square>:
    on_press: self.occupied = ~self.occupied
""")
mApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.button导入按钮
从kivy.properties导入布尔属性
课程板(网格布局):
定义初始(自我,**kwargs):
超级(董事会,自我)。\uuuuu初始值(**kwargs)
对于范围(10)内的i:
self.add_小部件(Square())
对于square in self.children:
印刷方格
square.bind(占用=自己做一件事)
def do__a__事情(self,*args):
打印“hello from{},新状态:{}”。格式(*args)
对于square in self.children:
通过
#做一件事
班级广场(按钮):
占用=布尔属性(False)
def on_已占用(自身,*参数):
打印“类中定义的回调:从{}状态{}”。格式(*args)
类mApp(应用程序):
def生成(自):
返回生成器。加载字符串(“”)
董事会:
科尔斯:4
行数:3
:
按:self.occulated=~self.occulated
""")
mApp().run()

请注意,对于属性
my\u属性
,更改事件也被称为
my\u属性
。回调函数接收两个参数:,如中所示。此外,如果该类在
propertyname
上有一个名为
的方法,则也将调用该方法。
下面是一个对我有用的独立示例:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.properties import BooleanProperty

class Board(GridLayout):
    def __init__(self, **kwargs):
        super(Board, self).__init__(**kwargs)
        for i in range(10):
            self.add_widget(Square())
        for square in self.children:
            print square
            square.bind(occupied=self.do_a_thing)

    def do_a_thing(self, *args):
        print "hello from {}, new state: {}".format(*args)
        for square in self.children:
            pass
            #do a thing

class Square(Button):
     occupied = BooleanProperty(False)
     def on_occupied(self, *args):
         print "Callback defined in class: from {} state {}".format(*args)


class mApp(App):
    def build(self):
        return Builder.load_string("""
Board:
    cols: 4
    rows: 3
<Square>:
    on_press: self.occupied = ~self.occupied
""")
mApp().run()
从kivy.app导入应用
从kivy.lang导入生成器
从kivy.uix.gridlayout导入gridlayout
从kivy.uix.button导入按钮
从kivy.properties导入布尔属性
课程板(网格布局):
定义初始(自我,**kwargs):
超级(董事会,自我)。\uuuuu初始值(**kwargs)
对于范围(10)内的i:
self.add_小部件(Square())
对于square in self.children:
印刷方格
square.bind(占用=自己做一件事)
def do__a__事情(self,*args):
打印“hello from{},新状态:{}”。格式(*args)
对于square in self.children:
通过
#做一件事
班级广场(按钮):
占用=布尔属性(False)
def on_已占用(自身,*参数):
打印“类中定义的回调:从{}状态{}”。格式(*args)
类mApp(应用程序):
def生成(自):
返回生成器。加载字符串(“”)
董事会:
科尔斯:4
行数:3
:
按:self.occulated=~self.occulated
""")
mApp().run()


Bind to
occulated
(我以前犯过这个错误)嗯,@zeemonkez,我试过了,但是我得到了这个错误:文件“kivy/\u event.pyx”,第438行,在kivy中。\u event.EventDispatcher.Bind(kivy/\u event.c:6026)keyrerror:“occulater:”另外,确保你
self.add\u小部件(Square())
(一个
Square
的实例,而不是类)。最后,
do\u thing
应该有3个参数。编辑代码本身。添加小部件(Square())(这在我的实际代码中是正确的,只是不是我为这个问题编写的简化版本)。你能澄清dou\u thing应该有哪些参数吗?绑定到
accubited
(我以前犯过这个错误)嗯,@zeemonkez,我试过了,但是我得到了这个错误:文件“kivy/_event.pyx”,第438行,在kivy.\u event.EventDispatcher.bind(kivy/_event.c:6026)keyrerror:“已占用”另外,请确保您
self.add\u widget(Square())
(Square
的一个实例,而不是类)最后,
do\u a\u thing
应该有3个参数。编辑代码本身。添加小部件(Square())(在我的实际代码中是正确的,只是不是我为这个问题编写的简化版本)。你能澄清一下什么参数应该被占用吗?谢谢你花时间来帮助我。我已经按照你的建议编辑了我的代码,甚至使用了你的完全占用方法。但是,当我绑定到“已占用”时,我仍然会得到一个KeyError(在kivy.\u event.EventDispatcher.bind(kivy/\u event.c:6026)KeyError:“已占用”)。如果我尝试绑定到“on_occulated”(这当然不起作用),则不会发生这种情况。@KSully2此示例是否按原样运行?是的,您的示例运行良好。我现在已编辑了原始问题中的代码,因为在较简单的代码段中没有发生错误。@KSully2请确保
occulated
的定义与我的示例相同(紧跟在
类之后
),不在
\uuuu init\uuuuu
中。就是这样!我的印象是您无法在init之外定义这些属性。为什么我可以同时拥有该语句和init?感谢您花时间帮助我。我已经按照您的建议编辑了我的代码,甚至使用了您精确的on\u-occupated方法。但是,当我绑定到“occupated”时我仍然会收到一个KeyError(在kivy.\u event.EventDispatcher.bind(kivy/\u event.c:6026)中)KeyError:“已占用”。如果我尝试绑定到“on\u occulated”(这当然不起作用),则不会发生这种情况@KSully2这个示例是否按原样运行?是的,您的示例运行良好。由于si中没有发生错误,我现在已经编辑了原始问题中的代码