Kivy:TypeError:NoneType对象不可为MainApp()调用。运行()

2024-09-24 00:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python+Kivy制作一个应用程序。每当我尝试在PyCharm中运行它时,它都会说DigitalLove().run()有错误TypeError: 'NoneType' object is not callable。完整日志如下:

[INFO   ] [Logger      ] Record log in C:\Users\paisseon\.kivy\logs\kivy_20-08-28_14.txt
[INFO   ] [deps        ] Successfully imported "kivy_deps.gstreamer" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.angle" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.glew" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2" 0.2.0
[INFO   ] [Kivy        ] v2.0.0rc3, git-20c14b2, 20200615
[INFO   ] [Kivy        ] Installed at "C:\Users\paisseon\AppData\Roaming\Python\Python38\site-packages\kivy\__init__.py"
[INFO   ] [Python      ] v3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 32 bit (Intel)]
[INFO   ] [Python      ] Interpreter at "C:\Users\paisseon\AppData\Local\Programs\Python\Python38-32\python.exe"
[INFO   ] [Factory     ] 185 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_pil (img_sdl2, img_ffpyplayer, img_gif ignored)
 Traceback (most recent call last):
   File "C:/Users/paisseon/Downloads/DigitalLove/main.py", line 846, in <module>
     DigitalLove().run()
   File "C:\Users\paisseon\AppData\Roaming\Python\Python38\site-packages\kivy\app.py", line 949, in run
     self._run_prepare()
   File "C:\Users\paisseon\AppData\Roaming\Python\Python38\site-packages\kivy\app.py", line 919, in _run_prepare
     root = self.build()
 TypeError: 'NoneType' object is not callable

我刚刚开始学习Kivy,所以请原谅我,如果这是一个初学者的错误,但我无法通过搜索这里或谷歌找到解决方案

提前感谢:)

编辑: 最小可重复示例

main.py

from kivy.app import App
from kivy.lang import Builder

GUI = Builder.load_file('main.kv')


class DigitalLove(App):
    @property
    def build(self):

        return GUI

        monika_art = 'images/monika.png'
        textbox_img = 'images/textbox.png'

        doki_response = 'example text'


if __name__ == "__main__":
    DigitalLove().run()

主要额定电压:

<GUI>:
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
            source: root.monika_art

            TextInput:
                id: user_input
                text: root.textinput_text
                multiline: False
                font_size: '12sp'
                # Add pos_hint and size_hint

            GridLayout:
                rows: 1
                Image:
                    source: root.textbox_img
                    pos: self.parent.pos
                    size: self.parent.size
                # Add pos_hint and size_hint
                    Label:
                        text: root.doki_response
                        font_size: '16sp'
                        center: self.parent.center

Tags: depsruninpyposselfinfoimg
1条回答
网友
1楼 · 发布于 2024-09-24 00:35:06

这里有几个问题:

  • 您不应该对build()方法使用@property装饰器
  • 您在kv中引用了GUI,但尚未定义GUI
  • 您在kv中引用了几个root.属性(这些属性将引用GUI类中的属性),但它们没有定义
  • build()方法的return后面有一些代码。在return之后的任何代码都不会被执行
  • kv中,缩进生成canvasTexInputGrdLayout子级,但这不起作用
  • 同样在kv中,顶级规则是<GUI>:,它创建了创建GUI类实例时要遵循的规则,但您没有创建此类实例的代码。您可以通过将<GUI>:更改为GUI:或者更好地将类名更改为Gui来解决这个问题

以下是您的代码的修改版本,包含上述更正:

main.py:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import StringProperty
from kivy.uix.boxlayout import BoxLayout


class Gui(BoxLayout):
    monika_art = StringProperty('images/monika.png')
    textbox_img = StringProperty('images/textbox.png')
    doki_response = StringProperty('example text')
    textinput_text = StringProperty('textinput text')

GUI = Builder.load_file('main.kv')


class DigitalLove(App):
    def build(self):
        return GUI


if __name__ == "__main__":
    DigitalLove().run()

主要额定电压:

Gui:
    canvas:
        Rectangle:
            pos: self.pos
            size: self.size
            source: root.monika_art

    TextInput:
        id: user_input
        text: root.textinput_text
        multiline: False
        font_size: '12sp'
        # Add pos_hint and size_hint

    GridLayout:
        rows: 1
        Image:
            source: root.textbox_img
            pos: self.parent.pos
            size: self.parent.size
        # Add pos_hint and size_hint
            Label:
                text: root.doki_response
                font_size: '16sp'
                center: self.parent.center

没有<>kv中的顶级规则将成为根小部件(在kv文件中只允许一个)。加载kv文件时,将创建并返回根小部件(如果定义了根小部件)

另外,创建与类(GUI)同名的变量(GUI)是一个坏主意。这可能有用,但很危险

相关问题 更多 >