Skip to content

More types for tkinter.Treeview #5584

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jun 6, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
198 changes: 168 additions & 30 deletions stdlib/tkinter/ttk.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -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] = ...): ...
Expand Down Expand Up @@ -871,6 +871,36 @@ 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

class _TreeviewColumnDict(TypedDict):
width: int
minwidth: int
stretch: bool # actually 0 or 1
anchor: tkinter._Anchor
id: str

_TreeviewColumnId = Union[int, str] # manual page: "COLUMN IDENTIFIERS"

class Treeview(Widget, tkinter.XView, tkinter.YView):
def __init__(
self,
Expand Down Expand Up @@ -914,38 +944,122 @@ 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 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 bbox(self, item, column: _TreeviewColumnId | None = ...) -> Tuple[int, int, int, int] | Literal[""]: ... # type: ignore
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
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: str) -> None: ...
def detach(self, *items: str) -> None: ...
def exists(self, item: str) -> bool: ...
@overload # type: ignore
def focus(self, item: None = ...) -> str: ... # can return empty string
@overload
def focus(self, item: str) -> 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] = ...,
) -> _TreeviewHeaderDict | None: ...
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) -> 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: str) -> int: ...
def insert(
self,
parent: str,
index: int | Literal["end"],
iid: str | None = ...,
*,
id: str = ..., # same as iid
text: str = ...,
image: tkinter._ImageSpec = ...,
values: tkinter._TkinterSequence[Any] = ...,
open: bool = ...,
tags: str | tkinter._TkinterSequence[str] = ...,
) -> str: ...
@overload
def item(self, item: str, option: Literal["text"]) -> str: ...
@overload
def item(self, item: str, option: Literal["image"]) -> Literal[""] | Tuple[str]: ...
@overload
def item(self, item: str, option: Literal["values"]) -> Literal[""] | Tuple[Any, ...]: ...
@overload
def item(self, item: str, option: Literal["open"]) -> bool: ... # actually 0 or 1
@overload
def item(self, item: str, option: Literal["tags"]) -> Literal[""] | Tuple[str, ...]: ...
@overload
def item(self, item: str, option: str) -> Any: ...
@overload
def item(
self,
item: str,
option: None = ...,
*,
text: str = ...,
image: tkinter._ImageSpec = ...,
values: tkinter._TkinterSequence[Any] = ...,
open: bool = ...,
tags: str | tkinter._TkinterSequence[str] = ...,
) -> _TreeviewItemDict | None: ...
def move(self, item: str, parent: str, index: int) -> None: ...
reattach = move
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): ...
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: 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: str, column: None = ..., value: None = ...) -> dict[str, Any]: ...
@overload
def set(self, item: str, column: _TreeviewColumnId, value: None = ...) -> Any: ...
@overload
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
Expand All @@ -956,8 +1070,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: 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,
option: None = ...,
*,
text: str = ...,
image: tkinter._ImageSpec = ...,
anchor: tkinter._Anchor = ...,
background: tkinter._Color = ...,
foreground: tkinter._Color = ...,
) -> _TreeviewTagDict | None: ...
@overload
def tag_has(self, tagname: str, item: None = ...) -> Tuple[str, ...]: ...
@overload
def tag_has(self, tagname: str, item: str) -> bool: ...

class LabeledScale(Frame):
label: Any
Expand Down