Tkinter 主題

Salman Mehmood 2022年5月17日
Tkinter 主題

當前的 Tk 元件主題功能是新元件集最強大和令人興奮的功能之一。但是,這也是最令人困惑的事情之一。

本教程演示了主題的樣式,它控制了元件在 Tkinter GUI 中的外觀。換句話說,我們可以說按鈕外觀和其他元件應該是什麼樣子。

Tkinter GUI 中的主題

這是一組樣式,用於定義 GUI 中的每個元件的外觀。主題修改增強了 GUI 外觀,與普通的 Tkinter GUI 外觀不同。

然而,在它被刪除之前,很少有應用程式會從可能不同的運動、遊戲或教育計劃等不斷變化的主題中受益。

不同平臺的主題可能不同,尤其是 macOS 和 Windows。Tkinter 允許你將當前主題更改為另一個主題。

如果你將當前主題更改為新主題,Tkinter 會將樣式應用於所有 ttk 元件。我們需要建立一個 ttk.Style 類的例項來獲取主題。

style = ttk.Style(window)

Style 幫助使用者避免冗餘和重複的程式碼。

如果你的應用中有 20 個按鈕元件,則建立一個 style 物件,那麼你無需在建立元件時重複外觀細節。這樣,元件看起來很時尚。

由於 style 將有關外觀的所有資訊收集在一個位置,因此其他元件的按鈕樣式和樣式可以共享共同特徵,從而提高一致性和重用性。

我們需要使用 theme_use() 方法獲取可用主題並列印可用主題。

print(style.theme_names())

輸出:

('winnative', 'clam', 'alt', 'default', 'classic', 'vista', 'xpnative')

如果我們需要獲取當前主題,我們可以使用 theme_use() 方法來使用它。

style.theme_use()

我們可以使用 selected_theme 類選擇其他主題來使用不同的主題; get() 方法將有助於獲得該主題。

style.theme_use(window.selected_theme.get())

我們在這個迴圈中生成了多個 Radiobutton,它們儲存主題名稱並在每次迭代時獲取單獨的值。

for theme_name in style.theme_names():
    # Create a bulk of radio buttons using loop
    radio_buttons = ttk.Radiobutton(
        theme_frame,
        text=theme_name,
        value=theme_name,
        variable=window.selected_theme,
        command=theme_changer)
    radio_buttons.pack(expand=True, fill='both')

command 選項持有 theme_changer 函式以在使用者選擇單選按鈕時呼叫。

此函式將使用 eRadiobutton 元件選項中傳遞的 StringVar() 類更改主題。

def theme_changer():
    # Change  theme
    style.theme_use(window.selected_theme.get())

完整原始碼:

from tkinter import *

from tkinter import ttk
# Create GUI window
window=Tk()

window.title('Delftstack')
window.geometry('500x400')
# create style object
style = ttk.Style(window)

def theme_changer():
    # Change  theme
    style.theme_use(window.selected_theme.get())


label = ttk.Label(window, text='Name:')
label.grid(column=0, row=0, padx=10, pady=10,  sticky='w')

entry = ttk.Entry(window)
entry.grid(column=1, row=0, padx=10, pady=10,  sticky='w')

button = ttk.Button(window, text='press')
button.grid(column=2, row=0, padx=10, pady=10,  sticky='w')

window.selected_theme = StringVar()
theme_frame = ttk.LabelFrame(window, text='Themes')
theme_frame.grid(padx=10, pady=10, ipadx=20, ipady=20, sticky='w')

for theme_name in style.theme_names():
    # Create a bulk of radio buttons using loop
    radio_buttons = ttk.Radiobutton(
        theme_frame,
        text=theme_name,
        value=theme_name,
        variable=window.selected_theme,
        command=theme_changer)
    radio_buttons.pack(expand=True, fill='both')

window.mainloop()

print(style.theme_names())

輸出:

在 Tkinter GUI 中選擇一個主題

點選這裡閱讀更多關於 Tkinter 主題的資訊。

Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn