From f4a9a5383f0a1a6bd988dc7fcc29e20a8d7781e6 Mon Sep 17 00:00:00 2001 From: Hrithik Saini <49943287+hrithiksaini99@users.noreply.github.com> Date: Tue, 3 Nov 2026 10:35:14 +0530 Subject: [PATCH] [tkinter] Fix return types in tkinter.filedialog Update return types of asksaveasfilename, askopenfilename, and askdirectory to str | tuple[()] to accommodate empty tuples returned on cancellation. Closes: #16637 --- stdlib/@tests/test_cases/check_tkinter.py | 7 +++++++ stdlib/tkinter/filedialog.pyi | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/stdlib/@tests/test_cases/check_tkinter.py b/stdlib/@tests/test_cases/check_tkinter.py index 62ba0d11f045..a8814299c9ce 100644 --- a/stdlib/@tests/test_cases/check_tkinter.py +++ b/stdlib/@tests/test_cases/check_tkinter.py @@ -2,8 +2,10 @@ import sys import tkinter +import tkinter.filedialog import traceback import types +from typing import Literal from typing_extensions import assert_type @@ -71,3 +73,8 @@ def foo(x: int, y: str) -> None: t.count("1.0", "2.3", "indices", "lines", "chars", "ypixels", return_ints=True), tuple[int, ...] ) # (15, 1, 15, 19) assert_type(t.count("2.3", "2.3", "indices", "lines", "chars", "ypixels", return_ints=True), tuple[int, ...]) # (0, 0, 0, 0) + +assert_type(tkinter.filedialog.askopenfilename(), str | tuple[()]) +assert_type(tkinter.filedialog.asksaveasfilename(), str | tuple[()]) +assert_type(tkinter.filedialog.askdirectory(), str | tuple[()]) +assert_type(tkinter.filedialog.askopenfilenames(), Literal[""] | tuple[str, ...]) diff --git a/stdlib/tkinter/filedialog.pyi b/stdlib/tkinter/filedialog.pyi index ba69e90aa2da..1c46112e0fa6 100644 --- a/stdlib/tkinter/filedialog.pyi +++ b/stdlib/tkinter/filedialog.pyi @@ -86,7 +86,7 @@ def asksaveasfilename( parent: Misc | None = None, title: str | None = None, typevariable: StringVar | str | None = None, -) -> str: ... # can be empty string +) -> str | tuple[()]: ... # can be empty string or empty tuple def askopenfilename( *, defaultextension: str | None = "", @@ -96,7 +96,7 @@ def askopenfilename( parent: Misc | None = None, title: str | None = None, typevariable: StringVar | str | None = None, -) -> str: ... # can be empty string +) -> str | tuple[()]: ... # can be empty string or empty tuple def askopenfilenames( *, defaultextension: str | None = "", @@ -113,7 +113,7 @@ def askdirectory( mustexist: bool | None = False, parent: Misc | None = None, title: str | None = None, -) -> str: ... # can be empty string +) -> str | tuple[()]: ... # can be empty string or empty tuple # TODO: If someone actually uses these, overload to have the actual return type of open(..., mode) def asksaveasfile(