Python 将按钮从.kv文件绑定到.py中的类方法

Python 将按钮从.kv文件绑定到.py中的类方法,python,kivy,Python,Kivy,我在课堂上遇到问题,无论我做什么都会不断出错,请告诉我哪里错了。 我一直在尝试绑定第一个屏幕上的按钮,以在按下时打开弹出窗口,但出现以下错误: AttributeError: 'str' object has no attribute 'bind' File "C:\Users\Lara\Downloads\Kivy-1.9.0-py3.4-win32-x64\kivy34\kivy\lang.py", line 2012, in _apply_rule setattr(widg

我在课堂上遇到问题,无论我做什么都会不断出错,请告诉我哪里错了。 我一直在尝试绑定第一个屏幕上的按钮,以在按下时打开弹出窗口,但出现以下错误:

AttributeError: 'str' object has no attribute 'bind'
   File "C:\Users\Lara\Downloads\Kivy-1.9.0-py3.4-win32-x64\kivy34\kivy\lang.py", line 2012, in _apply_rule
     setattr(widget_set, key, value)
   File "kivy\weakproxy.pyx", line 22, in kivy.weakproxy.WeakProxy.__setattr__ (kivy\weakproxy.c:1189)
   File "kivy\properties.pyx", line 397, in kivy.properties.Property.__set__ (kivy\properties.c:4680)
   File "kivy\properties.pyx", line 429, in kivy.properties.Property.set (kivy\properties.c:5203)
   File "kivy\properties.pyx", line 484, in kivy.properties.Property.dispatch (kivy\properties.c:5852)
   File "kivy\_event.pyx", line 1168, in kivy._event.EventObservers.dispatch (kivy\_event.c:12154)
   File "kivy\_event.pyx", line 1074, in kivy._event.EventObservers._dispatch (kivy\_event.c:11451)
   File "C:\Users\Lara\Downloads\Kivy-1.9.0-py3.4-win32-x64\kivy34\kivy\uix\popup.py", line 190, in on_content
    self._container.add_widget(value)
   File "C:\Users\Lara\Downloads\Kivy-1.9.0-py3.4-win32-x64\kivy34\kivy\uix\boxlayout.py", line 210, in add_widget
     widget.bind(
.py文件的相关部分:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.image import Image
from kivy.graphics import Color, Rectangle
from kivy.uix.popup import Popup
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.popup import Popup


class InstructionsPopup(Popup):
    pass

class StartScreen(Screen):

    def show_instructions(self):
        p = InstructionsPopup()
        p.open()

class GameScreen(Screen):
    pass

class RootScreen(ScreenManager):
    pass

class Main2App(App):
    def build(self):
        self.load_kv("main2.kv")
        return RootScreen()        

if __name__ == "__main__":
    Main2App().run()
.kv文件:

#:import FadeTransition kivy.uix.screenmanager.FadeTransition

<StartScreen>:
    name: "start"
    FloatLayout:
        Button:
            id: play
            text: "Play!"
            on_release: root.manager.current = 'game'
        Button:
            id: how
            text: "How to play"
            on_press: self.parent.parent.show_instructions()

<GameScreen>:
    name: "game"
    FloatLayout:
        SnakeWidget:
        InfoWidget: 
        Button:
            id: menu
            text: "Menu"

<InstructionsPopup>:
    size_hint: 0.5, 0.5
    content: "You start the game by ... "
    title: "How to play"

<RootScreen>:
    id: screen_manager
    transition: FadeTransition() 
    StartScreen:
        name: "start"
    GameScreen:
        name: "game"
但它一直告诉我,
self
没有定义


你知道我还能尝试什么吗?我可能错在哪里?

你的kivy文件中有两个编码错误

<StartScreen>:
    name: "start"
    BoxLayout:
    #Change your layout here
    #  OR
    #give pos or pos_hint or size_hint if you want to give floatlayout
        Button:
            id: play
            text: "Play!"
            on_release: root.manager.current = 'game'
        Button:
            id: how
            text: "How to play"
            on_press: root.show_instructions()
            #First error was here

<InstructionsPopup>:
    size_hint: 0.5, 0.5
    title: "How to play"
    #You add the content in the popup, this way
    Button:
        text: "dismiss"
        on_release: root.dismiss()
:
名称:“开始”
盒子布局:
#在这里更改布局
#或
#如果您想给出floatlayout,请给出pos或pos\u提示或size\u提示
按钮:
id:玩
文字:“玩!”
发布时:root.manager.current='game'
按钮:
身份证:怎么办
文字:“如何玩”
按:root.show_指令()
#第一个错误就在这里
:
尺寸提示:0.5,0.5
标题:“如何玩”
#您可以通过这种方式在弹出窗口中添加内容
按钮:
正文:“驳回”
发布时:root.disclose()

对不起,我不明白应该更改什么,为什么要将floatlayout更改为boxlayout?我已经设置好了所有的位置和尺寸,它可以正常工作,我只是在帖子中删除了它,因为它与按钮绑定无关。我只是想知道如何在.py中定义一些东西,以便绑定按钮和使用ID。我不断地发现错误,方法没有定义或者没有self。实际上,为了方便起见,我更改了它,在我提到的评论中看到,你也可以使用floatlayout,我想你不知道如何解决这个问题,不管怎样,你总是可以自由地使用任何你想要的布局,所以现在来看看
id
。转到此链接。在这个链接中,可以看到两个答案。谢谢你的回答。看起来我在读取.kv文件时遇到了问题,而且我尝试的方法没有任何效果。我从头开始,现在正尝试使用更多的python编码,它似乎工作得更好,但我发现它更难理解。这个链接将结束您与kivy文件的斗争:)
<StartScreen>:
    name: "start"
    BoxLayout:
    #Change your layout here
    #  OR
    #give pos or pos_hint or size_hint if you want to give floatlayout
        Button:
            id: play
            text: "Play!"
            on_release: root.manager.current = 'game'
        Button:
            id: how
            text: "How to play"
            on_press: root.show_instructions()
            #First error was here

<InstructionsPopup>:
    size_hint: 0.5, 0.5
    title: "How to play"
    #You add the content in the popup, this way
    Button:
        text: "dismiss"
        on_release: root.dismiss()