【问题标题】:Kivy how to use FileBrowser properly inside of a popupKivy 如何在弹出窗口中正确使用 FileBrowser
【发布时间】:2018-12-13 02:50:26
【问题描述】:

我正在寻找一种方法来通过单击主应用程序屏幕上的按钮来创建一个带有文件浏览器的弹出框。下面的 sn-p 是从主应用程序单击上传按钮时调用的类。它将使用文件浏览器呈现弹出窗口,但 on_* kwargs 不会运行相应的方法。

class UploadPopup:
    def __init__(self, short_text='heading'):

        browser = FileBrowser(select_string='Select', cancel_state='down')
        browser.bind(on_success=self._fbrowser_success,
                     on_canceled=self._fbrowser_canceled,
                     on_submit=self._fbrowser_submit)

        self.popup = Popup(
            title=short_text,
            content=browser, size_hint=(0.9, 0.9),
            auto_dismiss=False
        )
        self.popup.open()

    def _fbrowser_canceled(self, instance):
        print('cancelled, Close self.')
        self.popup.dismiss()

    def _fbrowser_success(self, instance):
        print(instance.selection)
        self.popup.dismiss()

    def _fbrowser_submit(self, instance):
        print(instance.selection)
        self.popup.open()

有什么想法吗??

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    无论您在哪里调用UploadPopup(),都需要保存对它的引用,这样它就不会被垃圾回收。例如,您可能希望在主应用程序中执行 self.pop = UploadPopup()

    此外,在您的事件处理方法中,您可能希望将 self.popup.open() 替换为 self.popup.dismiss()

    【讨论】:

    • 感谢您的建议,我确实将弹出窗口子类设置为 threading.Thread 类,并在提出问题之前将其作为守护程序运行但未成功。我会测试你的建议!你愿意做一个工作代码的例子吗?另外,我编辑了原始的sn-p以反映dismiss方法,感谢纠正我,我在粘贴我想的东西时有点仓促。
    • 你能指出任何帮助你学习python垃圾收集的文档吗?如果没有,无论如何感谢您的回答!
    • 要记住的主要事实是,当任何对象不能再被引用时(例如,超出范围的变量),它就有资格被垃圾回收。在this = UploadPopup() 下面的代码中,创建了一个引用您的UploadPopup 实例的变量,但是一旦upload 方法结束,this 变量和UploadPopup 实例就无法访问并且将被垃圾回收。这个documentation 提供了一个很好的概述。
    【解决方案2】:

    我已经接受了一个答案,但想进一步扩展一下。 @john-anderson 是正确的,因为垃圾收集正在收集实例化。我本来就是这样做的……

    class MainScreen(Screen):
        ...
        @staticmethod
        def upload(self):
            this = UploadPopup()
        ...
    
    class UploadPopup():
        ....
        see original post
        ....
    

    为了解决这个问题,我必须在我的 MainScreen 类的 init 方法中实例化,向 UpdatePopup 类添加一个 open 方法,并在单击按钮时调用该方法。

    class MainScreen(Screen):
        def __init__(self):
            self.upload_popup = UploadPopup()
        ...
        @staticmethod
        def upload(self):
            self.upload_popup.start()
        ...
    
    class UploadPopup:
        def __init__(self, short_text='heading'):
    
            browser = FileBrowser(select_string='Select', cancel_state='down')
            browser.bind(on_success=self._fbrowser_success,
                         on_canceled=self._fbrowser_canceled,
                         on_submit=self._fbrowser_submit)
    
            self.popup = Popup(
                title=short_text,
                content=browser, size_hint=(0.9, 0.9),
                auto_dismiss=False
            )
    
        def start(self):
            self.popup.open()
        ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多