没有参数,2给出:Kivy Button绑定到def

时间:2014-01-22 23:49:54

标签: python kivy

错误:

  

TypeError:changetxt()不带参数,但是没有参数,或者没有定义全局名称play_btn。

我尝试在def args中添加实例,自我,但仍然有相同的错误。

import kivy

from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.stacklayout import StackLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.lang import Builder

class launchScreenMenu(FloatLayout):
    def __init__(self, **kwargs):
        super(launchScreenMenu, self).__init__(**kwargs)

        menuanchor = AnchorLayout(anchor_x='left',anchor_y='bottom')
        menu = StackLayout(orientation='bt-lr',size_hint=(0.5,1))
        about_btn = Button(text='About',size_hint=(0.3,0.1))
        help_btn = Button(text='Settings',size_hint=(0.3,0.1))
        settings_btn = Button(text='Help',size_hint=(0.3,0.1))

        menu.add_widget(about_btn)
        menu.add_widget(help_btn)
        menu.add_widget(settings_btn)
        menuanchor.add_widget(menu)
        return self.add_widget(menuanchor)

class launchScreenBtn(AnchorLayout):
    def __init__(self, **kwargs):
        super(launchScreenBtn, self).__init__(**kwargs)
        play_btn = Button(text="Play")
        self.anchor_x = 'center'
        self.anchor_y = 'center'
        self.size_hint = 0.2,0.2
        self.add_widget(play_btn)
        play_btn.bind(on_press=self.changetxt)

    def changetxt():
        play_btn.text = 'Game Over'


class GameApp(App):
    def build(self):
        root = AnchorLayout()
        root.add_widget(launchScreenMenu())
        root.add_widget(launchScreenBtn())
        return root

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

2 个答案:

答案 0 :(得分:3)

所有实例方法都应始终以self作为第一个参数:

def changetxt(self, *args):
    self.play_btn = 'Game Over'

*args只是为了安全起见,如果不是你通过了论证。

另外,将课程中的所有 play_btn更改为self.play_btn

self.play_btn = Button(text="Play")

嗯,希望这有帮助!

答案 1 :(得分:1)

实例方法的第一个参数(想想类中的任何函数,但也有例外)是实例本身的链接。按照惯例,这被称为selfReference

我完全不知道你的第二个论点是什么。它可能是play_btn,因为这就是调用函数的内容。这很方便,因为无论如何你都试图引用它,否则它将是未定义的。

您希望def读取的方式如下:

def changetxt(self, play_btn):