Skip to content

Commit b76e172

Browse files
authored
Merge pull request #153 from kujirahand/add_popup_files_delimiter
Add FILE_DELIMITER for FilesBrowse and popup_get_files
2 parents f0fe05b + 775617b commit b76e172

5 files changed

Lines changed: 35 additions & 44 deletions

File tree

TkEasyGUI/dialogs.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -712,25 +712,29 @@ def popup_get_file(
712712
multiple_files: bool = False, # can select multiple files
713713
file_types: Optional[FileTypeList] = None,
714714
default_extension: Optional[str] = None,
715-
files_delimiter: Optional[str] = "|",
715+
files_delimiter: Optional[
716+
str
717+
] = None, # default is FILES_DELIMITER for multiple files, used when multiple_files=True
716718
# pylint: disable=unused-argument
717719
no_window: Optional[bool] = None, # for compatibility
718720
**kw,
719-
) -> Union[str, tuple[str], None]:
721+
) -> Optional[str]:
720722
"""Popup a file selection dialog. Return the file selected."""
723+
from . import widgets as eg
724+
721725
if title is None:
722726
title = message
723727
if initial_folder is None:
724728
initial_folder = os.getcwd()
725729
if file_types is None:
726730
file_types = [("All Files", "*.*")]
731+
if files_delimiter is None:
732+
files_delimiter = eg.FILES_DELIMITER
727733
# check no_window
728734
if no_window is None:
729735
no_window = True
730736
if no_window is False:
731737
# --- no_window is False ---
732-
from . import widgets as eg
733-
734738
# show base dialog
735739
layout_no_window: list[list[eg.Element]] = [
736740
[eg.Text(message)],
@@ -781,8 +785,7 @@ def popup_get_file(
781785
**kw,
782786
)
783787
if multiple_files and isinstance(result, (tuple, list)):
784-
if files_delimiter is not None:
785-
result = files_delimiter.join(result)
788+
result = str(files_delimiter).join(result)
786789
return result
787790

788791

TkEasyGUI/widgets.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@
8282
EG_SWAP_EVENT_NAME: str = "--swap_event_name--"
8383

8484
DEFAULT_PADX = 1 if utils.is_win() else 3
85+
FILES_DELIMITER = (
86+
"|" if utils.is_win() else ":"
87+
) # delimiter for multiple files, used in popup_get_file with multiple_files=True
88+
8589

8690
# --- window icon ---
8791
DEFAULT_WINDOW_ICON = icon_default.ICON
@@ -94,7 +98,6 @@
9498
"y2": 22 + 6,
9599
} # for macOS titlebar
96100

97-
98101
# ------------------------------------------------------------------------------
99102
# Widget wrapper
100103
# ------------------------------------------------------------------------------
@@ -4688,7 +4691,7 @@ def __init__(
46884691
save_as: bool = False,
46894692
enable_events: bool = False, # enable changing events
46904693
# other
4691-
files_delimiter: Optional[str] = "|",
4694+
files_delimiter: Optional[str] = FILES_DELIMITER,
46924695
metadata: Union[dict[str, Any], None] = None,
46934696
**kw,
46944697
) -> None:
@@ -4752,33 +4755,23 @@ def show_dialog(self, *args) -> Union[Any, None]:
47524755
init_dir = self._get_initial_directory()
47534756

47544757
# popup
4755-
result = dialogs.popup_get_file(
4758+
popup_result = dialogs.popup_get_file(
47564759
title=self.title,
47574760
initial_folder=init_dir,
47584761
save_as=self.save_as,
47594762
file_types=self.file_types,
47604763
multiple_files=self.multiple_files,
47614764
files_delimiter=self.files_delimiter,
47624765
)
4763-
target_value = result
4764-
if isinstance(target_value, (list, tuple)):
4765-
delimiter = self.files_delimiter
4766-
if delimiter is not None:
4767-
target_value = delimiter.join(str(item) for item in target_value)
4768-
else:
4769-
# Keep popup_get_file return value unchanged (tuple/list) while
4770-
# updating target widgets/events with a readable string.
4771-
fallback_delimiter = " "
4772-
target_value = fallback_delimiter.join(str(item) for item in target_value)
4766+
target_value = popup_result if popup_result is not None else ""
47734767
if (target is not None) and (target_value is not None) and (target_value != ""):
47744768
target.update(target_value) # type: ignore [call-arg]
47754769
if self.enable_events:
47764770
if (self.window is not None) and (self.key is not None):
47774771
self.window.dispatch_event(
47784772
self.key, {"event": target_value, "event_type": "change"}
47794773
)
4780-
4781-
return result
4774+
return popup_result
47824775

47834776
def set_text(self, text: str) -> None:
47844777
"""Set the text of the button."""
@@ -4802,7 +4795,7 @@ def __init__(
48024795
target_key: Union[str, None] = None,
48034796
title: str = "",
48044797
file_types: Optional[FileTypeList] = None,
4805-
files_delimiter: Optional[str] = "|",
4798+
files_delimiter: Optional[str] = FILES_DELIMITER,
48064799
enable_events: bool = False, # enable changing events
48074800
# other
48084801
metadata: Union[dict[str, Any], None] = None,

tests/filebrowse_test.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@
55
# import PySimpleGUI as sg
66
import TkEasyGUI as eg
77

8-
FILES_DELIMITER = "|"
9-
108
# window create
119
window = eg.Window(
1210
"FileBrowser test",
1311
layout=[
1412
[eg.Text("File path:")],
1513
[eg.Input("", key="-filepath1-"), eg.FileBrowse()],
1614
[eg.Text("Multiple path:")],
17-
[eg.Input("", key="-filepath2-"), eg.FilesBrowse(files_delimiter=FILES_DELIMITER)],
15+
[
16+
eg.Input("", key="-filepath2-"),
17+
eg.FilesBrowse(files_delimiter=eg.FILES_DELIMITER),
18+
],
1819
[eg.Text("Folder path:")],
1920
[eg.Input("", key="-folderpath-"), eg.FolderBrowse()],
2021
[eg.Button("OK")],
@@ -26,14 +27,9 @@
2627
print("#", event, values)
2728
if event == "OK":
2829
print(values)
29-
selected_multiple = values["-filepath2-"]
30-
selected_multiple_list = []
31-
if selected_multiple not in ("", None):
32-
selected_multiple_list = str(selected_multiple).split(FILES_DELIMITER)
3330
a = [
3431
f"path1={values['-filepath1-']}",
35-
f"path2={selected_multiple}",
36-
f"path2-list={selected_multiple_list}",
32+
f"path2={values['-filepath2-']}",
3733
f"folder={values['-folderpath-']}",
3834
]
3935
eg.popup("Selected:\n" + "\n".join(a))

tests/popup/popup_get_file_sp_file_types.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44

55
import TkEasyGUI as eg
66

7-
FILES_DELIMITER = "|"
8-
97
# file types
10-
file_types = (
8+
file_types = [
119
("Image files", "*.jpg;*.jpeg;*.jpe;*.heic;*.png;*.gif"),
1210
("All files", "*.*"),
13-
)
11+
]
1412
# popup
15-
files = eg.popup_get_file(
13+
files_str = eg.popup_get_file(
1614
"Please select images.",
1715
file_types=file_types,
1816
multiple_files=True,
19-
files_delimiter=FILES_DELIMITER,
17+
files_delimiter=eg.FILES_DELIMITER,
2018
)
21-
print(f"raw={files}")
22-
if files not in (None, ""):
23-
print(files.split(FILES_DELIMITER))
19+
print(f"Selected: {files_str}")
20+
if files_str:
21+
files = files_str.split(eg.FILES_DELIMITER)
22+
eg.popup_listbox(files, "Selected Files")

tests/popup/select_multiple_files.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22

33
import TkEasyGUI as eg
44

5-
FILES_DELIMITER = "|"
6-
75
selected_files = eg.popup_get_file(
86
"Please select files.",
97
title="Select Multiple Files",
108
multiple_files=True,
11-
files_delimiter=FILES_DELIMITER,
9+
files_delimiter=eg.FILES_DELIMITER,
1210
)
1311

1412
if selected_files in (None, ""):
1513
print("No files selected.")
1614
else:
1715
print(f"raw={selected_files}")
1816
print("split:")
19-
for index, file_path in enumerate(str(selected_files).split(FILES_DELIMITER), start=1):
17+
for index, file_path in enumerate(
18+
str(selected_files).split(eg.FILES_DELIMITER), start=1
19+
):
2020
print(f" {index}. {file_path}")

0 commit comments

Comments
 (0)