python - 使用 PysimpleGUI FileBrowse() 函数时如何显示文件夹中的文件?
解决方案
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))
推荐阅读
- java - 错误:未加载 mongodb.jdbc.MongoDriver。你确定你在 :jdbc_driver_library 中包含了正确的 jdbc 驱动程序吗?
- java - 当用户尝试打开任何工作(.doc)文件时,如何以编程方式打开 xyz 程序?
- reactjs - 单击它们时如何使3个按钮显示和隐藏内容?
- vue.js - 如何列出 vue 组件中所有可用的插槽
- apache-flink - Flink Streaming API:如何将元素发送到多个(但不是全部)分区?
- ats - 你如何对负 1 进行模式匹配?
- flutter - Google Assistant 和 Siri 的 Flutter 集成 - 语音交互
- mercurial - 将一个 .hgignore 文件包含在另一个文件中的方法
- javascript - React Native - 使用 AsyncStorage 将数据存储在另一个屏幕中
- javascript - 在 Android 上离线运行 Service Worker 上的任务