在本文中,將介紹Tkinter.ttk
主題小部件,是常規(guī) Tkinter 小部件的升級版本。。
Tkinter 有兩種小部件:經(jīng)典小部件、主題小部件。Tkinter 于 1991 年推出了經(jīng)典小部件,2007 年在 Tk8.5 中添加新式的主題小部件。主題小部件更新了部分經(jīng)典小部件,并增加了部分新的小部件。
要使用tkinter.ttk
主題小部件,需要使用以下語句進行導入
import tkinter as tk
from tkinter import ttk
Tk 主題小部件?改進了樣式和主題?,總共包含 18 種小部件 ,其中十二種已存在于 tkinter 中:
新增六種小部件:
Tkinter 小部件具有更基本和傳統(tǒng)的外觀,而 Ttk 小部件提供更現(xiàn)代的外觀,可以更好地適應各種新的操作系統(tǒng)。
ttk 提供了增強的主題選項,允許開發(fā)人員使用各種預定義的樣式和主題。提升了性能,提供了更好的用戶體驗。
Tkinter 小部件更適合初學者使用,Ttk 小部件引入了更多的復雜特性,在處理樣式和主題時,提供了更大的靈活性。
Tkinter 小部件與Tkinter.Ttk 小部件的主要區(qū)別:
Tkinter 小部件與 Ttk 小部件 基本外觀對比
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Ttk 主題小部件演示')
left_frame = tk.Frame(root, width=300, height=400)
left_frame.pack(side='left', fill='both', padx=10, pady=5, expand=True)
right_frame = tk.Frame(root, width=300, height=400)
right_frame.pack(side='right', fill='both', padx=10, pady=5, expand=True)
def callback():
pass
label = tk.Label(left_frame, text='標簽')
label.pack(pady=5)
label = ttk.Label(right_frame, text='ttk標簽')
label.pack(pady=5)
button = tk.Button(left_frame, text="按鈕", command=callback)
button.pack(pady=5)
button = ttk.Button(right_frame, text="ttk按鈕", command=callback)
button.pack(pady=5)
entry1 = tk.Entry(left_frame)
entry1.pack(pady=5)
entry1.insert(0, "單行文本框")
entry2 = ttk.Entry(right_frame)
entry2.pack(pady=5)
entry2.insert(0, "ttk單行文本框")
frame1 = tk.LabelFrame(left_frame, text='復選框')
frame1.pack(pady=5)
cb1 = tk.Checkbutton(frame1, text='Number 1')
cb1.pack()
cb2 = tk.Checkbutton(frame1, text='Number 2')import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Ttk 主題小部件演示')
style=ttk.Style()
style.theme_use('classic')
style.configure("design.TLabel",background="green",foreground="white",font="Arial 16 bold", padding=20)
style.configure("design.TButton",background="red",foreground="white",font="Arial 16 bold", padding=20)
label=ttk.Label(root,text = f"Ttk 標簽", style = "design.TLabel")
label.pack(pady=10)
button=ttk.Button(root,text = "Ttk 按鈕", style = "design.TButton")
button.pack(pady=10)
root.mainloop()
cb2.pack()
frame2 = ttk.LabelFrame(right_frame, text='ttk復選框')
frame2.pack(pady=5)
cb3 = ttk.Checkbutton(frame2, text='Number 3')
cb3.pack()
cb4 = ttk.Checkbutton(frame2, text='Number 4')
cb4.pack()
frame3 = tk.LabelFrame(left_frame, text='單選按鈕')
frame3.pack(pady=5)
r1 = tk.Radiobutton(frame3,text="option 1", value=1)
r1.pack()
r2 = tk.Radiobutton(frame3,text="option 2", value=2)
r2.pack()
frame4 = ttk.LabelFrame(right_frame, text='ttk單選按鈕')
frame4.pack(pady=5)
r1 = ttk.Radiobutton(frame4,text="option 1", value=1)
r1.pack()
r2 = ttk.Radiobutton(frame4,text="option 2", value=2)
r2.pack()
scale1 = tk.Scale(left_frame, from_=0, to=100, orient='horizontal', length=100)
scale1.pack(pady=5)
scale2 = ttk.Scale(right_frame, from_=0, to=100, orient='horizontal', length=100)
scale2.pack(pady=5)
menubttn = tk.Menubutton(left_frame, text = "菜單按鈕", relief = tk.RAISED)
menu = tk.Menu(menubttn, tearoff = 0)
menu.add_checkbutton(label = "Python")
menu.add_checkbutton(label = "Java")
menubttn["menu"] = menu
menubttn.pack(pady=5)
menubttn = ttk.Menubutton(right_frame, text = "ttk菜單按鈕")
menu = tk.Menu(menubttn, tearoff = 0)
menu.add_checkbutton(label = "Python")
menu.add_checkbutton(label = "Java")
menubttn["menu"] = menu
menubttn.pack(pady=5)
spinbox1 = tk.Spinbox(left_frame, from_=0, to=10, wrap=True)
spinbox1.pack()
spinbox2 = ttk.Spinbox(right_frame, from_=0, to=10, wrap=True)
spinbox2.pack()
root.mainloop()
Ttk 主題
Ttk 可以使用theme_names()
方法,獲取所有可用主題的列表。使用theme_use()
方法,應用主題。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Ttk 主題小部件演示')
text = tk.StringVar()
style = ttk.Style(root)
def change_theme():
style.theme_use(selected_theme.get())
def callback():
pass
left_frame = tk.Frame(root, width=300, height=400)
left_frame.pack(side='left', fill='both', padx=10, pady=5, expand=True)
right_frame = tk.Frame(root, width=300, height=400)
right_frame.pack(side='right', fill='both', padx=10, pady=5, expand=True)
selected_theme = tk.StringVar()
theme_frame = ttk.LabelFrame(left_frame, text='Themes')
theme_frame.pack(padx=10, pady=10, ipadx=20, ipady=20)
for theme_name in style.theme_names():
rb = ttk.Radiobutton(
theme_frame,
text=theme_name,
value=theme_name,
variable=selected_theme,
command=change_theme)
rb.pack(expand=True, fill='both')
label = ttk.Label(right_frame, text='ttk標簽')
label.pack(pady=5)
button = ttk.Button(right_frame, text="ttk按鈕", command=callback)
button.pack(pady=5)
entry = ttk.Entry(right_frame, textvariable=text, text="文本框")
entry.pack(pady=5)
entry.insert(0, "ttk單行文本框")
frame2 = ttk.LabelFrame(right_frame, text='ttk復選框')
frame2.pack(pady=5)
cb3 = ttk.Checkbutton(frame2, text='Number 3')
cb3.pack()
cb4 = ttk.Checkbutton(frame2, text='Number 4')
cb4.pack()
frame4 = ttk.LabelFrame(right_frame, text='ttk單選按鈕')
frame4.pack(pady=5)
r1 = ttk.Radiobutton(frame4,text="option 1", value=1)
r1.pack()
r2 = ttk.Radiobutton(frame4,text="option 2", value=2)
r2.pack()
scale2 = ttk.Scale(right_frame, from_=0, to=100, orient='horizontal', length=100)
scale2.pack(pady=5)
menubttn = ttk.Menubutton(right_frame, text = "ttk菜單按鈕")
menu = tk.Menu(menubttn, tearoff = 0)
menu.add_checkbutton(label = "Python")
menu.add_checkbutton(label = "Java")
menubttn["menu"] = menu
menubttn.pack(pady=5)
spinbox2 = ttk.Spinbox(right_frame, from_=0, to=10, wrap=True)
spinbox2.pack(pady=5)
root.mainloop()
Ttk 樣式
Ttk 中的每個小部件都有一個默認樣式,該樣式包含了一些自定義設置。
| |
---|
Button | TButton |
Checkbutton | TCheckbutton |
Combobox | TCombobox |
Entry | TEntry |
Frame | TFrame |
Label | TLabel |
LabelFrame | TLabelFrame |
Menubutton | TMenubutton |
Notebook | TNotebook |
PanedWindow | TPanedwindow |
Progressbar | Horizontal.TProgressbar |
Radiobutton | TRadiobutton |
Scale | Horizontal.TScale |
Scrollbar | Horizontal.TScrollbar |
Separator | TSeparator |
Sizegrip | TSizegrip |
Treeview | Treeview |
每個樣式都有一組定義小部件外觀的選項。要修改樣式,請使用以下方法:
style = ttk.Style()
style.configure(style_name, **options)
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Ttk 主題小部件演示')
style=ttk.Style()
style.theme_use('classic')
style.configure("design.TLabel",background="green",foreground="white",font="Arial 16 bold", padding=20)
style.configure("design.TButton",background="red",foreground="white",font="Arial 16 bold", padding=20)
label=ttk.Label(root,text = f"Ttk 標簽", style = "design.TLabel")
label.pack(pady=10)
button=ttk.Button(root,text = "Ttk 按鈕", style = "design.TButton")
button.pack(pady=10)
root.mainloop()
Ttk 樣式的動態(tài)更改
使用 Ttk 樣式的map()
方法根據(jù)特定事件動態(tài)更改小組件的外觀。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
root.geometry('600x400+200+200')
root.title('Ttk 主題小部件演示')
style = ttk.Style()
style.configure('TButton', font=('Helvetica', 16))
style.map('TButton', foreground=[('pressed', 'blue'), ('active', 'red')])
button = ttk.Button(root, text='按鈕')
button.pack(pady=20)
button = ttk.Button(root, text='按鈕')
button.pack(pady=20)
root.mainloop()
在以上示例中,當將鼠標移動到按鈕上時,其文本顏色將變?yōu)榧t色。當單擊或按下按鈕時,其文本顏色將變?yōu)樗{色。