python - Python Kivy FileChooser
问题描述
我正在尝试通过文档学习 kivy,但我一直遇到 FileOpener 问题。我不擅长面向 0bject 的编程,所以我在使用 FileOpener 时遇到了麻烦,因为大多数示例都在 OOP 中。我正在尝试创建一个能够打开文本文件的基本记事本。
我尝试让 OpenFilePage 类继承自 LoginPage 类,以便我可以访问 kivy 文本输入小部件,但这只是覆盖了它们。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.popup import Popup
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
import os
cwd = os.getcwd()
class WelcomeWindow(FloatLayout):
pass
class WindowManager(ScreenManager):
pass
class LoginPage(Screen):
def saveTxt(self):
with open("notes.txt","w") as note_file:
note_file.write(self.ids.textbox.text)
note_file.close()
def clearBox(self):
self.ids.textbox.text=""
class OpenFilePage(Screen):
textbox = ObjectProperty(None)
def openFile(self,path,f_name):
with open(os.path.join(path, f_name[0])) as file:
self.textbox.text = file.read()
class MyApp(App):
def build(self):
return WindowManager()
if __name__ == "__main__":
MyApp().run()
<TextInput>:
size_hint: [1,1]
<BubbleButton>:
size_hint: (1, 1)
pos_hint: {'x': 0}
background_color: (1, 0, 0, 1)
<WindowManager>:
LoginPage:
OpenFilePage:
<LoginPage>:
textbox:textbox
name: "main"
id:LoginPage
orientation: "vertical"
GridLayout:
rows: 2
BoxLayout:
size_hint: (1, .9)
TextInput:
id: textbox
text:"Clear and start typing"
multiline: True
BoxLayout:
size_hint: (1, .1)
orientation:"horizontal"
BubbleButton:
id: OpenB
text:"Open"
on_release:
app.root.current = "OpenFilePage"
root.manager.transition.direction = "right"
BubbleButton:
id :clearButton
text:"clear"
on_release: root.clearBox()
BubbleButton:
id:saveButton
text:"save"
on_release:root.saveTxt()
<OpenFilePage>:
name: "OpenFilePage"
FloatLayout:
GridLayout:
cols:2
BoxLayout:
size_hint: (.2, 1)
orientation: "vertical"
BubbleButton:
text:"Back"
on_release:
app.root.current = "main"
root.manager.transition.direction= "left"
BoxLayout:
orientation: 'vertical'
FileChooserIconView:
id:filechooser
on_selection: self.openFile(filechooser.path,filechooser.selection)
打开文件并将 textinput.text 变量分配给打开的文件读取的内容时出现的错误是:
INFO ] [Base ] Leaving application in progress...
Traceback (most recent call last):
File "main.py", line 42, in <module>
MyApp().run()
File "/usr/lib/python3.7/site-packages/kivy/app.py", line 855, in run
runTouchApp()
File "/usr/lib/python3.7/site-packages/kivy/base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "/usr/lib/python3.7/site-packages/kivy/core/window/window_sdl2.py", line 747, in mainloop
self._mainloop()
File "/usr/lib/python3.7/site-packages/kivy/core/window/window_sdl2.py", line 479, in _mainloop
EventLoop.idle()
File "/usr/lib/python3.7/site-packages/kivy/base.py", line 342, in idle
self.dispatch_input()
File "/usr/lib/python3.7/site-packages/kivy/base.py", line 327, in dispatch_input
post_dispatch_input(*pop(0))
File "/usr/lib/python3.7/site-packages/kivy/base.py", line 233, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/core/window/__init__.py", line 1406, in on_motion
self.dispatch('on_touch_up', me)
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/core/window/__init__.py", line 1442, in on_touch_up
if w.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/screenmanager.py", line 1201, in on_touch_up
return super(ScreenManager, self).on_touch_up(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/relativelayout.py", line 304, in on_touch_up
ret = super(RelativeLayout, self).on_touch_up(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/filechooser.py", line 551, in on_touch_up
return super(FileChooserController, self).on_touch_up(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/relativelayout.py", line 304, in on_touch_up
ret = super(RelativeLayout, self).on_touch_up(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 571, in on_touch_up
if child.dispatch('on_touch_up', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/scrollview.py", line 895, in on_touch_up
if self.dispatch('on_scroll_stop', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/scrollview.py", line 934, in on_scroll_stop
self.simulate_touch_down(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/scrollview.py", line 642, in simulate_touch_down
ret = super(ScrollView, self).on_touch_down(touch)
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/scatter.py", line 526, in on_touch_down
if super(Scatter, self).on_touch_down(touch):
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy/_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "/usr/lib/python3.7/site-packages/kivy/uix/widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy/_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy/_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
File "/usr/lib/python3.7/site-packages/kivy/lang/builder.py", line 64, in custom_callback
exec(__kvlang__.co_value, idmap)
File "/usr/lib/python3.7/site-packages/kivy/data/style.kv", line 395, in <module>
on_touch_down: self.collide_point(*args[1].pos) and ctx.controller().entry_touched(self, args[1])
File "/usr/lib/python3.7/site-packages/kivy/uix/filechooser.py", line 615, in entry_touched
self.selection = [abspath(join(self.path, entry.path)), ]
File "kivy/properties.pyx", line 497, in kivy.properties.Property.__set__
File "kivy/properties.pyx", line 839, in kivy.properties.ListProperty.set
File "kivy/properties.pyx", line 544, in kivy.properties.Property.set
File "kivy/properties.pyx", line 599, in kivy.properties.Property.dispatch
File "kivy/_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy/_event.pyx", line 1096, in kivy._event.EventObservers._dispatch
File "/usr/lib/python3.7/site-packages/kivy/lang/builder.py", line 64, in custom_callback
exec(__kvlang__.co_value, idmap)
File "/home/mihle/Workspace/Python/GUI/my.kv", line 65, in <module>
on_selection: root.openFile(filechooser.path,filechooser.selection)
File "main.py", line 31, in openFile
self.textbox.text = file.read()
AttributeError: 'OpenFilePage' object has no attribute 'textbox'
解决方案
推荐阅读
- html - 在网站上查询表单并将数据提取到 Excel 的最简单方法是什么?
- flask - 在渲染之前如何在 Flask 中读取网页?
- websocket - WebSocket 不向所有连接的客户端发送数据,仅向发送数据的客户端发送数据
- python - 带参数的python过滤函数
- javascript - 有没有办法通过javascript获取webm的框架宽度和框架高度属性?
- node.js - 你如何使用 Jest 在一个类中模拟一个类?
- javascript - Angular - 动态生成反应形式的策略
- sharepoint-2013 - (用于 SharePoint 2013 的 Nintex 表单)是否可以使用表单中的 lookup() 在网站集之外查找列表?
- git - 为什么 git clone 不设置远程跟踪分支?
- python - python中的elif语法无效