【问题标题】:'NoneType' object has no attribute 'text' in Kivy“NoneType”对象在 Kivy 中没有属性“文本”
【发布时间】:2021-02-08 13:35:22
【问题描述】:

我是 Kivy 的新手,我正在尝试使用 FileChooserIconView 获取文件的路径并将其复制到 TextInput。但是当我双击一个文件时,我得到了这个错误消息“'NoneType'对象没有属性'text'”。我无法解决它。我真的很需要帮助。

我的代码是:

from kivy.config import Config
Config.set('graphics', 'resizable', False)
Config.set('graphics', 'width', '500')
Config.set('graphics', 'height', '700')
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty


Window.clearcolor = (1, 1, 1, 1)


class Window(Widget):
    label = ObjectProperty(None)
    def popup_open(self):
        self.popup = FolderPopup()
        self.popup.open()

class FolderPopup(Popup):
    window = Window()



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

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

我的 .kv 文件是:

<FolderPopup>:
    size_hint: (None, None)
    size: (500, 500)
    title: "Choose a File"
    BoxLayout:
        FileChooserIconView:
            on_selection: root.window.label.text = self.selection

<Window>:

    label: label

    GridLayout:
        size: 500, 700
        cols: 1
        TextInput:
            text: "Please choose a file."
            multiline: False
            halign: "center"
            readonly: True
            color: 0, 0, 0, 1
            id: label
            size_hint: root.width, None
            size: 0, 35

        Button:
            text: "Choose a File"
            size: root.width, 10
            on_release: root.popup_open()
            size_hint: root.width, None
            size: 0, 30

抱歉,我忘记发布回溯。这是回溯:

Traceback (most recent call last):
   File "D:\PyCharm\Converter\Main.py", line 31, in <module>
     GUI().run()
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\app.py", line 950, in run
     runTouchApp()
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\base.py", line 582, in runTouchApp
     EventLoop.mainloop()
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\base.py", line 347, in mainloop
     self.idle()
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\base.py", line 391, in idle
     self.dispatch_input()
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\base.py", line 342, in dispatch_input
     post_dispatch_input(*pop(0))
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\base.py", line 248, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\core\window\__init__.py", line 1416, in on_motion
     self.dispatch('on_touch_up', me)
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\core\window\__init__.py", line 1452, in on_touch_up
     if w.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\modalview.py", line 284, in on_touch_up
     super(ModalView, self).on_touch_up(touch)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\filechooser.py", line 563, in on_touch_up
     return super(FileChooserController, self).on_touch_up(touch)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\relativelayout.py", line 313, in on_touch_up
     ret = super(RelativeLayout, self).on_touch_up(touch)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 567, in on_touch_up
     if child.dispatch('on_touch_up', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\scrollview.py", line 950, in on_touch_up
     if self.dispatch('on_scroll_stop', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\scrollview.py", line 989, in on_scroll_stop
     self.simulate_touch_down(touch)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\scrollview.py", line 668, in simulate_touch_down
     ret = super(ScrollView, self).on_touch_down(touch)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\scatter.py", line 526, in on_touch_down
     if super(Scatter, self).on_touch_down(touch):
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\widget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy\_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
   File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\data\style.kv", line 398, in <module>
     on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\uix\filechooser.py", line 627, in entry_touched
     self.selection = [abspath(join(self.path, entry.path)), ]
   File "kivy\properties.pyx", line 498, in kivy.properties.Property.__set__
   File "kivy\properties.pyx", line 840, in kivy.properties.ListProperty.set
   File "kivy\properties.pyx", line 545, in kivy.properties.Property.set
   File "kivy\properties.pyx", line 600, in kivy.properties.Property.dispatch
   File "kivy\_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy\_event.pyx", line 1130, in kivy._event.EventObservers._dispatch
   File "D:\PyCharm\Converter\venv\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "D:\PyCharm\Converter\gui.kv", line 7, in <module>
     on_selection: root.window.label.text = self.selection
 AttributeError: 'NoneType' object has no attribute 'text'

【问题讨论】:

  • 发布完整的回溯。还有哪个对象是空的?

标签: python python-3.x kivy kivy-language


【解决方案1】:

您在 FolderPopup 类中创建的 window 带有以下行:

window = Window()

Window 的新实例,并且没有连接到作为GUI 根目录的Window。您可以在kv 中以app.root 的形式访问Window 的正确实例。 FolderPopup 类可以简化:

class FolderPopup(Popup):
    pass

kv 可以使用app.root 访问Window 实例:

<FolderPopup>:
    size_hint: (None, None)
    size: (500, 500)
    title: "Choose a File"
    BoxLayout:
        FileChooserIconView:
            on_selection: app.root.label.text = self.selection[0]

另外,请注意FileChooser 选择始终是一个列表。

您可以考虑更改 Window 类的名称(只是为了避免可能的混淆),因为 Window 是 kivy 已经定义的一个重要类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多