Kivy:如何在没有kv语言的情况下通过FileChooser选择目录?

时间:2018-01-06 21:36:36

标签: python kivy kivy-language

Kivy manual中是将FileChooser与kivy语言一起使用的示例。我想只在python代码中使用FileChooser。当我用鼠标标记目录时,按下按钮选择目录,实际值在变量 FileChooser.path 中。没有使用此按钮的选择没有结果。 在示例中的kv文件中使用了事件 on_selection ,我用我的函数绑定了这个事件,但没有效果。

我的问题:

  1. 如何只用鼠标来获取路径值?
  2. 哪个班级使用活动 on_selection
  3. 谢谢!

    class Explorer(BoxLayout):   
        def __init__(self, **kwargs):
            super(Explorer,self).__init__(**kwargs)
    
            self.orientation = 'vertical'
            self.fichoo = FileChooserListView(size_hint_y = 0.8)
            self.add_widget(self.fichoo)
    
            control   = GridLayout(cols = 5, row_force_default=True, row_default_height=35, size_hint_y = 0.14)
            lbl_dir   = Label(text = 'Folder',size_hint_x = None, width = 80)
            self.tein_dir  = TextInput(size_hint_x = None, width = 350)
            bt_dir = Button(text = 'Select Dir',size_hint_x = None, width = 80)
            bt_dir.bind(on_release =self.on_but_select)
    
            self.fichoo.bind(on_selection = self.on_mouse_select)
    
            control.add_widget(lbl_dir)
            control.add_widget(self.tein_dir)
            control.add_widget(bt_dir)
    
            self.add_widget(control)
    
            return
    
        def on_but_select(self,obj):
            self.tein_dir.text = str(self.fichoo.path)
            return
    
        def on_mouse_select(self,obj):
            self.tein_dir.text = str(self.fichoo.path)
            return
    
        def on_touch_up(self, touch):
            self.tein_dir.text = str(self.fichoo.path)
        return super().on_touch_up(touch)
            return super().on_touch_up(touch)
    

1 个答案:

答案 0 :(得分:1)

很少需要进行更改。

on_selection中没有此类事件FileChooserListViewon_<propname>中有属性selection。您具有这些属性的类can use functions bind(<propname>=,但是当您使用bind时,您应该只使用selection

第二件事是默认情况下,你可以在doc True中看到包含所选文件的列表,而不是目录。要使目录实际上可以选择,您应该将dirselect属性更改为on_mouse_select

最后一个是self.fichoo.dirselect = True self.fichoo.bind(selection = self.on_mouse_select) # ... and def on_mouse_select(self, obj, val): 签名:属性会触发它的值,你应该算一算。

摘要更改如下:

def on_touch_up(self, touch):
    if self.fichoo.selection:
        self.tein_dir.text = str(self.fichoo.selection[0])
    return super().on_touch_up(touch)

之后你会像按钮那样做。

如果您想要填充输入而不是实际路径,而是选择路径,则可以执行以下操作:

{{1}}