Как использовать файловый браузер Windows по умолчанию в приложении KIVY - PullRequest
1 голос
/ 15 мая 2019

Я занимаюсь разработкой приложения kivy, и для загрузки файлов я хотел бы использовать файловый браузер Windows по умолчанию, а не те, которые предлагает kivy (https://kivy.org/doc/stable/api-kivy.uix.filechooser.html). Знаете ли вы, возможно ли это? У меня нет ' не нашел ничего вокруг. Спасибо.

Функции, которые фактически работают с файловым браузером kivy по умолчанию, следующие:

def show_load(self):
    content = LoadDialog(load=self.load_file,cancel=self.dismiss_popup)
    self._popup = Popup(
        title='Load file', content=content, size_hint=(0.9, 0.9)
    )
    self._popup.open()

def load_file(self, path, filename):
    self.filename = filename

    full_path = os.path.join(path, filename[0])

    filename = os.path.basename(full_path)

    app = App.get_running_app()
    self.check_input(full_path)

    self.dismiss_popup()

def check_input(self, filepath):
    '''Auxiliary method for checking user input.
    '''
    data_df = load_dataframe(filepath, self.ftypes, sep=';')

    if not isinstance(data_df, pd.DataFrame) and data_df == -999:
        self.warning_popup(message='File format not accepted')

    elif data_df.empty:
        self.warning_popup(message='Empty file')

    # If everything is OK
    else:
        self.data_df = data_df
        self.filepath = filepath

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете использовать обходной путь на основе tkinter, см. Мой пример приложения ниже.

import tkinter as tk
from tkinter import filedialog

from kivy.app import App
from kivy.base import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button

Builder.load_string("""
<rootwi>:
    orientation:'vertical'
    PathButton:
        on_press: label.text = self.get_path()
    Label:
        id: label

""")
class PathButton(Button):
    @staticmethod
    def get_path():
        root = tk.Tk()
        root.withdraw()

        return( filedialog.askopenfilename() )

class rootwi(BoxLayout):
    pass


class MyApp(App):
    def build(self):
        return rootwi()

if __name__ == '__main__':
    MyApp().run()
...