Python kivy-未定义的自我

Python kivy-未定义的自我,python,python-3.x,kivy,Python,Python 3.x,Kivy,我正试图从一本Python书籍中运行这个Python程序,这本Python书籍名为《Python完整手册》,但是说明是针对Python2.7的,我正在运行Python3.5 这个程序在kivy环境中运行,因为我正在使用它创建一个应用程序。我目前遇到的问题是,当我运行程序时,我会收到一条错误消息,说“self”没有定义。我已经尝试过更改语法,移动函数,因为我认为它必须按照指定的顺序读取函数,甚至完全删除了整行。无论我如何尝试,我仍然会得到相同的自定义错误 以下是代码和错误消息: #!/usr/bi

我正试图从一本Python书籍中运行这个Python程序,这本Python书籍名为《Python完整手册》,但是说明是针对Python2.7的,我正在运行Python3.5

这个程序在kivy环境中运行,因为我正在使用它创建一个应用程序。我目前遇到的问题是,当我运行程序时,我会收到一条错误消息,说“self”没有定义。我已经尝试过更改语法,移动函数,因为我认为它必须按照指定的顺序读取函数,甚至完全删除了整行。无论我如何尝试,我仍然会得到相同的自定义错误

以下是代码和错误消息:

#!/usr/bin/env python

import kivy
from kivy.core.window import Window
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.properties import ListProperty


class GridEntry(Button):
    coords = ListProperty([0, 0])


class TicTacToeApp(App):
    pass

    def build(self):
        return TicTacToeGrid()


class TicTacToeGrid(GridLayout):

    def __init__(self, *args, **kwargs):
        super(TicTacToeGrid, self).__init__(*args, **kwargs)

    def button_pressed(self, instance):
        print('{} button clicked!'.format(instance.coords))


    for row in range(3):
        for column in range(3):
            grid_entry = GridEntry(coords=(row, column))
            grid_entry.bind(on_release=self.button_pressed)
            self.add_widget(grid_entry)


if __name__ == "__main__":
    TicTacToeApp().run()
输出:

基维乌文夫root@c0mputer:/home/chavez/Documents/Python./ticTacToe.py [INFO][Logger]记录登录/root/.kivy/logs/kivy_20-01-06_1.txt [INFO][Kivy]v1.11.1 [INFO][Kivy]安装在/home/chavez/Documents/Python/Kivy_-venv/lib/python3.5/site-packages/Kivy/___;u init.py [INFO][Python]v3.5.2默认版本,2019年10月8日13:06:37 [GCC 5.4.0 20160609] [INFO][Python]解释器位于/home/chavez/Documents/Python/kivy_-venv/bin/Python [INFO][Logger]已激发清除日志。分析。。。 [INFO][Logger]清除完成! [信息][工厂]加载了184个符号 [信息][图像]提供商:img_tex、img_dds、img_sdl2、img_gif img_pil、img_ffpyplayer忽略 [INFO][Window]提供程序:sdl2['Window\u egl\u rpi']已忽略 [信息][GL]使用OpenGL图形系统 [信息][GL]已使用后端 [信息][GL]OpenGL版本 [信息][GL]OpenGL供应商 [INFO][GL]OpenGL渲染器 [信息][GL]OpenGL解析版本:3,0 [信息][GL]明暗处理版本 [信息][GL]纹理最大大小 [信息][GL]纹理最大单位 [信息][窗口]自动添加sdl2输入提供程序 [信息][窗口]不允许使用虚拟键盘,单模,未对接 [信息][文本]提供商:sdl2 回溯最近一次呼叫上次: 文件./ticTacToe.py,第23行,在 类TictoeGridLayout: 文件./ticTacToe.py,第35行,在TicTacToeGrid中 grid\u entry.bindon\u release=self.button\u按下 NameError:未定义名称“self”
我是这个领域的新手,只是浏览了问题和答案,并没有真正注册到这个网站。谢谢@Error-Syntactical懊悔,这是我想要的正确答案。简单一点,但我对Python还是相当陌生的,直到我开始读这本书,我才听说kivy。另外,我不喜欢得到正确答案的另一件事是,发布问题并获得正确答案的人几乎从不以正确答案的方式发布他/她/他们的代码。我只是经常看到,哦!这就解决了它!。。。因此,我将在此处发布更正:

!/usr/bin/env python 进口克维 从kivy.core.window导入窗口 从kivy.app导入应用程序 从kivy.uix.label导入标签 从kivy.uix.gridlayout导入gridlayout 从kivy.uix.button导入按钮 从kivy.properties导入ListProperty 类GridEntryButton: coords=ListProperty[0,0] TictoeAppp类: def buildself: 回程栅极 类TictoeGridLayout: 定义初始自我,*args,**kwargs: superTicTacToeGrid,self.\uuuuu init\uuuuu*args,**kwargs 对于范围3中的行: 对于范围3中的列: grid\u entry=GridEntrycoords=行、列 grid\u entry.bindon\u release=self.button\u按下 self.add\u widgetgrid\u条目 def按钮按下自身,实例: 打印“{}”按钮已单击!'。formatinstance.coords 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: TictoeApp.run
范围3:中的for行不在类方法中。这是在班级层面上,因此没有自我这回事。要么把它放在一个方法中,然后可以使用self,要么把它放在@classmethod中,然后使用cls。你可以把它放在你的构造函数中,_init__;看起来像是一个缩进错误。您的for循环需要再缩进一级。@davidc由于投票是秘密的,因此无法强制用户指出他们投票的原因,因此只能推断那些投反对票的人出于任何原因都不喜欢您的问题。不是我的反对票,但是,人们通常会对这样的问题投反对票,因为这是一个你应该能够通过一直遵循python教程来解决的问题。虽然我个人认为这是一个不错的问题,因为对于不熟悉该语言或不熟悉编程的人来说,这种类型的错误可能很难发现。@davidc是的,我有过类似的坏书。不过,如果您想要一本真正优秀的高级python书籍,请阅读流畅的python。那就是说
我欢迎你这么做。我想你会很快学会诀窍的。1不要使用4个空格来缩进代码,而是使用三个反勾:``应该在esc键下,这将使您的生活更加轻松。2你在TictaToeApp类中有一个不需要的通行证。@错误语法自责谢谢,你太棒了!