'NoneType' 对象在 Kivy 中没有属性 'text'

'NoneType' object has no attribute 'text' in Kivy

我是 Kivy 的新手,我正在尝试获取文件路径并使用 FileChooserIconView 将其复制到 TextInput。但是当我双击一个文件时,我得到了这个错误信息“'NoneType' object has no attribute '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

抱歉,我忘记了 post 回溯。这是回溯:

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'

您在 FolderPopup class 中创建的 window 行:

window = Window()

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

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 class 的名称(只是为了避免可能的混淆)因为 Window 是 kivy 已经定义的重要 class。