首页 > 解决方案 > “NoneType”对象在 Kivy 中没有属性“文本”

问题描述

我是 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'

标签: pythonpython-3.xkivykivy-language

解决方案


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

window = Window()

是一个新实例,Window并且没有连接到WindowGUI 的根目录。您可以在您Window的. 该类可以简化:app.rootkvFolderPopup

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类的名称(只是为了避免可能的混淆),因为Windowkivy 已经定义了一个重要的类。


推荐阅读