使用 PysimpleGUI FileBrowse() 函数时如何显示文件夹中的文件?

How to display files in folder when using PysimpleGUI FileBrowse() function?

首先,PySimpleGUI 很棒!但是,我不知道如何在使用 folderbrowse() 时显示文件夹中的所有文件?

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

谢谢!

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

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

FileBrowse() 用于 selecting 文件,因此它显示文件和文件夹(但您不能 select 文件夹来获取它)。


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

  • os.listdir(folder) 获取 selected 文件夹中所有文件和文件夹的名称(但子文件夹中没有名称)
  • 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 的文件名,您可能必须使用普通的 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))