python - “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'
解决方案
window
您在类中创建的具有FolderPopup
以下行的:
window = Window()
是一个新实例,Window
并且没有连接到Window
GUI 的根目录。您可以在您Window
的. 该类可以简化:app.root
kv
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 已经定义了一个重要的类。