使用kivy在python中传递事件

使用kivy在python中传递事件,python,events,python-3.x,kivy,Python,Events,Python 3.x,Kivy,我不熟悉python和kivy,我尝试在按下任何按钮时清除主机中的所有小部件,我的代码如下: from kivy.uix.button import Button from kivy.uix.gridlayout import GridLayout from kivy.uix.boxlayout import BoxLayout from kivy.uix.popup import Popup from kivy.uix.label import Label spots={} class s

我不熟悉python和kivy,我尝试在按下任何按钮时清除主机中的所有小部件,我的代码如下:

from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.popup import Popup
from kivy.uix.label import Label

spots={}

class spot(Button):
    '''
    classdocs
    '''
    def __init__(self, **kwargs):
        '''
        Constructor
        '''
        super(spot,self).__init__(**kwargs)
        self.ismine=False
        if 'text' in kwargs:
            self.text=kwargs['text']
        else:
            self.text="X"

    def on_press(self, *args, **kwargs):
        #return Button.on_press(self, *args, **kwargs)
        game.spottouched(self, self.text)

class game(BoxLayout):
    def __init__(self,**kwargs):
        super(game,self).__init__(**kwargs)
        self.m=minesholder(rows=25, cols=25)
        self.add_widget(self.m)
        self.attachtogrid()

    def attachtogrid(self):
        self.m.clear_widgets()
        spots.clear()
        for r in range(0,25):
            for c in range(0,25):
                idd=str(r)+","+str(c)
                spots[idd]=idd
                self.m.add_widget(spot(text=idd))

    def spottouched(self,spotid):
        #popup=Popup(title=spotid)
        #popup.open()
        self.clear_widgets()
最后一行用于清除小部件,spot类具有on_press事件。我正在尝试将应用程序上的按钮按偶数的事件传递到一个等待框布局(游戏类),你能告诉/告诉我正确的方向以了解如何传递事件吗

多谢各位

游戏。点击(self,self.text)

您误解了python类的工作原理。您希望从实际使用的
游戏实例中清除小部件,这是您通过编写
game()
创建的。参考该方法,您需要执行
instance.spottouch(spotid)
来调用该实例的方法

相反,您所做的是通过类定义调用方法,这在这里毫无意义,您也不想这样做。实际上,你根本不想这么做

无论如何,解决这个问题的方法取决于你实际构建应用程序的方式,但归根结底,你需要在spot实例可以看到的地方保留对游戏实例的引用。最好的方法取决于代码的其余部分,但您始终可以通过应用程序类来实现,例如

App.get_running_app().game = game()
后来

App.get_running_app().game.spottouched(self.text)
这只是一个例子,有时候这可能是一种不好的做事方式


另外,用大写字母开始小部件名称!kv语言使用它来识别它们,如果不这样命名它们,使用它会遇到问题。这也是一个值得遵循的强大python约定。

我认为这正是您想要的,根据您对@increment的回答的评论:在按下按钮上的
方法时去掉
。您希望绑定到事件-这将更像WPF

for r in range(0,25):
    for c in range(0,25):
        idd=str(r)+","+str(c)
        spots[idd]=idd
        s = spot(text=idd)
        self.m.add_widget(s)

        s.bind(on_press=self.spottouched)
因此,
self.spottouch
就像是按下按钮时的
spot
s
事件的事件处理程序

s.bind(on_press=self.spottouched)
有点像这样:

AddHandler s.Click, AddressOf spottouched

请注意,通过这种方式添加处理程序,处理程序将收到一个参数,即
spot
实例。您可以从该实例中获取
spot.text

是否有任何方法可以将事件调用从较低的控件移动/读取到较高的控件,如在WPF中(我不完全确定),好的,对于上述情况,我可以将所有内容保存在一个类中并使其简单工作,但我想学习如何避开事件,我特别来自VB.net和wpf。你必须解释更多你的意思,也许把它作为一个新的问题。我对WPF或VB.net一无所知。抱歉,如果问题/评论有误导性,我想说我来自VB和WPF,我不太了解python的方式。谢谢。它很有效,谢谢你把它和wpf联系起来,让它更容易理解。