首页 > 解决方案 > 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'

标签: pythonkivy

解决方案


推荐阅读