From e6a69e6d76e647377d1a73a45f062e4883a64a3f Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 17:57:34 +0300 Subject: [PATCH 1/8] everything except column() --- stdlib/tkinter/ttk.pyi | 168 ++++++++++++++++++++++++++++++++++------- 1 file changed, 140 insertions(+), 28 deletions(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index af3c75142598..f37aa69103d9 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -871,6 +871,30 @@ if sys.version_info >= (3, 7): config = configure # type: ignore def set(self, value: Any) -> None: ... +class _TreeviewItemDict(TypedDict): + text: str + image: Literal[""] | list[str] # no idea why it's wrapped in list + values: list[Any] + open: bool # actually 0 or 1 + tags: list[str] + +class _TreeviewTagDict(TypedDict): + text: str + image: Literal[""] | str # not wrapped in list :D + anchor: tkinter._Anchor + background: tkinter._Color + foreground: tkinter._Color + +class _TreeviewHeaderDict(TypedDict): + text: str + image: list[str] + anchor: tkinter._Anchor + command: str + state: str # Doesn't seem to appear anywhere else than in these dicts + +_TreeviewItemId = str # empty string is parent of all other items +_TreeviewColumnId = int | str # manual page: "COLUMN IDENTIFIERS" + class Treeview(Widget, tkinter.XView, tkinter.YView): def __init__( self, @@ -914,38 +938,102 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): @overload def configure(self, cnf: str) -> Tuple[str, str, str, Any, Any]: ... config = configure - def bbox(self, item, column: Optional[Any] = ...): ... # type: ignore - def get_children(self, item: Optional[Any] = ...): ... - def set_children(self, item, *newchildren): ... + def bbox(self, item, column: _TreeviewColumnId | None = ...) -> Tuple[int, int, int, int] | Literal[""]: ... # type: ignore + def get_children(self, item: _TreeviewItemId = ...): ... + def set_children(self, item: _TreeviewItemId, *newchildren: _TreeviewItemId): ... + # ############# TODO def column(self, column, option: Optional[Any] = ..., **kw): ... - def delete(self, *items): ... - def detach(self, *items): ... - def exists(self, item): ... - def focus(self, item: Optional[Any] = ...): ... - def heading(self, column, option: Optional[Any] = ..., **kw): ... + def delete(self, *items: _TreeviewItemId) -> None: ... + def detach(self, *items: _TreeviewItemId) -> None: ... + def exists(self, item: _TreeviewItemId) -> bool: ... + @overload + def focus(self, item: None = ...) -> _TreeviewItemId | Literal[""]: ... + @overload + def focus(self, item: _TreeviewItemId) -> Literal[""]: ... + @overload + def heading(self, column: _TreeviewColumnId, option: Literal["text"]) -> str: ... + @overload + def heading(self, column: _TreeviewColumnId, option: Literal["image"]) -> Tuple[str]: ... + @overload + def heading(self, column: _TreeviewColumnId, option: Literal["anchor"]) -> _tkinter.Tcl_Obj: ... + @overload + def heading(self, column: _TreeviewColumnId, option: Literal["command"]) -> str: ... + @overload + def heading(self, column: _TreeviewColumnId, option: str) -> Any: ... + @overload + def heading( + self, + column: _TreeviewColumnId, + option: None = ..., + *, + text: str = ..., + image: tkinter._ImageSpec = ..., + anochor: tkinter._Anchor = ..., + command: str | Callable[[], Any] = ..., + ): ... def identify(self, component, x, y): ... - def identify_row(self, y): ... - def identify_column(self, x): ... - def identify_region(self, x, y): ... - def identify_element(self, x, y): ... - def index(self, item): ... - def insert(self, parent, index, iid: Optional[Any] = ..., **kw): ... - def item(self, item, option: Optional[Any] = ..., **kw): ... - def move(self, item, parent, index): ... - reattach: Any - def next(self, item): ... - def parent(self, item): ... - def prev(self, item): ... - def see(self, item): ... + def identify_row(self, y: int) -> _TreeviewItemId | Literal[""]: ... + def identify_column(self, x: int) -> str: ... + def identify_region(self, x: int, y: int) -> Literal["heading", "separator", "tree", "cell", "nothing"]: ... + def identify_element(self, x: int, y: int) -> str: ... # don't know what possible return values are + def index(self, item: _TreeviewItemId) -> int: ... + def insert( + self, + parent: _TreeviewItemId, + index: int | Literal["end"], + iid: Optional[_TreeviewItemId] = ..., + *, + id: _TreeviewItemId = ..., # same as iid + text: str = ..., + image: tkinter._ImageSpec = ..., + values: tkinter._TkinterSequence[Any] = ..., + open: bool = ..., + tags: tkinter._TkinterSequence[str] = ..., + ): ... + @overload + def item(self, item: _TreeviewItemId, option: Literal["text"]) -> str: ... + @overload + def item(self, item: _TreeviewItemId, option: Literal["image"]) -> Literal[""] | Tuple[str]: ... + @overload + def item(self, item: _TreeviewItemId, option: Literal["values"]) -> Literal[""] | Tuple[Any, ...]: ... + @overload + def item(self, item: _TreeviewItemId, option: Literal["open"]) -> bool: ... # actually 0 or 1 + @overload + def item(self, item: _TreeviewItemId, option: Literal["tags"]) -> Literal[""] | Tuple[str, ...]: ... + @overload + def item(self, item: _TreeviewItemId, option: str) -> Any: ... + @overload + def item( + self, + item: _TreeviewItemId, + option: None = ..., + *, + text: str = ..., + image: tkinter._ImageSpec = ..., + values: tkinter._TkinterSequence[Any] = ..., + open: bool = ..., + tags: tkinter._TkinterSequence[str] = ..., + ) -> _TreeviewItemDict: ... + def move(self, item: _TreeviewItemId, parent: _TreeviewItemId, index: int) -> None: ... + reattach = move + def next(self, item: _TreeviewItemId) -> _TreeviewItemId | Literal[""]: ... + def parent(self, item: _TreeviewItemId) -> _TreeviewItemId: ... + def prev(self, item: _TreeviewItemId) -> _TreeviewItemId | Literal[""]: ... + def see(self, item: _TreeviewItemId) -> None: ... if sys.version_info >= (3, 8): def selection(self) -> Tuple[str, ...]: ... else: def selection(self, selop: Optional[Any] = ..., items: Optional[Any] = ...) -> Tuple[str, ...]: ... - def selection_set(self, items): ... - def selection_add(self, items): ... - def selection_remove(self, items): ... - def selection_toggle(self, items): ... - def set(self, item, column: Optional[Any] = ..., value: Optional[Any] = ...): ... + def selection_set(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... + def selection_add(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... + def selection_remove(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... + def selection_toggle(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... + @overload + def set(self, item: _TreeviewItemId, column: None = ..., value: None = ...) -> dict[str, Any]: ... + @overload + def set(self, item: _TreeviewItemId, column: _TreeviewColumnId, value: None = ...) -> Any: ... + @overload + def set(self, item: _TreeviewItemId, column: _TreeviewColumnId, value: Any) -> Literal[""]: ... # There's no tag_unbind() or 'add' argument for whatever reason. # Also, it's 'callback' instead of 'func' here. @overload @@ -956,8 +1044,32 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): def tag_bind(self, tagname: str, sequence: Optional[str], callback: str) -> None: ... @overload def tag_bind(self, tagname: str, *, callback: str) -> None: ... - def tag_configure(self, tagname, option: Optional[Any] = ..., **kw): ... - def tag_has(self, tagname, item: Optional[Any] = ...): ... + @overload + def tag_configure( + self, + tagname: str, + option: None = ..., + *, + text: str = ..., + image: tkinter._ImageSpec = ..., + anchor: tkinter._Anchor = ..., + background: tkinter._Color = ..., + foreground: tkinter._Color = ..., + ) -> _TreeviewTagDict | None: ... + @overload + def tag_configure(self, tagname: str, option: Literal["text"]) -> str: ... + @overload + def tag_configure(self, tagname: str, option: Literal["image"]) -> str: ... + @overload + def tag_configure(self, tagname: str, option: Literal["anchor"]) -> tkinter._Anchor | Literal[""]: ... + @overload + def tag_configure(self, tagname: str, option: Literal["foreground", "background"]) -> tkinter._Color: ... + @overload + def tag_configure(self, tagname: str, option: str) -> Any: ... + @overload + def tag_has(self, tagname: str, item: None = ...) -> Tuple[_TreeviewItemId, ...]: ... + @overload + def tag_has(self, tagname: str, item: _TreeviewItemId) -> bool: ... class LabeledScale(Frame): label: Any From 889d5678b6e33f416491e6a5899a16e569bfbc33 Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:07:44 +0300 Subject: [PATCH 2/8] column method, some missing ret types --- stdlib/tkinter/ttk.pyi | 57 +++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index f37aa69103d9..69893baac49d 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -892,6 +892,13 @@ class _TreeviewHeaderDict(TypedDict): command: str state: str # Doesn't seem to appear anywhere else than in these dicts +class _TreeviewColumnDict(TypedDict): + width: int + minwidth: int + stretch: bool # actually 0 or 1 + anchor: tkinter._Anchor + id: str + _TreeviewItemId = str # empty string is parent of all other items _TreeviewColumnId = int | str # manual page: "COLUMN IDENTIFIERS" @@ -941,8 +948,28 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): def bbox(self, item, column: _TreeviewColumnId | None = ...) -> Tuple[int, int, int, int] | Literal[""]: ... # type: ignore def get_children(self, item: _TreeviewItemId = ...): ... def set_children(self, item: _TreeviewItemId, *newchildren: _TreeviewItemId): ... - # ############# TODO - def column(self, column, option: Optional[Any] = ..., **kw): ... + @overload + def column(self, column: _TreeviewColumnId, option: Literal["width", "minwidth"]) -> int: ... + @overload + def column(self, column: _TreeviewColumnId, option: Literal["stretch"]) -> bool: ... # actually 0 or 1 + @overload + def column(self, column: _TreeviewColumnId, option: Literal["anchor"]) -> _tkinter.Tcl_Obj: ... + @overload + def column(self, column: _TreeviewColumnId, option: Literal["id"]) -> str: ... + @overload + def column(self, column: _TreeviewColumnId, option: str) -> Any: ... + @overload + def column( + self, + column: _TreeviewColumnId, + option: None = ..., + *, + width: int = ..., + minwidth: int = ..., + stretch: bool = ..., + anchor: tkinter._Anchor = ..., + # id is read-only + ) -> _TreeviewColumnDict | None: ... def delete(self, *items: _TreeviewItemId) -> None: ... def detach(self, *items: _TreeviewItemId) -> None: ... def exists(self, item: _TreeviewItemId) -> bool: ... @@ -970,7 +997,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): image: tkinter._ImageSpec = ..., anochor: tkinter._Anchor = ..., command: str | Callable[[], Any] = ..., - ): ... + ) -> _TreeviewHeaderDict | None: ... def identify(self, component, x, y): ... def identify_row(self, y: int) -> _TreeviewItemId | Literal[""]: ... def identify_column(self, x: int) -> str: ... @@ -989,7 +1016,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): values: tkinter._TkinterSequence[Any] = ..., open: bool = ..., tags: tkinter._TkinterSequence[str] = ..., - ): ... + ) -> _TreeviewItemId: ... @overload def item(self, item: _TreeviewItemId, option: Literal["text"]) -> str: ... @overload @@ -1013,7 +1040,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): values: tkinter._TkinterSequence[Any] = ..., open: bool = ..., tags: tkinter._TkinterSequence[str] = ..., - ) -> _TreeviewItemDict: ... + ) -> _TreeviewItemDict | None: ... def move(self, item: _TreeviewItemId, parent: _TreeviewItemId, index: int) -> None: ... reattach = move def next(self, item: _TreeviewItemId) -> _TreeviewItemId | Literal[""]: ... @@ -1045,6 +1072,16 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): @overload def tag_bind(self, tagname: str, *, callback: str) -> None: ... @overload + def tag_configure(self, tagname: str, option: Literal["text"]) -> str: ... + @overload + def tag_configure(self, tagname: str, option: Literal["image"]) -> str: ... + @overload + def tag_configure(self, tagname: str, option: Literal["anchor"]) -> tkinter._Anchor | Literal[""]: ... + @overload + def tag_configure(self, tagname: str, option: Literal["foreground", "background"]) -> tkinter._Color: ... + @overload + def tag_configure(self, tagname: str, option: str) -> Any: ... + @overload def tag_configure( self, tagname: str, @@ -1057,16 +1094,6 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): foreground: tkinter._Color = ..., ) -> _TreeviewTagDict | None: ... @overload - def tag_configure(self, tagname: str, option: Literal["text"]) -> str: ... - @overload - def tag_configure(self, tagname: str, option: Literal["image"]) -> str: ... - @overload - def tag_configure(self, tagname: str, option: Literal["anchor"]) -> tkinter._Anchor | Literal[""]: ... - @overload - def tag_configure(self, tagname: str, option: Literal["foreground", "background"]) -> tkinter._Color: ... - @overload - def tag_configure(self, tagname: str, option: str) -> Any: ... - @overload def tag_has(self, tagname: str, item: None = ...) -> Tuple[_TreeviewItemId, ...]: ... @overload def tag_has(self, tagname: str, item: _TreeviewItemId) -> bool: ... From 0552873199a8c854a85af824e7cf1ae46ac0ae4f Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:12:37 +0300 Subject: [PATCH 3/8] fix import --- stdlib/tkinter/ttk.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index 69893baac49d..27052893b580 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -3,7 +3,7 @@ import sys import tkinter from tkinter.font import _FontDescription from typing import Any, Callable, Dict, List, Optional, Tuple, Union, overload -from typing_extensions import Literal +from typing_extensions import Literal, TypedDict def tclobjs_to_py(adict): ... def setup_master(master: Optional[Any] = ...): ... From f5658bad1a468b81b41cb353c2057bee2adac68b Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:16:52 +0300 Subject: [PATCH 4/8] back to old-style union --- stdlib/tkinter/ttk.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index 27052893b580..60b9471c55a0 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -900,7 +900,7 @@ class _TreeviewColumnDict(TypedDict): id: str _TreeviewItemId = str # empty string is parent of all other items -_TreeviewColumnId = int | str # manual page: "COLUMN IDENTIFIERS" +_TreeviewColumnId = Union[int, str] # manual page: "COLUMN IDENTIFIERS" class Treeview(Widget, tkinter.XView, tkinter.YView): def __init__( From d7dba09d4456d95720e5b153e7994e23350b55cb Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:21:14 +0300 Subject: [PATCH 5/8] type-ignore because tkinter's focus methods have name clash --- stdlib/tkinter/ttk.pyi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index 60b9471c55a0..edf5c6614d0c 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -973,7 +973,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): def delete(self, *items: _TreeviewItemId) -> None: ... def detach(self, *items: _TreeviewItemId) -> None: ... def exists(self, item: _TreeviewItemId) -> bool: ... - @overload + @overload # type: ignore def focus(self, item: None = ...) -> _TreeviewItemId | Literal[""]: ... @overload def focus(self, item: _TreeviewItemId) -> Literal[""]: ... From 1c38eb06497bf8ea0fc5586a4ce37b91be46e6e2 Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:25:39 +0300 Subject: [PATCH 6/8] fix get_chiodren and set_children --- stdlib/tkinter/ttk.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index edf5c6614d0c..f3ae30ac7aba 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -946,8 +946,8 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): def configure(self, cnf: str) -> Tuple[str, str, str, Any, Any]: ... config = configure def bbox(self, item, column: _TreeviewColumnId | None = ...) -> Tuple[int, int, int, int] | Literal[""]: ... # type: ignore - def get_children(self, item: _TreeviewItemId = ...): ... - def set_children(self, item: _TreeviewItemId, *newchildren: _TreeviewItemId): ... + def get_children(self, item: _TreeviewItemId | None = ...) -> Tuple[_TreeviewItemId, ...]: ... + def set_children(self, item: _TreeviewItemId, *newchildren: _TreeviewItemId) -> None: ... @overload def column(self, column: _TreeviewColumnId, option: Literal["width", "minwidth"]) -> int: ... @overload From 6219b4942f89ea9bab04c81945682bc648c22080 Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:33:12 +0300 Subject: [PATCH 7/8] str --- stdlib/tkinter/ttk.pyi | 69 +++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index f3ae30ac7aba..2d3659cb916e 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -899,7 +899,6 @@ class _TreeviewColumnDict(TypedDict): anchor: tkinter._Anchor id: str -_TreeviewItemId = str # empty string is parent of all other items _TreeviewColumnId = Union[int, str] # manual page: "COLUMN IDENTIFIERS" class Treeview(Widget, tkinter.XView, tkinter.YView): @@ -946,8 +945,8 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): def configure(self, cnf: str) -> Tuple[str, str, str, Any, Any]: ... config = configure def bbox(self, item, column: _TreeviewColumnId | None = ...) -> Tuple[int, int, int, int] | Literal[""]: ... # type: ignore - def get_children(self, item: _TreeviewItemId | None = ...) -> Tuple[_TreeviewItemId, ...]: ... - def set_children(self, item: _TreeviewItemId, *newchildren: _TreeviewItemId) -> None: ... + def get_children(self, item: str | None = ...) -> Tuple[str, ...]: ... + def set_children(self, item: str, *newchildren: str) -> None: ... @overload def column(self, column: _TreeviewColumnId, option: Literal["width", "minwidth"]) -> int: ... @overload @@ -970,13 +969,13 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): anchor: tkinter._Anchor = ..., # id is read-only ) -> _TreeviewColumnDict | None: ... - def delete(self, *items: _TreeviewItemId) -> None: ... - def detach(self, *items: _TreeviewItemId) -> None: ... - def exists(self, item: _TreeviewItemId) -> bool: ... + def delete(self, *items: str) -> None: ... + def detach(self, *items: str) -> None: ... + def exists(self, item: str) -> bool: ... @overload # type: ignore - def focus(self, item: None = ...) -> _TreeviewItemId | Literal[""]: ... + def focus(self, item: None = ...) -> str: ... # can return empty string @overload - def focus(self, item: _TreeviewItemId) -> Literal[""]: ... + def focus(self, item: str) -> Literal[""]: ... @overload def heading(self, column: _TreeviewColumnId, option: Literal["text"]) -> str: ... @overload @@ -999,40 +998,40 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): command: str | Callable[[], Any] = ..., ) -> _TreeviewHeaderDict | None: ... def identify(self, component, x, y): ... - def identify_row(self, y: int) -> _TreeviewItemId | Literal[""]: ... + def identify_row(self, y: int) -> str: ... def identify_column(self, x: int) -> str: ... def identify_region(self, x: int, y: int) -> Literal["heading", "separator", "tree", "cell", "nothing"]: ... def identify_element(self, x: int, y: int) -> str: ... # don't know what possible return values are - def index(self, item: _TreeviewItemId) -> int: ... + def index(self, item: str) -> int: ... def insert( self, - parent: _TreeviewItemId, + parent: str, index: int | Literal["end"], - iid: Optional[_TreeviewItemId] = ..., + iid: str | None = ..., *, - id: _TreeviewItemId = ..., # same as iid + id: str = ..., # same as iid text: str = ..., image: tkinter._ImageSpec = ..., values: tkinter._TkinterSequence[Any] = ..., open: bool = ..., tags: tkinter._TkinterSequence[str] = ..., - ) -> _TreeviewItemId: ... + ) -> str: ... @overload - def item(self, item: _TreeviewItemId, option: Literal["text"]) -> str: ... + def item(self, item: str, option: Literal["text"]) -> str: ... @overload - def item(self, item: _TreeviewItemId, option: Literal["image"]) -> Literal[""] | Tuple[str]: ... + def item(self, item: str, option: Literal["image"]) -> Literal[""] | Tuple[str]: ... @overload - def item(self, item: _TreeviewItemId, option: Literal["values"]) -> Literal[""] | Tuple[Any, ...]: ... + def item(self, item: str, option: Literal["values"]) -> Literal[""] | Tuple[Any, ...]: ... @overload - def item(self, item: _TreeviewItemId, option: Literal["open"]) -> bool: ... # actually 0 or 1 + def item(self, item: str, option: Literal["open"]) -> bool: ... # actually 0 or 1 @overload - def item(self, item: _TreeviewItemId, option: Literal["tags"]) -> Literal[""] | Tuple[str, ...]: ... + def item(self, item: str, option: Literal["tags"]) -> Literal[""] | Tuple[str, ...]: ... @overload - def item(self, item: _TreeviewItemId, option: str) -> Any: ... + def item(self, item: str, option: str) -> Any: ... @overload def item( self, - item: _TreeviewItemId, + item: str, option: None = ..., *, text: str = ..., @@ -1041,26 +1040,26 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): open: bool = ..., tags: tkinter._TkinterSequence[str] = ..., ) -> _TreeviewItemDict | None: ... - def move(self, item: _TreeviewItemId, parent: _TreeviewItemId, index: int) -> None: ... + def move(self, item: str, parent: str, index: int) -> None: ... reattach = move - def next(self, item: _TreeviewItemId) -> _TreeviewItemId | Literal[""]: ... - def parent(self, item: _TreeviewItemId) -> _TreeviewItemId: ... - def prev(self, item: _TreeviewItemId) -> _TreeviewItemId | Literal[""]: ... - def see(self, item: _TreeviewItemId) -> None: ... + def next(self, item: str) -> str: ... # returning empty string means last item + def parent(self, item: str) -> str: ... + def prev(self, item: str) -> str: ... # returning empty string means first item + def see(self, item: str) -> None: ... if sys.version_info >= (3, 8): def selection(self) -> Tuple[str, ...]: ... else: def selection(self, selop: Optional[Any] = ..., items: Optional[Any] = ...) -> Tuple[str, ...]: ... - def selection_set(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... - def selection_add(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... - def selection_remove(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... - def selection_toggle(self, items: _TreeviewItemId | tkinter._TkinterSequence[_TreeviewItemId]) -> None: ... + def selection_set(self, items: str | tkinter._TkinterSequence[str]) -> None: ... + def selection_add(self, items: str | tkinter._TkinterSequence[str]) -> None: ... + def selection_remove(self, items: str | tkinter._TkinterSequence[str]) -> None: ... + def selection_toggle(self, items: str | tkinter._TkinterSequence[str]) -> None: ... @overload - def set(self, item: _TreeviewItemId, column: None = ..., value: None = ...) -> dict[str, Any]: ... + def set(self, item: str, column: None = ..., value: None = ...) -> dict[str, Any]: ... @overload - def set(self, item: _TreeviewItemId, column: _TreeviewColumnId, value: None = ...) -> Any: ... + def set(self, item: str, column: _TreeviewColumnId, value: None = ...) -> Any: ... @overload - def set(self, item: _TreeviewItemId, column: _TreeviewColumnId, value: Any) -> Literal[""]: ... + def set(self, item: str, column: _TreeviewColumnId, value: Any) -> Literal[""]: ... # There's no tag_unbind() or 'add' argument for whatever reason. # Also, it's 'callback' instead of 'func' here. @overload @@ -1094,9 +1093,9 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): foreground: tkinter._Color = ..., ) -> _TreeviewTagDict | None: ... @overload - def tag_has(self, tagname: str, item: None = ...) -> Tuple[_TreeviewItemId, ...]: ... + def tag_has(self, tagname: str, item: None = ...) -> Tuple[str, ...]: ... @overload - def tag_has(self, tagname: str, item: _TreeviewItemId) -> bool: ... + def tag_has(self, tagname: str, item: str) -> bool: ... class LabeledScale(Frame): label: Any From 33847b975a2a0a264c115534648798fe4ee9e476 Mon Sep 17 00:00:00 2001 From: Akuli Date: Sun, 6 Jun 2021 18:41:51 +0300 Subject: [PATCH 8/8] relax type of tags --- stdlib/tkinter/ttk.pyi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/tkinter/ttk.pyi b/stdlib/tkinter/ttk.pyi index 2d3659cb916e..bbbe9e1ad441 100644 --- a/stdlib/tkinter/ttk.pyi +++ b/stdlib/tkinter/ttk.pyi @@ -1014,7 +1014,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): image: tkinter._ImageSpec = ..., values: tkinter._TkinterSequence[Any] = ..., open: bool = ..., - tags: tkinter._TkinterSequence[str] = ..., + tags: str | tkinter._TkinterSequence[str] = ..., ) -> str: ... @overload def item(self, item: str, option: Literal["text"]) -> str: ... @@ -1038,7 +1038,7 @@ class Treeview(Widget, tkinter.XView, tkinter.YView): image: tkinter._ImageSpec = ..., values: tkinter._TkinterSequence[Any] = ..., open: bool = ..., - tags: tkinter._TkinterSequence[str] = ..., + tags: str | tkinter._TkinterSequence[str] = ..., ) -> _TreeviewItemDict | None: ... def move(self, item: str, parent: str, index: int) -> None: ... reattach = move