首页 > 解决方案 > 使用 PysimpleGUI FileBrowse() 函数时如何显示文件夹中的文件?

问题描述

首先,PySimpleGUI 很棒!但是,我无法弄清楚使用 folderbrowse() 时如何显示文件夹中的所有文件?

或者,是否可以在发件箱中打印所选文件名?请给我一些指导。

使用 folderbrowse() 时的示例图像 谢谢!

标签: pythonuser-interfacepysimplegui

解决方案


FileBrowse()并且FolderBrowse()是不同的小部件。

FolderBrowse()用于仅选择文件夹,因此不显示文件。

FileBrowse()用于选择文件,以便显示文件和文件夹(但您不能选择文件夹来获取它)。


FileBrowse()给出所选文件夹的完整路径,稍后您应该使用

  • os.listdir(folder)获取所选文件夹中所有文件和文件夹的名称(但子文件夹中没有名称)
  • os.walk(folder)获取此文件夹和子文件夹中的所有文件和文件夹。
  • glob.glob(pattern)只得到一些名字 - 即。glob.glob(f"{folder}/*.png")

当您获得名称时,您可以在控制台中打印或更新小部件中的文本。


单击后,此最小示例在控制台中显示文件名Submit

import PySimpleGUI as sg
import os

#help(sg.FolderBrowse)
#help(sg.FileBrowse)

layout = [
    [sg.Input(), sg.FileBrowse('FileBrowse')],
    [sg.Input(), sg.FolderBrowse('FolderBrowse')],
    [sg.Submit(), sg.Cancel()],
]

window = sg.Window('Test', layout)

while True:
    event, values = window.read()
    #print('event:', event)
    #print('values:', values)
    print('FolderBrowse:', values['FolderBrowse'])
    print('FileBrowse:', values['FileBrowse'])
     
    if event is None or event == 'Cancel':
        break
    
    if event == 'Submit':
        # if folder was not selected then use current folder `.`
        foldername = values['FolderBrowse'] or '.' 

        filenames = os.listdir(foldername)

        print('folder:', foldername)
        print('files:', filenames)
        print("\n".join(filenames))
    
window.close()

类似的方式,您可以将文本放入某些小部件中 - 即。MultiLine()- 按下后Submit

import PySimpleGUI as sg
import os

layout = [
    [sg.Input(), sg.FolderBrowse('FolderBrowse')],

    [sg.Submit(), sg.Cancel()],

    [sg.Text('Files')],
    [sg.Multiline(key='files', size=(60,30), autoscroll=True)],

]

window = sg.Window('Test', layout)

while True:
    event, values = window.read()
     
    if event is None or event == 'Cancel':
        break
    
    if event == 'Submit':
        foldername = values['FolderBrowse'] or '.'
        filenames = os.listdir(foldername)
        # it uses `key='files'` to access `Multiline` widget
        window['files'].update("\n".join(filenames))
    
window.close()

顺便说一句:系统可能会按创建顺序提供文件名,因此您可能必须对它们进行排序

 filenames = sorted(os.listdir(foldername))

编辑:

要在没有您的情况下获取文件名,Submit您可能必须使用 normal Button,它将使用foldername = PopupGetFolder(..., no_window=True).

import PySimpleGUI as sg
import os

layout = [
    [sg.Input(), sg.Button('FolderBrowse')],

    [sg.Text('Files')],
    [sg.Multiline(key='files', size=(60,30), autoscroll=True)],

    [sg.Exit()],    
]

window = sg.Window('Test', layout)

while True:
    event, values = window.read()
    print(event)
     
    if event is None or event == 'Exit':
        window.close()
        break

    if event == 'FolderBrowse':
        foldername = sg.PopupGetFolder('Select folder', no_window=True)
        if foldername: # `None` when clicked `Cancel` - so I skip it
            filenames = sorted(os.listdir(foldername))
            # it use `key='files'` to `Multiline` widget
            window['files'].update("\n".join(filenames))
        

推荐阅读