如何访问Kivy代码发起的class实例?

How to access class instance initiated by the Kivy code?

我卡住了。我想不通如何访问在 Kivy 文件中启动的对象?

这是我的代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import time
from kivy.uix.screenmanager import Screen, ScreenManager

import filestack

Builder.load_file("test.kv")

class LoginScreen(Screen):

    def create_file(self):
        filename = f"file_{time.strftime('%Y%m%d_%H%M%S')}.txt"
        with open(filename, 'w') as file:
            file.write("Some content")


class RootWidget(ScreenManager):
    pass

class MainApp(App):
    def build(self):
        return RootWidget()

class FileSharer:

    def __init__(self, filepath, api_key="abcdefg"):
        self.filepath = filepath
        self.api_key = api_key

    def share(self):
        client = filestack.Client(self.api_key)
        new_filelink = client.upload(filepath=self.filepath)
        return new_filelink.url

MainApp().run()

还有我的 test.kv 文件:

<LoginScreen>:
    GridLayout:
        cols: 1
        padding: 10, 10
        spacing: 10, 10
        Button:
            text: 'Create File'
            size_hint_y: None
            height: '48dp'
            on_press: root.create_file()

<RootWidget>:
    LoginScreen:
        id: login_screen
        name: "login_screen"

这是程序生成的视觉效果:

当按下 Create File 按钮时,Kivy 文件调用 LoginScreen.create_file() 方法,并创建一个名称包含当前时间戳的文本文件(例如 file_20200624_173229.txt)。

我希望能够从 Python 代码访问该文件名。我想这样做的原因是我想使用 FileSharer class 将文件上传到云端。为此,我需要像 FileSharer(filepath=...).

这样初始化 FileSharer

我知道我可以通过使用 os.listdir() 在磁盘中查找生成的文件来解决这个问题,但我想以正确的方式做到这一点,即访问 filename 的值来自 LoginScreen 实例。

实现此目的的几种方法。这是一个。您可以在 LoginScreen 中创建一个 StringProperty 以包含创建的文件名:

class LoginScreen(Screen):
    filename = StringProperty('')

    def create_file(self):
        self.filename = f"file_{time.strftime('%Y%m%d_%H%M%S')}.txt"
        with open(self.filename, 'w') as file:
            file.write("Some content")

create_file()方法将文件名保存到filename属性.

然后您可以通过多种方式访问​​文件名,例如 login_screen_instance.filename,或者利用它现在是 Property 的事实,您可以在 kv 中使用它:

<RootWidget>:
    LoginScreen:
        id: login_screen
        name: "login_screen"
        on_filename: root.get_file(self.filename)

并在 RootWidget 中添加一个 get_file() 方法:

class RootWidget(ScreenManager):
    def get_file(self, filename):
        print('file is', filename)

现在,每当通过 create_file() 方法创建新文件时,都会调用 get_file() 方法。