# TinUIPicker

为[TinUI](https://github.com/Smart-Space/TinUI)提供滚动选择器功能控件，相比于原版`picker`，TinUIPicker套件加入了日期选择和时间选择的功能。

<img src="./screenshots/1.png" width="500" />

---

## TinUIDatePicker

> [!important]
>
> TinUIDatePicker原始框架代码由**Gemini3**根据TinUI的`picker`源码修改而来，之后我才进行了交互优化和样式优化，AI代码部分未完全审查。

```python
TinUIDatePicker(
    tinui, pos, font=("微软雅黑", 10), command=None, 
    year_range=(2000, 2030), now=datetime.today(), **kwargs
)

# 默认样式表
self.cfg = {
    "fg": kwargs.get("fg", "#1b1b1b"),
    "bg": kwargs.get("bg", "#fbfbfb"),
    "outline": kwargs.get("outline", "#ececec"),
    "activefg": kwargs.get("activefg", "#1b1b1b"),
    "activebg": kwargs.get("activebg", "#f6f6f6"),
    "onbg": kwargs.get("onbg", "#3748d9"),
    "onfg": kwargs.get("onfg", "#eaecfb"),
    "buttonfg": kwargs.get("buttonfg", "#1a1a1a"),
    "buttonbg": kwargs.get("buttonbg", "#f9f9f9"),
    "buttonactivefg": kwargs.get("buttonactivefg", "#1a1a1a"),
    "buttonactivebg": kwargs.get("buttonactivebg", "#f3f3f3"),
    "buttononfg": kwargs.get("buttononfg", "#5d5d5d"),
    "buttononbg": kwargs.get("buttononbg", "#f5f5f5"),
}
```

> `command`接收一个形如`2026-01-30`的字符串参数。

**set_date(year:int=None, month:int=None, day:int=None)**

设置年-月-日，若为`None`则不变。

---

## TinUITimePicker

```python
TinUITimePicker(
    tinui, pos, font=("微软雅黑", 10),
    is_24h=True, show_sec=True,
    now = datetime.now(),
    command=None, anchor='nw', **kwargs
)
```

默认样式同`TinUIDatePicker`

- is_24h-是否是24小时制，如果`否`，则开头显示`AM`和`PM`选项
- show_sec-是否可选`秒`

> `command`接收一个形如`16:00:09`或者`PM 04:00:09`的字符串参数。若`show_sec`为`False`，则不回传`秒`。

**set_time(hour:int=None, minute:int=None, second:int=None)**

设置时-分-秒，若为`None`则不变。

---

## 样式表

TinUIPicker提供了`pickerlight`和`pickerdark`两种配色样式表，均来自于TinUI明暗配色。

<img src="./screenshots/2.png" width="300" /><img src="./screenshots/3.png" width="250" />

---

## 面板布局

通过`TinUIDatePicker.uid`获取TinUIDatePicker的控件标识符。时间选择器类似。

面板布局行为与`picker`一致。

---

## 使用示例

```python
from datetime import datetime
from tkinter import Tk

from tinui import BasicTinUI, ExpandPanel, HorizonPanel
from tinuipicker.datepicker import TinUIDatePicker
from tinuipicker.timepicker import TinUITimePicker
from tinuipicker import pickerlight, pickerdark

root = Tk()
root.geometry('400x400')

ui = BasicTinUI(root)
ui.pack(fill='both', expand=True)

tdp = TinUIDatePicker(ui, (10,10), font=("Segoe UI", 12), now=datetime(2026, 2, 19), command=print, anchor='center', **pickerlight)
tdp.set_date(2016, 10)

ttp = TinUITimePicker(ui, (10,10), font=("Segoe UI", 12), is_24h=False, show_sec=False, now=datetime(1,1,1,6,23,45), command=print, anchor='center', **pickerdark)
ttp.set_time(16,0,19)

rp = ExpandPanel(ui)
hp = HorizonPanel(ui)
rp.set_child(hp)

ep = ExpandPanel(ui, bg='#f3f3f3')
hp.add_child(ep, weight=1)
ep.set_child(tdp.uid)

ep2 = ExpandPanel(ui, bg='#202020')
hp.add_child(ep2, weight=1)
ep2.set_child(ttp.uid)

def update(e):
    rp.update_layout(5,5,e.width-5,e.height-5)
ui.bind('<Configure>',update)

root.mainloop()
```

