-tkinter.ttk --- Tk のテーマ付きウィジェット
python
1
2import tkinter
3from tkinter import ttk
4
5root = tkinter.Tk()
6
7style = ttk.Style()
8style.theme_settings("default", {
9 "TCombobox": {
10 "configure": {"padding": 5},
11 "map": {
12 "background": [("active", "green2"),
13 ("!disabled", "green4")],
14 "fieldbackground": [("!disabled", "green3")],
15 "foreground": [("focus", "OliveDrab1"),
16 ("!disabled", "OliveDrab2")]
17 }
18 },
19})
20
21## (追記) 環境によってデフォルトのthemeが違う事があるので、明示的に指定
22style.theme_use("default")
23
24## Python document側の間違い?
25combo = ttk.Combobox(root)
26combo.pack()
27
28from pprint import pprint
29print(combo.winfo_class()) # (1)
30pprint(style.layout(combo.winfo_class())) # (2)
31pprint(combo.configure()) # (3)
32print(style.element_names()) # (4)
33print(style.map("TCombobox", "background")) # (5)
34
35root.mainloop()
緑色に変わっていないと、デフォルトのテーマが有効になっていないので注意。
# 1) combo.winfo_class()
'TCombobox'
# 2) style.layout(combo.winfo_class())
[('Combobox.field',
{'children': [('Combobox.downarrow', {'side': 'right', 'sticky': 'ns'}),
('Combobox.padding',
{'children': [('Combobox.textarea', {'sticky': 'nswe'})],
'expand': '1',
'sticky': 'nswe'})],
'sticky': 'nswe'})]
# 3) combo.configure()
{'background': ('background', 'windowColor', 'WindowColor', '', ''),
'class': ('class', '', '', '', ''),
'cursor': ('cursor', 'cursor', 'Cursor', '', ''),
(省略)
# 4) style.element_names()
('label', '', 'focus', 'treearea', 'separator', 'image', 'arrow', 'downarrow',
'Menubutton.indicator', 'Treeitem.row', 'vsash', 'text', 'sizegrip', 'indicator',
'Treeheading.cell', 'leftarrow', 'border', 'Radiobutton.indicator', 'hsash', 'vseparator',
'fill', 'thumb', 'background', 'uparrow', 'hseparator', 'trough', 'rightarrow',
'Treeitem.indicator', 'slider', 'field', 'pbar', 'Checkbutton.indicator', 'textarea',
'client', 'tab', 'padding')
# 5) style.map("TCombobox", "background")
[('active', 'green2'), ('!disabled', 'green4')]
各関数の説明はドキュメントを参照してください。
注意点2箇所
- theme_use しないと win10では適応されてませんでした。
combo = tk.Combobox().pack()
について、
python
1# 誤り。comboは None になります。
2combo = ttk.Combobox().pack()
3
4# OK. IDLE 等でも使われているコード。
5# ウィジェットのリソースを管理するのはPythonではないので、
6# bind()等の必要がない場合は、変数への代入は省略できます。
7ttk.Combobox().pack()
8
9# nameを付けると、生成時にPythonの変数に入れなくても、
10# 後から nametowidget() で問い合わせることが出来ます。
11
12ttk.Combobox(name="aaa").pack()
13
14combo = root.nametowidget(".aaa")
15
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。